Skip to content

Commit 7728e0c

Browse files
authored
Merge pull request #516 from clue-labs/fix-empty-chunked
HTTP client: Fix empty streaming request body, omit `Transfer-Encoding: chunked`
2 parents 706edec + 9bf5456 commit 7728e0c

File tree

2 files changed

+17
-1
lines changed

2 files changed

+17
-1
lines changed

src/Io/Sender.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ public function send(RequestInterface $request)
9090
} elseif ($size === 0 && \in_array($request->getMethod(), array('POST', 'PUT', 'PATCH'))) {
9191
// only assign a "Content-Length: 0" request header if the body is expected for certain methods
9292
$request = $request->withHeader('Content-Length', '0');
93-
} elseif ($body instanceof ReadableStreamInterface && $body->isReadable() && !$request->hasHeader('Content-Length')) {
93+
} elseif ($body instanceof ReadableStreamInterface && $size !== 0 && $body->isReadable() && !$request->hasHeader('Content-Length')) {
9494
// use "Transfer-Encoding: chunked" when this is a streaming body and body size is unknown
9595
$request = $request->withHeader('Transfer-Encoding', 'chunked');
9696
} else {

tests/Io/SenderTest.php

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
use Psr\Http\Message\RequestInterface;
66
use React\Http\Client\Client as HttpClient;
77
use React\Http\Io\ClientConnectionManager;
8+
use React\Http\Io\EmptyBodyStream;
89
use React\Http\Io\ReadableBodyStream;
910
use React\Http\Io\Sender;
1011
use React\Http\Message\Request;
@@ -264,6 +265,21 @@ public function testSendGetWillNotPassContentLengthHeaderForEmptyRequestBody()
264265
$sender->send($request);
265266
}
266267

268+
public function testSendGetWithEmptyBodyStreamWillNotPassContentLengthOrTransferEncodingHeader()
269+
{
270+
$client = $this->getMockBuilder('React\Http\Client\Client')->disableOriginalConstructor()->getMock();
271+
$client->expects($this->once())->method('request')->with($this->callback(function (RequestInterface $request) {
272+
return !$request->hasHeader('Content-Length') && !$request->hasHeader('Transfer-Encoding');
273+
}))->willReturn($this->getMockBuilder('React\Http\Io\ClientRequestStream')->disableOriginalConstructor()->getMock());
274+
275+
$sender = new Sender($client);
276+
277+
$body = new EmptyBodyStream();
278+
$request = new Request('GET', 'http://www.google.com/', array(), $body);
279+
280+
$sender->send($request);
281+
}
282+
267283
public function testSendCustomMethodWillNotPassContentLengthHeaderForEmptyRequestBody()
268284
{
269285
$client = $this->getMockBuilder('React\Http\Client\Client')->disableOriginalConstructor()->getMock();

0 commit comments

Comments
 (0)