GET リクエスト中のスラッシュ URL エンコーディングのジレンマを克服する
パーセントエンコードされた URL を含む URL に HTTP GET リクエストを送信しようとしました。 「http://example.com//」などのスラッシュ (/) を使用する場合の一般的なアプローチは、WebClient クラスを次のように利用することです。
using (WebClient webClient = new WebClient()) { webClient.DownloadData("http://example.com/%2F"); }
ただし、この方法では予期しない結果が生じます。スラッシュ文字は送信中に余分なスラッシュに変換され、次のリクエストが送信されます:
GET // HTTP/1.1 Host: example.com Connection: Keep-Alive
この問題は、HTTP/GET 経由で OCSP を使用するときに発生し、'/ ではなく実際の / を送信する必要があります。 ' プロトコルへの準拠を保証します。
潜在的な解決策
理想的ではありませんが、以下はコード スニペットは、この問題の回避策を示しています。
Uri uri = new Uri("http://example.com/%2F"); ForceCanonicalPathAndQuery(uri); using (WebClient webClient = new WebClient()) { webClient.DownloadData(uri); } void ForceCanonicalPathAndQuery(Uri uri){ string paq = uri.PathAndQuery; // need to access PathAndQuery FieldInfo flagsFieldInfo = typeof(Uri).GetField("m_Flags", BindingFlags.Instance | BindingFlags.NonPublic); ulong flags = (ulong) flagsFieldInfo.GetValue(uri); flags &= ~((ulong) 0x30); // Flags.PathNotCanonical|Flags.QueryNotCanonical flagsFieldInfo.SetValue(uri, flags); }
この回避策には、Uri オブジェクトの内部フラグを変更して CanonicalPathAndQuery を強制し、送信中にスラッシュ文字が保持されるようにすることが含まれます。
免責事項
このアプローチは将来のバージョンとの互換性が保証されていないことに注意することが重要です。フレームワークのバージョン。内部クラスの動作を変更する場合は、常に注意して作業を行ってください。
以上がURL エンコーディングによって GET リクエスト内のパーセントエンコードされたスラッシュが変更されるのを防ぐにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。