Demande HTTP (S) manuelle

10

Je recherche un outil (éventuellement sous Linux) qui me permettra de faire une requête HTTP ou HTTPS manuelle. Par manuel, je le pense vraiment: je devrais pouvoir lui alimenter un fichier texte qui ressemble à

POST /foo HTTP/1.1
Host: www.example.com
Accept: text/xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: en-gb,en;q=0.5
Content-Type: text/plain
Content-Length: 11

Hello world

et une URL de destination (www.example.com/foo), et envoyez la demande à l'URL. Tout au plus, il serait utile que l'en-tête Content_Length soit automatiquement calculé.

Je serais en mesure d'écrire un tel outil en utilisant une bibliothèque comme httplib en Python, mais la raison même pour laquelle j'en ai besoin est de faire une enquête manuelle en cas de problème avec de telles bibliothèques.

Andrea
la source
1
Question spécifique https: superuser.com/questions/346958/…
Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功

Réponses:

10

wget a une option --post-file qui devrait fonctionner pour vous.

Edit: Il y a aussi Ncat , que vous utiliseriez de la même manière que la suggestion telnet de Randolf Richardson, sauf qu'il prend également en charge SSL / HTTPS:

ncat -C --ssl www.example.com 443 < input.txt > output.txt
Chris Acheson
la source
6
Si vous avez besoin de HTTPS, utilisez openssl au lieu de netcat: openssl s_client -connect <address>: 443
Ambroz Bizjak
1
wget --post-file ajoutera des en-têtes et utilisera le fichier spécifié uniquement pour le corps de la demande.
David Balažic
6

Pour HTTP (pas HTTPS), une alternative à la commande "wget" qui vient à l'esprit est d'utiliser telnet comme suit:

  • nom d'hôte telnet 80 <input.txt> output.txt

Le fichier "input.txt" est votre liste de commandes prédéfinies que vous souhaitez envoyer à l'hôte à hostname et le fichier "output.txt" stockera la réponse.

Randolf Richardson
la source
1
Cela m'a fait me demander si netcat prend en charge SSL, et voilà, il y a Ncat, un clone netcat compatible SSL.
Chris Acheson
@Chris Acheson (+1): C'est fantastique! N'hésitez pas à copier ce que j'ai écrit dans une réponse séparée et à l'adapter à une solution qui utilise NetCat (je voterai pour votre réponse si vous faites cela).
Randolf Richardson
1

Vous pouvez émettre une demande GET avec OpenSSL:

openssl s_client -quiet -connect cdn.sstatic.net:443 <<eof
GET /stackexchange/js/universal-login.js HTTP/1.1
Connection: close
Host: cdn.sstatic.net

eof

Notez que vous pouvez également utiliser "HTTP / 2", mais soyez prudent car certains serveurs (par exemple github.com) ne le prennent pas en charge.

Steven Penny
la source
0

Pour moi, cela a la création d' un dossier de demande (exemple: request.txt)

POST /foo HTTP/1.1
Host: www.example.com
Accept: text/xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: en-gb,en;q=0.5
Content-Type: text/plain; charset=utf-8
Content-Length: 11
Connection: close

Hello world

Et puis appelez la openssl s_clientcommande:

cat request.txt | openssl s_client -quiet -connect www.example.com:443

Cependant, soyez prudent sur certains points:

  • Le fichier doit être codé correctement, spécialement le corps du contenu. Mieux si vous incluez un en-tête Content-type: text/plain; charset=utf-8si le fichier est encodé en utf-8.
  • Les fins de ligne pour les en-têtes doivent être CR / LF . Seul avec LF, le serveur Web peut retourner HTTP/1.1 505 HTTP Version Not Supported, car le protocole HTTP standard utilise CR / LF pour les fins de ligne ( https://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html ). Vous pouvez utiliser la unix2doscommande pour effectuer cette conversion.
  • Ajoutez un en- Connection: closetête pour terminer la demande et revenir de l'appel. Sinon, la commande attendra l'interaction de l'utilisateur, si le serveur répond normalement avec un en- Connection: keep-alivetête.
F.Igor
la source
-1

Je suis surpris que personne n'ait mentionné cURL . Il est fait exactement pour ce que vous voulez faire. Et il est disponible sur pratiquement toutes les plateformes (y compris Windows).

Donc, pour votre exemple, tout ce que vous feriez serait de:

curl -H 'Content-Type: text/plain' -d 'Hello World' www.example.com

Lequel capturé de Wireshark vous rapportera:

POST / HTTP/1.1
User-Agent: curl/7.19.7 (x86_64-pc-linux-gnu) libcurl/7.19.7 OpenSSL/0.9.8k zlib/1.2.3.3 libidn/1.15
Host: www.example.com
Accept: */*
Content-Type: text/plain
Content-Length: 11

Hello world

Vous pouvez facilement modifier davantage les en-têtes si vous souhaitez faire toutes sortes de choses (c'est-à-dire changer l'agent utilisateur, etc.).

Edit: Je n'ai pas remarqué l'exigence "à partir d'un fichier". Vous pouvez le faire aussi, soit en simple ascii soit en fichiers binaires. Vous spécifiez simplement le nom de fichier avec un symbole @

-d @/tmp/HelloWorldFile
Nicholi
la source
curl est presque ce que je veux, mais m'oblige à spécifier les en-têtes sur la ligne de commande, ce qui est très peu pratique. J'ai besoin de quelque chose qui me permette de spécifier le texte complet de la demande, y compris la méthode et les en-têtes, à partir d'un fichier, et ncat fait exactement ce que je veux. Merci quand même :-)
Andrea