43

We have a RestFUL API we build in PHP. If we make the request:

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

We get back:

411 - Length Required

Though if we simply add -d "" onto the request it works and no 411 error. Is there a way to not require adding -d to the curl command?

We are using lighttpd web server, and believe its lighttpd NOT php who is returning the 411 error.

Justin
  • 5,008
  • 19
  • 58
  • 82

1 Answers1

66

You are correct -- lighttpd doesn't support POST requests with an empty message body without a 'Content-Length' header set to zero, and CURL sends such a request. There's argument back and forth about who's right, but in my opinion, lighttpd is broken. A POST with no Content-Length and no Transfer-Encoding is perfectly legal and has no message body.

Adding -d "" causes CURL to send a Content-Length: 0 header, which resolves the problem.

You could modify lighttp. Find the code that issues the 411 error and instead set the content length to zero.

David Schwartz
  • 31,215
  • 2
  • 53
  • 82
  • Thanks for the great explanation, so there is no flag to pass to curl besides `-d ""` or a config lighttpd directive to set? `-d ""` just looks like a hack. – Justin Sep 27 '11 at 08:37
  • 2
    It is a hack. If you want to fix the problem for real, you'd have to modify lighttpd. You can instead use `-d @/dev/null` if you think that looks better. You can also use `-H "Content-Length: 0"`. (I tested both of these, they work.) – David Schwartz Sep 27 '11 at 08:50
  • Ok, thanks. `-d ""` seems to be the best option. – Justin Sep 27 '11 at 08:58