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.
Respostas:
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:
fonte
Para HTTP (não HTTPS), uma alternativa ao comando "wget" que vem à mente é usar o telnet da seguinte maneira:
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.
fonte
Você pode emitir uma solicitação GET com o OpenSSL:
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.
fonte
Para mim, funcionou a criação de um arquivo de solicitação (Exemplo:
request.txt
)E, em seguida, chame o
openssl s_client
comando:cat request.txt | openssl s_client -quiet -connect www.example.com:443
No entanto, tenha cuidado com alguns pontos:
Content-type: text/plain; charset=utf-8
se o arquivo estiver codificado em utf-8.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 ounix2dos
comando para fazer essa conversão.Connection: close
cabeç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 umConnection: keep-alive
cabeçalho.fonte
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 é:
Capturado no Wireshark, você receberá:
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 @
fonte