Curl POST - 411 Longitud requerida

29

Tenemos una API RestFUL que construimos en PHP. Si hacemos la solicitud:

curl -u api-key:api-passphrase https://api.domain.com/v1/product -X POST

Volvemos:

411 - Length Required

Aunque si simplemente agregamos -d ""a la solicitud, funciona y no hay error 411. ¿Hay alguna manera de no requerir agregar -d al comando curl?

Estamos usando el servidor web lighttpd, y creemos que es lighttpd NO php quien está devolviendo el error 411.

Justin
fuente

Respuestas:

47

Tiene razón: lighttpd no admite solicitudes POST con un cuerpo de mensaje vacío sin un encabezado 'Content-Length' establecido en cero, y CURL envía dicha solicitud. Hay discusiones de ida y vuelta sobre quién tiene razón, pero en mi opinión, lighttpd está roto. Una POST sin contenido de longitud y sin codificación de transferencia es perfectamente legal y no tiene cuerpo de mensaje.

Agregar -d ""hace que CURL envíe un Content-Length: 0encabezado, lo que resuelve el problema.

Puedes modificar lighttp. Encuentre el código que emite el error 411 y, en su lugar, configure la longitud del contenido en cero.

David Schwartz
fuente
Gracias por la gran explicación, por lo que no hay una bandera para pasar a curl además -d ""o una directiva config lighttpd para configurar. -d ""solo parece un truco.
Justin
1
Es un hack. Si desea solucionar el problema de verdad, tendría que modificar lighttpd. En su lugar, puede usarlo -d @/dev/nullsi cree que se ve mejor. También puedes usar -H "Content-Length: 0". (Probé ambos, funcionan).
David Schwartz
Vale gracias. -d ""Parece ser la mejor opción.
Justin