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 nc
o 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 ( 0x0d
em 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 curl
ser 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 unix2dos
utilitá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 -C
opção CRLF
para 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.