ホームページ >バックエンド開発 >C++ >HTTP GET リクエストで URL エンコーディングのスラッシュが二重スラッシュになるのはなぜですか? これを修正するにはどうすればよいですか?

HTTP GET リクエストで URL エンコーディングのスラッシュが二重スラッシュになるのはなぜですか? これを修正するにはどうすればよいですか?

DDD
DDDオリジナル
2024-12-31 15:51:09601ブラウズ

Why Does URL-Encoding Slashes in HTTP GET Requests Result in Double Slashes, and How Can This Be Fixed?

HTTP GET における URL エンコードされたスラッシュの謎を明らかにする

HTTP GET 経由でデータを取得する探求において、開発者はしばしば課題に遭遇します。 URL エンコードされたスラッシュ (/) の送信。ただし、この特定の文字を送信しようとすると、よくある誤解が生じます。

コード例に示されているように、URL 文字列に / を含めるだけでは不十分です。代わりに、エンコードされたスラッシュが 2 つのスラッシュとして誤って解釈され、リクエストが次のように送信されます。

GET // HTTP/1.1
Host: example.com
Connection: Keep-Alive

この動作は、「/」の代わりに実際の / 文字の送信を義務付ける OCSP プロトコルに違反します。

型破りな回り道

これに対処するにはこの問題については、Uri オブジェクトを直接変更するという回避策が登場しました。 PathAndQuery フラグを強制的にオーバーライドすることで、フレームワークを騙して意図した URL エンコーディングを認識させます。

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);
}

この方法は理想とは程遠いですが、開発者は URL エンコードされたスラッシュを使用して HTTP GET リクエストを送信できます。 OCSP などの特定のプロトコルの要件。

以上がHTTP GET リクエストで URL エンコーディングのスラッシュが二重スラッシュになるのはなぜですか? これを修正するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。