Solicitação HTTP (S) manual

10

Estou procurando uma ferramenta (possivelmente no Linux) que me permita fazer uma solicitação HTTP ou HTTPS manual. Por manual, eu realmente quis dizer isso: eu deveria poder alimentar um arquivo de texto que parece

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

e um URL de destino (www.example.com/foo) e envie a solicitação para o URL. No máximo, seria útil se o cabeçalho Content_Length fosse calculado automaticamente.

Eu seria capaz de escrever uma ferramenta desse tipo usando alguma biblioteca como o initplib em Python, mas o motivo pelo qual preciso é fazer uma investigação manual quando algo der errado com essas bibliotecas.

Andrea
fonte
1
https pergunta específica: superuser.com/questions/346958/…
Ciro Santilli escreveu:

Respostas:

10

O wget possui uma opção --post-file que deve funcionar para você.

Edit: Além disso, há o Ncat , que você usaria de maneira semelhante à sugestão de telnet de Randolf Richardson, exceto que ele também suporta SSL / HTTPS:

ncat -C --ssl www.example.com 443 < input.txt > output.txt
Chris Acheson
fonte
6
Se você precisar de HTTPS, openssl uso em vez de netcat: openssl s_client -connect <address>: 443
Ambroz Bizjak
1
O wget --post-file adicionará cabeçalhos e usará o arquivo especificado apenas para o corpo da solicitação.
David Balažic
6

Para HTTP (não HTTPS), uma alternativa ao comando "wget" que vem à mente é usar o telnet da seguinte maneira:

  • nome do host do telnet 80 <input.txt> output.txt

O arquivo "input.txt" é sua lista de comandos predefinidos que você deseja alimentar para o host no nome do host e o arquivo "output.txt" armazenará a resposta.

Randolf Richardson
fonte
1
Isso me fez pensar se o netcat suporta SSL, e eis que existe o Ncat, um clone do netcat habilitado para SSL.
22611 Chris Acheson
@ Chris Acheson (+1): Isso é fantástico! Sinta-se à vontade para copiar o que escrevi em uma resposta separada e adaptá-lo a uma solução que utilize o NetCat (votarei na sua resposta se você fizer isso).
Randolf Richardson
1

Você pode emitir uma solicitação GET com o 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

Observe que você também pode usar "HTTP / 2", mas tenha cuidado porque alguns servidores (por exemplo, github.com) não são compatíveis.

Steven Penny
fonte
0

Para mim, funcionou a criação de um arquivo de solicitação (Exemplo: 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

E, em seguida, chame o openssl s_clientcomando:

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

No entanto, tenha cuidado com alguns pontos:

  • O arquivo deve ser codificado corretamente, especialmente o corpo do conteúdo. Melhor se você incluir um cabeçalho Content-type: text/plain; charset=utf-8se o arquivo estiver codificado em utf-8.
  • As terminações de linha dos cabeçalhos devem ser CR / LF . Somente com LF o servidor da web poderia retornar HTTP/1.1 505 HTTP Version Not Supported, porque o protocolo HTTP padrão usa CR / LF para terminações de linha ( https://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html ). Você pode usar o unix2doscomando para fazer essa conversão.
  • Adicione um Connection: closecabeçalho para finalizar a solicitação e retornar da chamada. Caso contrário, o comando estará aguardando a interação do usuário, se o servidor normalmente responder com um Connection: keep-alivecabeçalho.
F.Igor
fonte
-1

Estou surpreso que ninguém mencionou cURL . É feito exatamente para o que você quer fazer. E está disponível em praticamente qualquer plataforma (incluindo Windows).

Portanto, para o seu exemplo, tudo o que você faria é:

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

Capturado no Wireshark, você receberá:

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

Você pode facilmente modificar ainda mais os cabeçalhos se desejar fazer todo tipo de coisa (por exemplo, alterar o user agent, etc).

Editar: não percebeu o requisito "de um arquivo". Você também pode fazer isso, arquivos simples ascii ou binários. Você acabou de especificar o nome do arquivo com um símbolo @

-d @/tmp/HelloWorldFile
Nicholi
fonte
curl é quase o que eu quero, mas requer que eu especifique os cabeçalhos na linha de comando, o que é muito impraticável. Eu preciso de algo que me permita especificar o texto completo da solicitação, incluindo o método e os cabeçalhos, de um arquivo, e o ncat faz exatamente o que eu quero. De qualquer forma, obrigado :-)
Andrea