Cosa è necessario per una richiesta HTTP?

Sto cercando di inviare un comando GET al mio server locale utilizzando netcat effettuando le seguenti operazioni:

 echo -e "GET / HTTP/1.1\nHost: localhost" | nc localhost 80 

Sfortunatamente, ricevo una risposta di HTTP/1.1 400 Bad Request errata HTTP/1.1 400 Bad Request per questo. Cosa è, come minimo, richiesto per una richiesta HTTP?

Deve utilizzare terminazioni di riga CRLF e deve terminare in \r\n\r\n , ovvero una riga vuota. Questo è quello che uso:

 printf 'GET / HTTP/1.1\r\nHost: www.example.com\r\nConnection: close\r\n\r\n' | nc www.example.com 80 

Inoltre, preferisco printf su echo e aggiungo un’ulteriore intestazione per fare in modo che il server chiuda la connessione, ma non sono necessari.

se la richiesta è: "GET / HTTP/1.0\r\n\r\n" la risposta contiene sia l’intestazione che il corpo e la connessione si chiude dopo la risposta.

se la richiesta è: "GET / HTTP/1.1\r\nHost: host:port\r\nConnection: close\r\n\r\n" allora la risposta contiene sia l’intestazione che il corpo, e la connessione si chiude dopo il risposta.

se la richiesta è: "GET / HTTP/1.1\r\nHost: host:port\r\n\r\n" la risposta contiene sia l’intestazione che il corpo e la connessione non si chiude anche dopo la risposta.

se la tua richiesta è: "GET /\r\n\r\n" la risposta non contiene intestazione e solo corpo, e la connessione si chiude dopo la risposta.

se la tua richiesta è: "HEAD / HTTP/1.0\r\n\r\n" allora la risposta contiene solo intestazione e nessun corpo, e la connessione si chiude dopo la risposta.

se la richiesta è: "HEAD / HTTP/1.1\r\nHost: host:port\r\nConnection: close\r\n\r\n" la risposta contiene solo intestazione e nessun corpo e la connessione si chiude dopo il risposta.

se la richiesta è: "HEAD / HTTP/1.1\r\nHost: host:port\r\n\r\n" la risposta contiene solo intestazione e nessun corpo e la connessione non si chiude dopo la risposta.

Sono stato in grado di ottenere una risposta dal mio server Apache con solo il documento richiesto, nessuna intestazione di risposta, con solo

 GET /\r\n 

Se vuoi intestazioni di risposta, incluso il codice di stato, hai comunque bisogno di una delle altre risposte.

Vedi Wiki: richiesta client HTTP (esempio) .

Nota quanto segue:

Una richiesta client (che consiste in questo caso della riga di richiesta e di una sola intestazione) è seguita da una riga vuota, in modo che la richiesta termini con una nuova riga doppia, ciascuna nella forma di un ritorno a capo seguito da un avanzamento riga . L’intestazione “Host” distingue tra vari nomi DNS che condividono un singolo indirizzo IP, consentendo l’hosting virtuale basato sul nome. Mentre facoltativo in HTTP / 1.0, è obbligatorio in HTTP / 1.1 .

Il minimo assoluto (se la rimozione dell’Host è consentita 😉 è quindi GET / HTTP/1.0\r\n\r\n .

Buona programmazione

Il fatto dell’errore 400 Bad Request non valida di per sé non implica che la tua richiesta vìoli HTTP. Il server molto bene potrebbe dare questa risposta per un altro motivo.

Per quanto ne so, la richiesta HTTP minima assoluta è:

 GET / HTTP/1.0\r\n\r\n 

Per favore, per favore, per favore, non implementare il proprio client HTTP senza prima leggere le specifiche pertinenti. Si prega di leggere e assicurarsi di aver compreso appieno almeno RFC 2616 . (E se sei ambizioso, da RFID 7230 a 7235).

Mentre HTTP sembra un protocollo facile, in realtà ci sono un certo numero di punti sottili su di esso. Chiunque abbia scritto un server HTTP ti informsrà sulle soluzioni alternative che ha dovuto implementare per gestire client non corretti ma ampiamente distribuiti. A meno che non si stia leggendo le specifiche, si prega di utilizzare una libreria client consolidata; Curl è una buona scelta, ma sono sicuro che ce ne sono altri.

Se hai intenzione di implementare il tuo:

  • non usare HTTP / 0.9;
  • HTTP / 1.0 richiede la riga di interrogazione e la linea vuota;
  • in HTTP / 1.1, l’intestazione Host: è obbligatoria in aggiunta a quanto sopra.

Omissione Host: intestazione in HTTP / 1.1 è la causa più comune di 400 errori.

È necessario aggiungere una riga vuota: \r\n\r\n

http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Client_request

Il minimo VERAMENTE VERAMENTE, non sta usando netcat, ma usando bash stesso:

 [email protected]:~$ exec 3<>/dev/tcp/127.0.0.1/80 [email protected]:~$ echo -e "GET / HTTP/1.1\n" >&3 [email protected]:~$ cat <&3 HTTP/1.0 200 OK Server: SimpleHTTP/0.6 Python/2.7.6 Date: Mon, 13 Oct 2014 17:55:55 GMT Content-type: text/html; charset=UTF-8 Content-Length: 514  Directory listing for /  

Directory listing for /



[email protected]:~$