2013-08-21 63 views
2

我正在使用OAuth類型模塊。在這裏,我有一組被稱爲白名單網址的網址。我必須檢查指定的回調URL是否與集合中的任何這些URL匹配。回調URL匹配邏輯

我寫了下面的代碼。請讓我知道我做的是否正確,或者我是否缺少一些步驟。另外,如果我想單元測試這些方法,請讓我知道是否需要任何重構。

的代碼是:

public class ValidateURLs 
{ 
    public bool MatchRedirectUrl(string requestUrl, IList<string> urlCollection) 
    { 
     var requestUri = new Uri(requestUrl); 
     foreach (var url in urlCollection) 
     { 
      var matchUri = new Uri(url); 
      if (IsDomainMatching(requestUri, matchUri)) 
      { 
       if (IsPortMatch(requestUri, matchUri)) 
       { 
        if (IsPathMatch(requestUri, matchUri)) 
         return true; 
        else 
         return false; 
       } 
      } 
     } 

     return false; 
    } 

    private bool IsDomainMatching(Uri url1, Uri url2) 
    { 
     var result = String.Compare(url1.Host, url2.Host); 
     if (result == 0) 
      return true; 
     else 
      return false; 
    } 

    private bool IsPortMatch(Uri url1, Uri url2) 
    { 
     if (url1.Port == url2.Port) 
      return true; 

     return false; 
    } 

    private bool IsPathMatch(Uri url1, Uri url2) 
    { 
     return (url1.PathAndQuery.StartsWith(url2.PathAndQuery) || url2.PathAndQuery.StartsWith(url1.PathAndQuery)); 
    } 
} 

預先感謝。

問候, Suyog

回答

0

而不是寫所有這些代碼,你應該看看Uri.Compare

但你也想path.startswith成爲比較的一部分。請注意,它需要按位枚舉UriComponents來定義要比較的URL的哪些組件。所以你可以用Uri.Compare替換大部分代碼,不比較路徑,然後有一個startsWith路徑ANDed。

Uri.Compare(uri1, uri2, UriComponents.HostAndPort, ...) == 0 && 
(url1.PathAndQueryStartsWith(url2.PathAndQuery) || url.PathAndQueryStartsWith(...)); 

在一個側面說明,代碼以這種形式:

所以所有的代碼可能會喜歡的東西來代替

var result = String.Compare(url1.Host, url2.Host); 
    if (result == 0) 
     return true; 
    else 
     return false; 

可以簡單地寫爲:

return String.Compare(url1.Host, url2.Host) == 0; 

您還應該對不區分大小寫進行比較:StringComparison.OrdinalIgnoreCase

+0

Uri.Compare將匹配確切的Url。對於例如如果url完全匹配,它將返回0。我不想要這個。我想要的是http://foo.com/a/b應該返回一個匹配,如果我將它與http://foo.com/a進行比較,或反之亦然 –

+0

它需要UriComponents按位枚舉來定義uri的哪些組件比較:http://msdn.microsoft.com/en-us/library/7767559y.aspx – bryanmac

+0

所以你使用Uri.Compare然後進行後續的路徑比較。我會更新。 – bryanmac