Solicitud HTTP (S) manual

10

Estoy buscando una herramienta (posiblemente en Linux) que me permita hacer una solicitud HTTP o HTTPS manual. Por manual, lo digo en serio: debería poder alimentarlo con un archivo de texto que se parece a

POST /foo HTTP/1.1
Host: www.example.com
Accept: text/xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: en-gb,en;q=0.5
Content-Type: text/plain
Content-Length: 11

Hello world

y una URL de destino (www.example.com/foo), y envíe la solicitud a la URL. A lo sumo, sería útil si el encabezado Content_Length se calculara automáticamente.

Podría escribir una herramienta de este tipo utilizando alguna biblioteca como httplib en Python, pero la razón por la que lo necesito es para hacer una investigación manual cuando algo sale mal con esas bibliotecas.

Andrea
fuente
1
https específica pregunta: superuser.com/questions/346958/...
Ciro Santilli冠状病毒审查六四事件法轮功

Respuestas:

10

wget tiene una opción --post-file que debería funcionar para usted.

Editar: Además, está Ncat , que usarías de manera similar a la sugerencia de Telnet de Randolf Richardson, excepto que también es compatible con SSL / HTTPS:

ncat -C --ssl www.example.com 443 < input.txt > output.txt
Chris Acheson
fuente
66
Si necesita HTTPS, use openssl en lugar de netcat: openssl s_client -connect <address>: 443
Ambroz Bizjak
1
wget --post-file agregará encabezados y usará el archivo especificado solo para el cuerpo de la solicitud.
David Balažic
6

Para HTTP (no HTTPS), una alternativa al comando "wget" que viene a la mente es usar telnet de la siguiente manera:

  • telnet hostname 80 <input.txt> output.txt

El archivo "input.txt" es su lista de comandos preestablecidos que desea alimentar al host en hostname y el archivo "output.txt" almacenará la respuesta.

Randolf Richardson
fuente
1
Esto me hizo preguntarme si netcat admite SSL, y he aquí, hay Ncat, un clon de netcat habilitado para SSL.
Chris Acheson
@ Chris Acheson (+1): ¡Eso es fantástico! No dude en copiar lo que escribí en una respuesta separada y adaptarlo a una solución que utilice NetCat (votaré por su respuesta si hace esto).
Randolf Richardson
1

Puede emitir una solicitud GET con OpenSSL:

openssl s_client -quiet -connect cdn.sstatic.net:443 <<eof
GET /stackexchange/js/universal-login.js HTTP/1.1
Connection: close
Host: cdn.sstatic.net

eof

Tenga en cuenta que también puede usar "HTTP / 2", pero tenga cuidado porque algunos servidores (por ejemplo, github.com) no lo admiten.

Steven Penny
fuente
0

Para mí, funcionó la creación de un archivo de solicitud (Ejemplo: request.txt)

POST /foo HTTP/1.1
Host: www.example.com
Accept: text/xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: en-gb,en;q=0.5
Content-Type: text/plain; charset=utf-8
Content-Length: 11
Connection: close

Hello world

Y luego llame al openssl s_clientcomando:

cat request.txt | openssl s_client -quiet -connect www.example.com:443

Sin embargo, tenga cuidado con algunos puntos:

  • El archivo debe estar codificado correctamente, especialmente el cuerpo del contenido. Mejor si incluye un encabezado Content-type: text/plain; charset=utf-8si el archivo está codificado en utf-8.
  • Los finales de línea para los encabezados deben ser CR / LF . Solo con LF el servidor web podría regresar HTTP/1.1 505 HTTP Version Not Supported, porque el protocolo HTTP estándar usa CR / LF para terminaciones de línea ( https://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html ). Puede usar el unix2doscomando para hacer esta conversión.
  • Agregue un Connection: closeencabezado para finalizar la solicitud y regresar de la llamada. De lo contrario, el comando esperará la interacción del usuario, si el servidor normalmente responde con un Connection: keep-aliveencabezado.
F.Igor
fuente
-1

Me sorprende que nadie haya mencionado cURL . Está hecho exactamente para lo que quieres hacer. Y está disponible en prácticamente cualquier plataforma (incluido Windows).

Entonces, para su ejemplo, todo lo que haría es:

curl -H 'Content-Type: text/plain' -d 'Hello World' www.example.com

Lo capturado de Wireshark te dará:

POST / HTTP/1.1
User-Agent: curl/7.19.7 (x86_64-pc-linux-gnu) libcurl/7.19.7 OpenSSL/0.9.8k zlib/1.2.3.3 libidn/1.15
Host: www.example.com
Accept: */*
Content-Type: text/plain
Content-Length: 11

Hello world

Puede modificar más fácilmente los encabezados si desea hacer todo tipo de cosas (es decir, cambiar el agente de usuario, etc.).

Editar: No noté el requisito "de un archivo". También puede hacerlo, ya sea archivos ASCII o binarios. Simplemente especifique el nombre de archivo con un símbolo @

-d @/tmp/HelloWorldFile
Nicholi
fuente
curl es casi lo que quiero, pero requiere que especifique los encabezados en la línea de comando, lo cual es muy poco práctico. Necesito algo que me permita especificar el texto completo de la solicitud, incluido el método y los encabezados, de un archivo, y ncat hace exactamente lo que quiero. Gracias de todos modos :-)
Andrea