Qual é a diferença entre usar netcat (nc) e curl para solicitações HTTP?

Qual é a diferença entre usar netcat (nc) e curl para solicitações HTTP?

Estou usando curl para solicitar um URL específico e obter 200 respostas OK:

curl -v www.youtypeitwepostit.com
* About to connect() to www.youtypeitwepostit.com port 80 (#0)
*   Trying 54.197.246.21...
* Connected to www.youtypeitwepostit.com (54.197.246.21) port 80 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.29.0
> Host: www.youtypeitwepostit.com
> Accept: */*
>
< HTTP/1.1 200 OK
...

Se eu salvar cabeçalhos em arquivo como:

GET / HTTP/1.1
User-Agent: curl/7.29.0
Host: www.youtypeitwepostit.com
Accept: */*

e tente executar nco comando (netcat):

nc www.youtypeitwepostit.com 80 < file
HTTP/1.1 505 HTTP Version Not Supported
Connection: close
Server: Cowboy
Date: Wed, 02 Nov 2016 04:08:34 GMT
Content-Length: 0

Estou recebendo outra resposta. Qual é a diferença e como posso obter 200 OK usando nc?

Tentei com diferentes versões de HTTP no cabeçalho da solicitação, tentei digitar a solicitação manualmente para evitar CRLFs errados, tentei excluir cabeçalhos opcionais. Os resultados são semelhantes.

Responder1

A RFC relevante,Protocolo de transferência de hipertexto (HTTP/1.1): sintaxe e roteamento de mensagenscontém a resposta à sua pergunta: que cada linha de uma solicitação HTTP deve terminar com CR/LF.


A gramática para o HTTPFormato da mensagemespecifica que cada linha de cabeçalho deve terminar com um caractere de retorno de carro ( 0x0dem ASCII) seguido por um caractere de avanço de linha ( 0x0a):

 HTTP-message   = start-line
                  *( header-field CRLF )
                  CRLF
                  [ message-body ]

Isto é expresso mais claramente na descrição doLinha de solicitação:

Uma linha de solicitação começa com um token de método, seguido por um espaço único (SP), o destino da solicitação, outro espaço único (SP), a versão do protocolo e termina com CRLF.

 request-line   = method SP request-target SP HTTP-version CRLF

Por curlser desenvolvido especificamente para solicitações HTTP, ele já usa os finais de linha apropriados ao fazer solicitações HTTP. No entanto, o netcat é um programa de uso mais geral. Como um utilitário Unix, ele usa caracteres de alimentação de linha para finais de linha por padrão, exigindo assim que o usuário garanta que as linhas sejam finalizadas corretamente.

Você pode usar o unix2dosutilitário para converter o arquivo que contém os cabeçalhos da solicitação para usar terminações de retorno de carro/alimentação de linha.

Se você deseja digitar a solicitação HTTP manualmente e possui uma versão recente do nc, você deve usar sua -Copção CRLFpara finais de linha:

nc -C www.youtypeitwepostit.com 80

A propósito, vale a pena notar que os protocolos mais populares da Internet (por exemplo, SMTP) usam terminações de linha CR/LF.


Observe que alguns servidores web (por exemplo, Apache) são mais indulgentes e aceitarão linhas de solicitação que sejam finalizadas apenas com um caractere Line Feed. A especificação HTTP permite isso, conforme mencionado noRobustez na análise de mensagensseção:

Embora o terminador de linha para os campos da linha inicial e do cabeçalho seja a sequência CRLF, um destinatário PODE reconhecer um único LF como um terminador de linha e ignorar qualquer CR anterior.

informação relacionada