ホームページ > バックエンド開発 > C++ > URL エンコードされた HTTP GET リクエストでリテラルのスラッシュを保持するにはどうすればよいですか?

URL エンコードされた HTTP GET リクエストでリテラルのスラッシュを保持するにはどうすればよいですか?

Susan Sarandon
リリース: 2024-12-31 11:19:14
オリジナル
849 人が閲覧しました

How Can I Preserve Literal Slashes in URL-Encoded HTTP GET Requests?

URL のエンコード: HTTP GET でのリテラル スラッシュの保持

HTTP GET リクエストでは、URL エンコードは、次のような特殊文字を送信するために重要です。標準の文字セットの一部ではありません。ただし、URL パスにスラッシュ (/) が含まれる場合、特定の GET 実装はそれを二重スラッシュ (//) 構文に自動的に変換します。これは、URL エンコードされたスラッシュ文字を HTTP/GET 経由で OCSP などのプロトコルに準拠するために不可欠であるため、送信する場合に問題となる可能性があります。

次のコード スニペットは、この問題を示しています。

using (WebClient webClient = new WebClient())
{
  webClient.DownloadData("http://example.com/%2F");
}
ログイン後にコピー

ただし、サーバーに送信される実際のリクエストは次のとおりです。

GET // HTTP/1.1
Host: example.com
Connection: Keep-Alive
ログイン後にコピー

HTTP GET でリテラルのスラッシュを保持するには、カスタム ソリューションが必要です。以下は、パスとクエリを保持するように Uri オブジェクトを変更するコード スニペットです:

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 オブジェクトを変更すると、パスは強制的に元の状態に維持され、リテラルのスラッシュが確実に保持されます。 GETリクエスト。このソリューションにより、URL エンコードされたスラッシュを必要とするプロトコルの準拠した実装が可能になります。

以上がURL エンコードされた HTTP GET リクエストでリテラルのスラッシュを保持するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート