Maison >développement back-end >C++ >Pourquoi les barres obliques de codage d'URL dans les requêtes HTTP GET entraînent-elles des doubles barres obliques et comment cela peut-il être corrigé ?

Pourquoi les barres obliques de codage d'URL dans les requêtes HTTP GET entraînent-elles des doubles barres obliques et comment cela peut-il être corrigé ?

DDD
DDDoriginal
2024-12-31 15:51:09599parcourir

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

Dévoilement du mystère des barres obliques codées en URL dans HTTP GET

Dans la quête de récupération de données via HTTP GET, les développeurs sont souvent confrontés au défi d'envoyer des barres obliques codées en URL (/). Cependant, une idée fausse courante surgit lorsque l'on tente de transmettre ce caractère spécifique.

Comme illustré dans l'exemple de code, il ne suffit pas d'inclure simplement le / dans la chaîne de l'URL. Au lieu de cela, la barre oblique codée est interprétée à tort comme deux barres obliques, ce qui entraîne l'envoi de la requête comme :

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

Ce comportement viole le protocole OCSP, qui exige la transmission de caractères / réels au lieu de « / ».

Un détour par le non conventionnel

Pour répondre à cette problématique, un Une solution de contournement a émergé qui utilise une modification directe de l'objet Uri. En remplaçant de force les indicateurs PathAndQuery, nous trompons le framework pour qu'il reconnaisse le codage d'URL prévu.

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

Bien que cette méthode soit loin d'être idéale, elle permet aux développeurs d'envoyer des requêtes HTTP GET avec des barres obliques codées en URL, ce qui satisfait les exigences de protocoles spécifiques comme OCSP.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn