Obtenir une URL avec un slash encodé
je veux envoyer un GET HTTP à http://example.com/%2F
. Ma première supposition serait quelque chose comme ceci:
using (WebClient webClient = new WebClient())
{
webClient.DownloadData("http://example.com/%2F");
}
malheureusement, je peux voir que ce qui est réellement envoyé sur le fil est:
GET // HTTP/1.1
Host: example.com
Connection: Keep-Alive
So http://example.com/%2F se traduit par http://example.com / / avant sa transmission.
Est-il un moyen d'envoyer cette demande?
le protocole OCSP exige l'envoi de l'encodage url d'un encodage base-64-lors de L'utilisation D'OCSP sur HTTP/GET, il est donc nécessaire d'envoyer un %2F réel plutôt qu'un '/' pour être compatible.
EDIT:
Voici la partie pertinente de la norme du protocole OCSP ( RFC 2560 Annexe A. 1.1):
une requête OCSP utilisant la méthode GET est construite comme suit:
GET {url}/{url-encodage de l'encodage base 64 de la DER d'encodage de la OCSPRequest}
je suis très ouvert à d'autres lectures, mais je ne vois pas quoi d'autre pourrait être destiné.
4 réponses
par défaut, la classe Uri
ne permettra pas un caractère /
échappé ( %2f
) dans un URI (même si cela semble légal dans ma lecture de RFC 3986 ).
Uri uri = new Uri("http://example.com/%2F");
Console.WriteLine(uri.AbsoluteUri); // prints: http://example.com//
(Note: ne pas utiliser l'Uri.ToString pour imprimer les Uri.)
selon le rapport de bogue pour ce numéro sur Microsoft Connect, ce comportement est par conception, mais vous pouvez travailler en ajoutant ce qui suit à votre application.config ou web.fichier de configuration:
<uri>
<schemeSettings>
<add name="http" genericUriParserOptions="DontUnescapePathDotsAndSlashes" />
</schemeSettings>
</uri>
(reposté de https://stackoverflow.com/a/10415482 parce que c'est la façon" officielle " d'éviter ce bug sans utiliser la réflexion pour modifier les champs privés.)
Edit: le rapport de bogue de Connect N'est plus visible, mais la documentation pour <schemeSettings>
recommande cette approche pour permettre les caractères /
échappés dans URIs. Remarque (selon l'article) qu'il peut y avoir des implications en matière de sécurité pour les composants qui ne gèrent pas échappé barres obliques correctement.
c'est un hack terrible, lié à être incompatible avec les versions futures du cadre et ainsi de suite.
mais ça marche!
(sur ma machine...)
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);
}
mise à Jour sur ce point: On dirait le comportement par défaut de la classe Uri était en fait changé .NET 4.5, et vous pouvez maintenant utiliser échappé des barres obliques et ils ne seront pas touchés.
j'ai exécuté le code suivant dans .NET 3.5, .NET 4.0, .net 4.5 / 4.5.1
static void Main(string[] args)
{
var uri = new Uri("http://www.yahooo.com/%2F");
var client = new WebClient();
client.DownloadString(uri);
}
.NET 3.5/4.0 la trace montre que l' %2F était en fait sans échappement comme prévu.
Toutefois, Dans .NET 4.5/4.5.1 vous pouvez voir l' %2F n'a pas été sans échappement (avis de l'OBTENIR /%2F)
Vous pouvez même utiliser ToString() maintenant, sur l'Uri et vous obtiendrez le même résultat.
donc en conclusion, Il semble que si vous utilisez .NET >= .net 4.5 alors les choses se comporteront comme elles devraient s'aligner avec le RFC.
je viens de faire une exploration d'essayer d'obtenir la même approche on travaille sur la Mono. J'ai posté ma question sur l'approche ici: obtenir une Uri avec des coupures échappées sur mono
double encodage: %252F
mais aussi si vous utilisez HttpWebRequest vous pouvez effectivement dire de ne pas encoder L'URL, de toute façon il devrait fonctionner.
aussi si WebClient accepte URI alors vous pouvez créer un nouvel URI et vous pouvez le configurer pour ne pas encoder.