Note: solution at the end
If I attempt to do a HTTP POST of over 1024 characters, it fails. Why? Here is a minimal example:
recipient.php:
<?php if (strlen(file_get_contents('php://input')) > 1000 || strlen($HTTP_RAW_POST_DATA) > 1000) { echo 'This was a triumph.'; } ?>
sender.php:
<?php function try_to_post($char_count) { $url = 'http://gpx3quaa.joyent.us/test/recipient.php'; $post_data = str_repeat('x', $char_count); $c = curl_init(); curl_setopt_array($c, array( CURLOPT_URL => $url, CURLOPT_HEADER => false, CURLOPT_CONNECTTIMEOUT => 999, CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => 1, CURLOPT_POSTFIELDS => $post_data ) ); $result = curl_exec($c); echo '{$result}\n'; curl_close($c); } for ($i=1020;$i<1030;$i++) { echo 'Trying {$i} - '; try_to_post($i); } ?>
output:
Trying 1020 - This was a triumph. Trying 1021 - This was a triumph. Trying 1022 - This was a triumph. Trying 1023 - This was a triumph. Trying 1024 - This was a triumph. Trying 1025 - Trying 1026 - Trying 1027 - Trying 1028 - Trying 1029 -
configuration:
PHP Version 5.2.6 libcurl/7.18.0 OpenSSL/0.9.8g zlib/1.2.3 libidn/1.8 lighttpd-1.4.19
Solution
Add the following option for cURL:
curl_setopt($ch,CURLOPT_HTTPHEADER,array('Expect:'));
The reason seems to be that any POST over 1024 character causes the ‘Expect: 100-continue’ HTTP header to be sent, and Lighttpd 1.4.* does not support it. I found a ticket for it: http://redmine.lighttpd.net/issues/show/1017
They say it works in 1.5.
You can convince PHP’s curl backend to stop doing the 100-continue-thing by setting an explicit request header:
This way you can post a request however long you would ever want and curl will not do the dual phase post.
I’ve blogged about this nearly two years ago.