Qu’est-ce qui, au minimum, est requirejs pour une requête HTTP?

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:

  • n’utilisez pas HTTP / 0.9;
  • HTTP / 1.0 requirejs la ligne de requête et la ligne vide;
  • En HTTP / 1.1, l’en 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.

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:~$