我正在开发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
答案 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