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 も比較の一部にする必要があります。URL のどのコンポーネントを比較するかを定義するには、ビットごとの列挙型 UriComponents が必要であることに注意してください。したがって、パスを比較しない Uri.Compare でコードの大部分を置き換えてから、startsWith パスを 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

于 2013-08-21T11:30:29.447 に答える