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

3

Estou usando o curl para solicitar um URL específico e receber uma resposta de 200 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 para arquivar como:

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

e tente executar o comando nc (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 ?

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

    
por heytar 02.11.2016 / 05:13

1 resposta

2

O RFC relevante, Protocolo de Transferência de Hipertexto (HTTP / 1.1): Sintaxe e Roteamento de Mensagens contém a resposta para sua pergunta : que cada linha de uma solicitação HTTP deve terminar com CR / LF.

A gramática para o Formato de mensagem do HTTP especifica que cada linha de cabeçalho deve terminar com um caractere de retorno de carro ( 0x0d em ASCII) seguido por um caractere de alimentação de linha ( 0x0a ):

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

Isso é expresso mais claramente na descrição da Linha de solicitação :

A request-line begins with a method token, followed by a single space (SP), the request-target, another single space (SP), the protocol version, and ends with CRLF.

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

Como curl é especificamente desenvolvido para solicitações HTTP, ele já usa as terminações de linha apropriadas ao fazer solicitações HTTP. No entanto, o netcat é um programa de propósito mais geral. Como um utilitário Unix, ele usa caracteres de alimentação de linha para fins de linha por padrão, exigindo, portanto, que o usuário garanta que as linhas sejam finalizadas corretamente.

Você pode usar o utilitário unix2dos para converter o arquivo que contém os cabeçalhos de solicitação para usar finais de retorno de carro / alimentação de linha.

Se você quiser digitar a solicitação HTTP manualmente e tiver uma versão recente de nc , use sua opção -C para usar CRLF para fins de linha:

nc -C www.youtypeitwepostit.com 80

A propósito, é importante notar que os protocolos de Internet mais populares (por exemplo, SMTP) usam finais de linha CR / LF.

Observe que alguns servidores da Web (por exemplo, o Apache) são mais tolerantes e aceitam linhas de solicitação que são encerradas apenas com um caractere de Feed de linha. A especificação HTTP permite isso, conforme mencionado na seção Robustez da análise de mensagens :

Although the line terminator for the start-line and header fields is the sequence CRLF, a recipient MAY recognize a single LF as a line terminator and ignore any preceding CR.

    
por 02.11.2016 / 12:41