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.
Respuestas:
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:
fuente
Para HTTP (no HTTPS), una alternativa al comando "wget" que viene a la mente es usar telnet de la siguiente manera:
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.
fuente
Puede emitir una solicitud GET con OpenSSL:
Tenga en cuenta que también puede usar "HTTP / 2", pero tenga cuidado porque algunos servidores (por ejemplo, github.com) no lo admiten.
fuente
Para mí, funcionó la creación de un archivo de solicitud (Ejemplo:
request.txt
)Y luego llame al
openssl s_client
comando:cat request.txt | openssl s_client -quiet -connect www.example.com:443
Sin embargo, tenga cuidado con algunos puntos:
Content-type: text/plain; charset=utf-8
si el archivo está codificado en utf-8.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 elunix2dos
comando para hacer esta conversión.Connection: close
encabezado 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 unConnection: keep-alive
encabezado.fuente
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:
Lo capturado de Wireshark te dará:
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 @
fuente