web-dev-qa-db-fra.com

Comment envoyer une requête HTTP en utilisant Telnet

Comment obtenir le contenu d'une page Web en utilisant Telnet? (par exemple https://stackoverflow.com/questions contenu de la page)

39
omtcvxyz

telnet NomServeur 80 


GET /index.html

24
ngille

Vous pourriez faire

telnet stackoverflow.com 80

Et puis coller

GET /questions HTTP/1.0
Host: stackoverflow.com


# add the 2 empty lines above but not this one

Voici une transcription

$ telnet stackoverflow.com 80
Trying 151.101.65.69...
Connected to stackoverflow.com.
Escape character is '^]'.
GET /questions HTTP/1.0
Host: stackoverflow.com

HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
...
57
stefan bachert

Pour la postérité, votre question était de savoir comment envoyer une demande http à https://stackoverflow.com/questions. La vraie réponse est: vous ne pouvez pas utiliser telnet, car il s’agit d’une URL accessible uniquement par https.

Donc, vous pouvez utiliser openssl au lieu de telnet, comme ceci par exemple

$ openssl s_client -connect stackoverflow.com:443
...
---
GET /questions HTTP/1.1
Host: stackoverflow.com

Cela vous donnera la réponse https.

23
dulaccc

Pour développer un peu les réponses précédentes, il existe quelques complications.

telnet n'est pas particulièrement scriptable; vous préférerez peut-être utiliser nc (ou netcat), qui gère mieux les entrées non-terminales et les signaux.

De plus, contrairement à telnet, nc autorise réellement SSL (et donc https au lieu du trafic http - vous avez besoin du port 443 au lieu du port 80).

Il existe une différence entre HTTP 1.0 et 1.1. La version récente du protocole requiert que l'en-tête Host: soit inclus dans la requête sur une ligne séparée après la ligne POST ou GET, et qu'il soit suivi d'une ligne vide pour marquer la fin des en-têtes de la requête.

Le protocole HTTP nécessite des extrémités de ligne retour à la ligne/retour à la ligne. Beaucoup de serveurs sont indulgents à ce sujet, mais certains ne le sont pas. Vous voudrez peut-être utiliser

printf "%\r\n" \
    "GET /questions HTTP/1.1" \
    "Host: stackoverflow.com" \
    "" |
nc --ssl stackoverflow.com 443

Si vous utilisez HTTP/1.0, vous n'avez pas toujours besoin de l'en-tête Host:, mais de nombreux serveurs modernes exigent quand même l'en-tête. Si plusieurs sites sont hébergés sur la même adresse IP, le serveur ne sait pas à partir de GET /foo HTTP/1.0 si vous voulez dire http://site1.example.com/foo ou http://site2.example.net/foo si ces deux sites sont tous deux hébergés sur le même serveur (en l'absence d'un en-tête Host:, un serveur HTTP 1.0 peut par défaut sur un site différent de celui que vous souhaitez, pour ne pas obtenir le contenu souhaité).

Le protocole HTTPS est identique à HTTP dans ces détails; la seule différence réelle réside dans la configuration initiale de la session.

0
tripleee