J’essaie d’envoyer une commande GET à mon serveur local à l’aide de netcat
en procédant comme suit:
echo -e "GET / HTTP/1.1\nHost: localhost" | nc localhost 80
Malheureusement, je reçois une réponse HTTP/1.1 400 Bad Request
pour cela. Que faut-il au minimum pour une requête HTTP?
Il doit utiliser les fins de ligne CRLF et se terminer par \r\n\r\n
, c’est-à-dire une ligne vide. 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
De plus, 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.
Si la requête est: "GET / HTTP/1.0\r\n\r\n"
la réponse contient l’en-tête ainsi que le corps, et la connexion se ferme après la réponse.
si la requête est: "GET / HTTP/1.1\r\nHost: host:port\r\nConnection: close\r\n\r\n"
alors la réponse contient un en-tête ainsi que le corps, et la connexion se ferme après le réponse.
si la requête est: "GET / HTTP/1.1\r\nHost: host:port\r\n\r\n"
alors la réponse contient un en-tête ainsi que le corps, et la connexion ne se fermera pas même après la réponse.
Si votre demande est: "GET /\r\n\r\n"
la réponse ne contient aucun en-tête et seul corps, et la connexion se ferme après la réponse.
Si votre requête est: "HEAD / HTTP/1.0\r\n\r\n"
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 requête est: "HEAD / HTTP/1.1\r\nHost: host:port\r\nConnection: close\r\n\r\n"
alors la réponse ne contient que des en-têtes et aucun corps, et la connexion se ferme après le réponse.
si la requête est: "HEAD / HTTP/1.1\r\nHost: host:port\r\n\r\n"
alors la réponse ne contient que des en-têtes et aucun corps, et la connexion ne se fermera pas après la réponse.
J’ai pu obtenir une réponse de mon serveur Apache avec uniquement le document demandé, aucun en-tête de réponse, avec juste
GET /\r\n
Si vous voulez des en-têtes de réponse, y compris le code d’état, vous avez besoin d’une des autres réponses ici.
Voir Wiki: Demande de client HTTP (exemple) .
Notez les points suivants:
Une requête client (constituée dans ce cas de la ligne de demande et d’un seul en-tête) est suivie d’une ligne vierge, de sorte que la requête se termine par une double nouvelle ligne, chacune sous la forme d’un retour chariot suivi d’un saut de ligne . L’en-tête “Host” distingue les différents noms DNS partageant une seule adresse IP, permettant ainsi un hébergement virtuel basé sur un nom. Bien que facultatif dans HTTP / 1.0, il est obligatoire dans HTTP / 1.1 .
Le minimum absolu (si le retrait de l’hôte est autorisé 😉 est alors GET / HTTP/1.0\r\n\r\n
.
Heureux codage
Le fait de l’erreur 400 Bad Request
ne signifie pas que votre requête viole HTTP. Le serveur pourrait très bien donner cette réponse pour une autre raison.
Autant que je sache, la requête HTTP valide minimale absolue est la suivante:
GET / HTTP/1.0\r\n\r\n
S’il vous plaît, s’il vous plaît, s’il vous plaît, ne pas implémenter votre propre client HTTP sans d’abord lire les spécifications pertinentes. Veuillez lire et vous assurer que vous avez bien compris au moins RFC 2616 . (Et si vous êtes ambitieux, RFC 7230 à 7235).
Bien que HTTP ressemble à un protocole simple, il existe en réalité un certain nombre de points subtils à ce sujet. Quiconque a écrit un serveur HTTP vous informera des solutions qu’il a dû mettre en œuvre pour traiter les clients incorrects mais largement déployés. À moins de lire les spécifications, utilisez une bibliothèque client bien établie. Curl est un bon choix, mais je suis sûr qu’il y en a d’autres.
Si vous souhaitez implémenter le vôtre:
Host:
tête Host:
est obligatoire en plus de ce qui précède. L’omission de l’ Host:
tête dans HTTP / 1.1 est la cause la plus courante de 400 erreurs.
Vous devriez append une ligne vide: \r\n\r\n
http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Client_request
Le minimum vraiment vraiment BARE, n’utilise pas netcat, mais en utilisant bash lui-même:
user@localhost:~$ exec 3<>/dev/tcp/127.0.0.1/80 user@localhost:~$ echo -e "GET / HTTP/1.1\n" >&3 user@localhost:~$ 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 /
user@localhost:~$