2

我正在开发 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));
    }
}

提前致谢。

问候, 苏约格

4

1 回答 1

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

于 2013-08-21T11:30:29.447 回答