2010-01-08 8 views
2

J'utilise la ligne de commande curl pour faire un POST via un proxy, mais mes données de formulaire disparaissent à zéro longueur de contenu. Des idées de ce que je fais mal?ligne de commande curl POST donne une longueur de contenu

Voilà ma ligne de commande (utilise une forme de test public pour que les autres peuvent essayer):

curl -v --proxy-ntlm --proxy proxyserver:proxyport --proxy-user : -d "fname=a&lname=b" http://www.snee.com/xml/crud/posttest.cgi

-v = bavard
quelques arguments nous obtenir par le proxy en utilisant l'authentification Windows
- d = devrait faire un post avec les arguments donnés

Cependant, à la fois la réponse et l'impression verbose suggèrent que le contenu de la forme est en train de disparaître. Le curl imprime "Content-Length: 0" et le html retourné a les deux arguments manquants et une longueur de contenu de 0.

Le bug ne semble pas être dans le serveur proxy car curl admet qu'il envoie une longueur de contenu de 0. Est-ce que quelqu'un sait une solution à ce problème? Est-ce que quelqu'un d'autre l'a vu?

Mise à jour: this person semble avoir le même bug, mais aucune solution proposée, en dehors de ne pas utiliser NTLM que je dois

Mise à jour 2: Cela arrive certainement que l'authentification NTLM, j'ai essayé une méthode d'authentification alternative qui fonctionne. En outre, l'utilisation de -F au lieu de -d (pour les données de formulaire binaires) échoue de la même manière.

Mise à jour 3 (solution de contournement): J'ai eu un peu de discussion sur la liste des utilisateurs de curl à ce sujet. Une solution de contournement a été fournie qui consiste à utiliser --proxy-anyauth au lieu de --proxy-ntlm. J'étudie toujours le problème mais ce workarounf fonctionne pour moi.

Répondre

2

NTLM est un protocole de réponse aux défis. Lorsque vous indiquez que vous allez utiliser NTLM, un client envoie d'abord une requête sans le corps (pour éviter de gaspiller la bande passante de l'envoi du corps pour qu'il soit rejeté par le challenge HTTP/401 du serveur). Ce n'est qu'une fois le protocole de Challenge/Réponse terminé que le corps sera effectivement publié.

Cela provoque un certain nombre de problèmes dans les cas où le client s'attend à NTLM mais le proxy ou le serveur n'a aucune idée (et agit ainsi sur le POST 0 octet, ne jamais contester le client).

0

J'avais ce problème en train de faire une requête en utilisant le digest HTTP. Eric a raison, curl essaye d'être intelligent et de ne poster aucune donnée car il sait qu'il devra refaire la requête après avoir reçu le challenge du serveur.

Il s'avère que si vous fournissez l'option --anyauth (qui demande à curl de détecter automatiquement la méthode d'authentification), la requête initiale inclura toutes les données POST et (dans mon cas) le serveur répondra comme prévu.

Questions connexes