Edit report at https://bugs.php.net/bug.php?id=60826&edit=1
ID: 60826
Comment by: florian dot fernandez at navaho dot fr
Reported by: clarkwise at gmail dot com
Summary: raw POST data missing with chunked encoding, FastCGI
Status: Assigned
Type: Bug
Package: CGI/CLI related
Operating System: Windows XP
PHP Version: 5.3.9
Assigned To: ab
Block user comment: N
Private report: N
New Comment:
Same problem here. Apache 2.2.15 and PHP 5.3.10 running as FastCGI.
POST datas sent with "Transfer-encoding: chunked" are not received as they
should be. The raw request looks like this :
POST receiveChunk.php HTTP/1.1
User-Agent: PECL::HTTP/1.7.2 (PHP/5.3.8)
Host: www.test.fr
Accept: */*
Pragma: no-cache
Connection: keep-alive
Cache-Control: no-cache
Content-Length: 682668
Transfer-Encoding: chunked
Content-Type: text/html; charset=UTF-8
3ff4
(here, the datas)
0
and the request as the receiving script sees it :
User-Agent: PECL::HTTP/1.7.2 (PHP/5.3.8)
Host: www.test.fr
Accept: */*
Pragma: no-cache
Connection: close
Cache-Control: no-cache
As you can see, the request body is empty.
However, this problem does not occur when PHP runs as mod_php under Apache.
Problem confirmed under PHP 5.3.8 and 5.3.9.
I don't know if that is a PHP bug and maybe the developers could confirm or not
that the request body are wrong before it reaches PHP. I think that it appears
to be a mod_fcgid bug and should be reported as one to Apache bug list.
Here are the scripts to reproduce the bug :
sendChunk.php :
<?php
$fileContentToUp = 'ICAgICAgICAgIgICAgIA==';
$header_array = array(
'Pragma' => 'no-cache',
'Connection' => 'keep-alive',
'Cache-Control' => 'no-cache',
'Content-Length' => strlen($fileContentToUp) ,
'Transfer-Encoding' => 'chunked'
);
$options = array(headers => $header_array);
$r = new HttpRequest('receiveChunk.php', HTTP_METH_POST, $options);
$r->setContentType('text/html; charset=UTF-8');
$r->setBody($fileContentToUp);
$result = $r->send();
echo '$r->getRawRequestMessage() => ';
print_r($r->getRawRequestMessage());
echo "\n\n";
echo '$r->send()->getBody() => ';
print_r($r->send()->getBody());
echo "\n\n";
?>
receiveChunk.php :
<?php
$HttpResponse = new HttpResponse();
echo 'http_get_request_header => '."\n";
print_r($HttpResponse->getRequestHeaders());
echo "\n\n";
echo 'http_get_request_body => '."\n";
print_r($HttpResponse->getRequestBody());
echo "\n\n";
?>
Hope that helps.
Previous Comments:
------------------------------------------------------------------------
[2012-03-01 20:24:53] clarkwise at gmail dot com
Since I am using Windows XP, I'm stuck using IIS 5.1. When I have the
opportunity
to try nginx w/ chunkin or IIS 7.5, I'll update with further details. Thanks.
------------------------------------------------------------------------
[2012-03-01 08:31:15] [email protected]
@clarkwise at gmail dot com
So could you confirm it works with nginx+chunkin?
As well, it's was not hanging with IIS (v7.5) for me. Which IIS version do you
have?
------------------------------------------------------------------------
[2012-02-09 19:17:27] [email protected]
I've additionally tested the two files on nginx with PHP as FCGI. The request
simply doesn't go throught to PHP and nginx gives 401 back. I've attached gdb
to the PHP and set a break in the accept loop - there was no reaction when
using the two test files, but requests without data got down to PHP. So my
conclusion were - apache simply ignores the request body where nginx gives a
correct http status. Anyways, this has nothing to do with PHP. IIS, Apache and
Nginx seem to have no implementation for chunked incoming body stuff, but they
do handle that a different way.
Btw. Nginx has the "chunkin" module for such actions.
------------------------------------------------------------------------
[2012-02-02 00:35:42] timo dot witte at googlemail dot com
I have the same problem on my machine and can confirm this bug!
i think this bug affects mod_spdy aswell, because it sends the POST data
chunked!
( http://code.google.com/p/mod-spdy/issues/detail?id=22 ).
------------------------------------------------------------------------
[2012-01-20 21:15:54] clarkwise at gmail dot com
Description:
------------
When a POST is sent with the header "Transfer-Encoding: chunked" and PHP 5.3 is
running via FastCGI, $HTTP_RAW_POST_DATA is not set. In IIS, the receiving PHP
process simply hangs and does not execute at all. If chunked encoding is not
set,
it executes successfully and $HTTP_RAW_POST_DATA is populated.
Comparing ISAPI to FastCGI (using PHP 5.2 which has both implementations), PHP
ISAPI works fine with "Transfer-Encoding: chunked" but PHP FastCGI does not.
This issue also occurred running Linux/Apache with PHP 5.3 FastCGI. In that
scenario, the PHP process did not completely hang, but $HTTP_RAW_POST_DATA and
php://input were empty when the script executed.
Test script:
---------------
Two files, postsend.php and postreceive.php, can be found within the question
here:
http://stackoverflow.com/questions/8899239/http-raw-post-data-not-being-populated-after-upgrade-to-php-5-3
Expected result:
----------------
$HTTP_RAW_POST_DATA and the php://input stream should contain the raw binary
data
that was sent in the POST.
Actual result:
--------------
On Windows/IIS, the PHP process hangs and does not execute.
On Linux/Apache, the PHP process executes but $HTTP_RAW_POST_DATA and
php://input
are empty.
------------------------------------------------------------------------
--
Edit this bug report at https://bugs.php.net/bug.php?id=60826&edit=1