diff --git a/src/Io/Sender.php b/src/Io/Sender.php index 3598d31a..1d563891 100644 --- a/src/Io/Sender.php +++ b/src/Io/Sender.php @@ -90,7 +90,7 @@ public function send(RequestInterface $request) } elseif ($size === 0 && \in_array($request->getMethod(), array('POST', 'PUT', 'PATCH'))) { // only assign a "Content-Length: 0" request header if the body is expected for certain methods $request = $request->withHeader('Content-Length', '0'); - } elseif ($body instanceof ReadableStreamInterface && $body->isReadable() && !$request->hasHeader('Content-Length')) { + } elseif ($body instanceof ReadableStreamInterface && $size !== 0 && $body->isReadable() && !$request->hasHeader('Content-Length')) { // use "Transfer-Encoding: chunked" when this is a streaming body and body size is unknown $request = $request->withHeader('Transfer-Encoding', 'chunked'); } else { diff --git a/tests/Io/SenderTest.php b/tests/Io/SenderTest.php index 3c8c4761..03a9b56e 100644 --- a/tests/Io/SenderTest.php +++ b/tests/Io/SenderTest.php @@ -5,6 +5,7 @@ use Psr\Http\Message\RequestInterface; use React\Http\Client\Client as HttpClient; use React\Http\Io\ClientConnectionManager; +use React\Http\Io\EmptyBodyStream; use React\Http\Io\ReadableBodyStream; use React\Http\Io\Sender; use React\Http\Message\Request; @@ -264,6 +265,21 @@ public function testSendGetWillNotPassContentLengthHeaderForEmptyRequestBody() $sender->send($request); } + public function testSendGetWithEmptyBodyStreamWillNotPassContentLengthOrTransferEncodingHeader() + { + $client = $this->getMockBuilder('React\Http\Client\Client')->disableOriginalConstructor()->getMock(); + $client->expects($this->once())->method('request')->with($this->callback(function (RequestInterface $request) { + return !$request->hasHeader('Content-Length') && !$request->hasHeader('Transfer-Encoding'); + }))->willReturn($this->getMockBuilder('React\Http\Io\ClientRequestStream')->disableOriginalConstructor()->getMock()); + + $sender = new Sender($client); + + $body = new EmptyBodyStream(); + $request = new Request('GET', 'http://www.google.com/', array(), $body); + + $sender->send($request); + } + public function testSendCustomMethodWillNotPassContentLengthHeaderForEmptyRequestBody() { $client = $this->getMockBuilder('React\Http\Client\Client')->disableOriginalConstructor()->getMock();