68 votes

Qu'est-ce qui est nécessaire, au minimum, pour une requête HTTP ?

J'essaie d'envoyer une commande GET à mon serveur local en utilisant la méthode suivante netcat en procédant comme suit :

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

Malheureusement, je reçois un HTTP/1.1 400 Bad Request réponse pour cela. Qu'est-ce qui est requis, au minimum, pour une requête HTTP ?

67voto

Abhishek Oza Points 982

Si la demande est : "GET / HTTP/1.0\r\n\r\n" alors la réponse contient l'en-tête ainsi que le corps, et la connexion se ferme après la réponse.

si la demande est : "GET / HTTP/1.1\r\nHost: host:port\r\nConnection: close\r\n\r\n" alors la réponse contient l'en-tête ainsi que le corps, et la connexion se ferme après la réponse.

si la demande est : "GET / HTTP/1.1\r\nHost: host:port\r\n\r\n" alors la réponse contient l'en-tête ainsi que le corps, et la connexion ne sera pas fermée même après la réponse.

si votre demande est : "GET /\r\n\r\n" alors la réponse ne contient pas d'en-tête et seulement le corps, et la connexion se ferme après la réponse.

si votre demande est : "HEAD / HTTP/1.0\r\n\r\n" alors la réponse ne contient que l'en-tête et aucun corps, et la connexion se ferme après la réponse.

si la demande est : "HEAD / HTTP/1.1\r\nHost: host:port\r\nConnection: close\r\n\r\n" alors la réponse ne contient que l'en-tête et aucun corps, et la connexion se ferme après la réponse.

si la demande est : "HEAD / HTTP/1.1\r\nHost: host:port\r\n\r\n" alors la réponse ne contient que l'en-tête et aucun corps, et la connexion ne sera pas fermée après la réponse.

62voto

Josh Lee Points 53741

Il doit utiliser des fins de ligne CRLF et se terminer par le caractère \r\n\r\n c'est-à-dire une ligne blanche. C'est ce que j'utilise :

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

En outre, je préfère printf sur echo et j'ajoute un en-tête supplémentaire pour que le serveur ferme la connexion, mais ce n'est pas nécessaire.

12voto

Voir Wiki : Demande du client HTTP (exemple) .

Notez ce qui suit :

Une demande du client (constituée dans ce cas de la ligne de demande et d'un seul en-tête) est suivie d'une ligne vide, de sorte que la demande se termine par un double saut de ligne, chacun sous la forme d'un retour chariot suivi d'un saut de ligne . L'en-tête "Host" fait la distinction entre plusieurs noms DNS partageant une même adresse IP, ce qui permet un hébergement virtuel basé sur le nom. Alors que facultatif dans HTTP/1.0, il est obligatoire dans HTTP/1.1 .

Le minimum absolu (si la suppression de l'hôte est permise ;-) est donc le suivant GET / HTTP/1.0\r\n\r\n .

Bon codage

9voto

jfklein Points 291

J'ai pu obtenir une réponse de mon serveur Apache avec uniquement le document demandé, sans en-tête de réponse, avec seulement

GET /\r\n

Si vous voulez les en-têtes de réponse, y compris le code d'état, vous avez besoin de l'une des autres réponses ici cependant.

5voto

wberry Points 6068

Le fait de la 400 Bad Request L'erreur elle-même n'implique pas que votre requête viole le protocole HTTP. Le serveur pourrait très bien donner cette réponse pour une autre raison.

Pour autant que je sache, le minimum absolu de requête HTTP valide est :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X