2013-08-21 2 views
2

Я работаю над модулем типа OAuth. В этом я имею набор URL-адресов, которые называются URL-адресами «Белый список». Я должен проверить, соответствует ли 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 быть частью сравнения. Обратите внимание, что для определения компонентов URL-адреса требуется побитовое перечисление UriComponents. Таким образом, вы могли бы заменить большую часть кода на Uri.Compare, не сравнивая путь, а затем запускать путь AND AND.

Так весь ваш код может быть заменен на что-то вроде:

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 будет соответствовать точному адресу. Напр. он вернет 0, если URL точно совпадает. Я не хочу этого. то, что я хочу, это 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

Смежные вопросы