Surmonter le dilemme de codage d'URL Slash lors des requêtes GET
Dans le but d'envoyer une requête HTTP GET à une URL contenant un pourcentage codé barre oblique (/), telle que "http://example.com//", une approche courante consiste à utiliser la classe WebClient comme suit :
using (WebClient webClient = new WebClient()) { webClient.DownloadData("http://example.com/%2F"); }
Cependant, cette méthode aboutit à un résultat inattendu. Le caractère slash est transformé en une barre oblique supplémentaire lors de la transmission, ce qui entraîne l'envoi de la requête suivante :
GET // HTTP/1.1 Host: example.com Connection: Keep-Alive
Ce problème survient lors de l'utilisation d'OCSP sur HTTP/GET, qui nécessite la transmission d'un véritable / au lieu de '/ ' pour garantir le respect du protocole.
Une solution potentielle
Bien qu'il ne soit pas idéal, le code suivant L'extrait présente une solution de contournement au problème :
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); }
Cette solution de contournement implique de modifier les indicateurs internes de l'objet Uri pour forcer CanonicalPathAndQuery, garantissant ainsi que le caractère barre oblique est préservé pendant la transmission.
Avertissement
Il est important de noter que cette approche n'est pas garantie d'être compatible avec les futures versions de le cadre. Procédez toujours avec prudence lorsque vous modifiez le comportement interne d'une classe.
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!