Curl POST - 411 Longueur requise

29

Nous avons une API RestFUL que nous construisons en PHP. Si nous faisons la demande:

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

Nous revenons:

411 - Length Required

Bien que si nous ajoutons simplement -d ""à la demande, cela fonctionne et aucune erreur 411. Existe-t-il un moyen de ne pas exiger l'ajout de -d à la commande curl?

Nous utilisons le serveur Web lighttpd, et nous croyons que son lighttpd PAS php qui renvoie l'erreur 411.

Justin
la source

Réponses:

47

Vous avez raison - lighttpd ne prend pas en charge les demandes POST avec un corps de message vide sans un en-tête «Content-Length» défini sur zéro, et CURL envoie une telle demande. Il y a des arguments d'avant en arrière sur qui a raison, mais à mon avis, lighttpd est cassé. Un POST sans Content-Length et sans Transfer-Encoding est parfaitement légal et n'a pas de corps de message.

L'ajout -d ""entraîne l'envoi par CURL d'un en- Content-Length: 0tête, ce qui résout le problème.

Vous pouvez modifier lighttp. Recherchez le code qui génère l'erreur 411 et définissez à la place la longueur du contenu sur zéro.

David Schwartz
la source
Merci pour la grande explication, donc il n'y a aucun indicateur à passer en plus de curl -d ""ou une directive de configuration lighttpd à définir? -d ""ressemble juste à un hack.
Justin
1
C'est un hack. Si vous voulez résoudre le problème pour de vrai, vous devrez modifier lighttpd. Vous pouvez utiliser à la place -d @/dev/nullsi vous pensez que cela semble mieux. Vous pouvez également utiliser -H "Content-Length: 0". (J'ai testé les deux, ils fonctionnent.)
David Schwartz
OK merci. -d ""semble être la meilleure option.
Justin