¿Cuál es la diferencia entre usar netcat (nc) y curl para solicitudes HTTP?

¿Cuál es la diferencia entre usar netcat (nc) y curl para solicitudes HTTP?

Estoy usando curl para solicitar una URL específica y obtengo una respuesta 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
...

Si guardo los encabezados para archivarlos como:

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

e intenta ejecutar ncel 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

Estoy recibiendo otra respuesta. ¿Cuál es la diferencia y cómo puedo obtener 200 OK usando nc?

Probé con diferentes versiones de HTTP en el encabezado de la solicitud, intenté escribir la solicitud manualmente para evitar CRLF incorrectos, intenté excluir encabezados opcionales. Los resultados son similares.

Respuesta1

El RFC correspondiente,Protocolo de transferencia de hipertexto (HTTP/1.1): sintaxis y enrutamiento de mensajescontiene la respuesta a su pregunta: que cada línea de una solicitud HTTP debe terminar con CR/LF.


La gramática del HTTP.Formato de mensajeespecifica que cada línea de encabezado debe terminar con un carácter de retorno de carro ( 0x0den ASCII) seguido de un carácter de avance de línea ( 0x0a):

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

Esto se expresa más claramente en la descripción delLínea de solicitud:

Una línea de solicitud comienza con un token de método, seguido de un espacio único (SP), el destino de la solicitud, otro espacio único (SP), la versión del protocolo y termina con CRLF.

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

Dado que curlestá desarrollado específicamente para solicitudes HTTP, ya utiliza los finales de línea apropiados al realizar solicitudes HTTP. Sin embargo, netcat es un programa de propósito más general. Como utilidad de Unix, utiliza caracteres de avance de línea para los finales de línea de forma predeterminada, lo que requiere que el usuario se asegure de que las líneas terminen correctamente.

Puede utilizar la unix2dosutilidad para convertir el archivo que contiene los encabezados de solicitud para utilizar finales de retorno de carro/salto de línea.

Si desea escribir la solicitud HTTP a mano y tiene una versión reciente de nc, debe usar su -Copción CRLFpara finales de línea:

nc -C www.youtypeitwepostit.com 80

Por cierto, vale la pena señalar que los protocolos de Internet más populares (por ejemplo, SMTP) utilizan terminaciones de línea CR/LF.


Tenga en cuenta que algunos servidores web (por ejemplo, Apache) son más indulgentes y aceptarán líneas de solicitud que finalicen sólo con un carácter de avance de línea. La especificación HTTP permite esto, como se menciona en elSolidez del análisis de mensajessección:

Aunque el terminador de línea para los campos de línea inicial y encabezado es la secuencia CRLF, un destinatario PUEDE reconocer un único LF como terminador de línea e ignorar cualquier CR anterior.

información relacionada