回调URL匹配逻辑

时间:2013-08-21 11:19:53

标签: c# .net http url uri

我正在开发OAuth类型模块。在这里我有一组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

1 个答案:

答案 0 :(得分:0)

您应该查看Uri.Compare

,而不是编写所有这些代码

但是你也希望path.startswith成为比较的一部分。请注意,它需要一个按位枚举的UriComponents来定义要比较的url的哪些组件。所以你可以用Uri替换大部分代码。比较不比较路径然后有一个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