Richiesta HTTP (S) manuale


10

Sto cercando uno strumento (possibilmente su Linux) che mi permetterà di effettuare una richiesta HTTP o HTTPS manuale. Per manuale lo intendo davvero: dovrei essere in grado di alimentarlo come un file di testo

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

e un URL di destinazione (www.example.com/foo) e inviare la richiesta all'URL. Al massimo, sarebbe utile se l'intestazione Content_Length fosse calcolata automaticamente.

Sarei in grado di scrivere uno strumento simile usando alcune librerie come httplib in Python, ma la ragione per cui ne ho bisogno è fare un'indagine manuale quando qualcosa va storto con tali librerie.


Risposte:


10

wget ha un'opzione --post-file che dovrebbe funzionare per te.

Modifica: Inoltre, c'è Ncat , che useresti in modo simile al suggerimento telnet di Randolf Richardson, tranne per il fatto che supporta anche SSL / HTTPS:

ncat -C --ssl www.example.com 443 < input.txt > output.txt

6
Se hai bisogno di HTTPS, usa openssl invece di netcat: openssl s_client -connect <indirizzo>: 443
Ambroz Bizjak,

1
wget --post-file aggiungerà le intestazioni e utilizzerà il file specificato solo per il corpo della richiesta.
David Balažic,

6

Per HTTP (non HTTPS), un'alternativa al comando "wget" che viene in mente è usare telnet come segue:

  • nome host telnet 80 <input.txt> output.txt

Il file "input.txt" è il tuo elenco di comandi preimpostati che desideri inviare all'host in nome host e il file "output.txt" memorizzerà la risposta.


1
Questo mi ha fatto domandare se netcat supporta SSL, e ecco, c'è Ncat, un clone netcat abilitato per SSL.
Chris Acheson,

@Chris Acheson (+1): Fantastico! Non esitate a copiare ciò che ho scritto in una risposta separata e adattarlo a una soluzione che utilizza NetCat (voterò per la vostra risposta se lo farete).
Randolf Richardson,

1

Puoi inviare una richiesta GET con 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

Nota che puoi anche usare "HTTP / 2", ma fai attenzione perché alcuni server (es. Github.com) non lo supportano.


0

Per me, ha funzionato la creazione di un file di richiesta (Esempio: 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

E quindi chiama il openssl s_clientcomando:

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

Tuttavia, fai attenzione ad alcuni punti:

  • Il file deve essere codificato correttamente, in particolare il corpo del contenuto. Meglio se includi un'intestazione Content-type: text/plain; charset=utf-8se il file è codificato in utf-8.
  • Le terminazioni di linea per le intestazioni devono essere CR / LF . Solo con LF il server web potrebbe tornare HTTP/1.1 505 HTTP Version Not Supported, perché il protocollo HTTP standard utilizza CR / LF per i finali di linea ( https://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html ). È possibile utilizzare il unix2doscomando per eseguire questa conversione.
  • Aggiungi Connection: closeun'intestazione per terminare la richiesta e tornare dalla chiamata. In caso contrario, il comando attenderà l'interazione dell'utente, se il server normalmente risponde con Connection: keep-aliveun'intestazione.

-1

Sono sorpreso che nessuno abbia menzionato CURL . È fatto esattamente per quello che vuoi fare. Ed è disponibile praticamente su qualsiasi piattaforma (incluso Windows).

Quindi, per il tuo esempio, tutto ciò che dovresti fare è:

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

Quale catturato da Wireshark ti farà guadagnare:

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

Puoi facilmente modificare ulteriormente le intestazioni se desideri fare tutti i tipi di cose (ad es. Cambiare lo user-agent, ecc.).

Modifica: non ho notato il requisito "da un file". Puoi farlo anche tu, semplici file ASCII o binari. Basta specificare il nome file con un simbolo @

-d @/tmp/HelloWorldFile

il ricciolo è quasi quello che voglio, ma mi richiede di specificare le intestazioni sulla riga di comando, il che è molto impraticabile. Ho bisogno di qualcosa che mi permetta di specificare il testo completo della richiesta, incluso il metodo e le intestazioni, da un file, e ncat fa esattamente quello che voglio. Grazie comunque :-)
Andrea
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.