Skip to content

Commit 2227989

Browse files
committed
fix: peek content in case the stream size is unknown
1 parent 109a7a1 commit 2227989

File tree

2 files changed

+77
-1
lines changed

2 files changed

+77
-1
lines changed

src/Parsers/ResponseParser.php

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,24 @@ public function parse(ResponseInterface $response): DocumentInterface
4646

4747
private function responseHasBody(ResponseInterface $response): bool
4848
{
49-
return (bool) $response->getBody()->getSize();
49+
$body = $response->getBody();
50+
$size = $body->getSize();
51+
52+
if ($size === 0) {
53+
return false;
54+
}
55+
if (is_int($size) && $size > 0) {
56+
return true;
57+
}
58+
59+
$contents = (string) $body;
60+
$hasBody = trim($contents) !== '';
61+
62+
if ($body->isSeekable()) {
63+
$body->rewind();
64+
}
65+
66+
return $hasBody;
5067
}
5168

5269
private function responseHasSuccessfulStatusCode(ResponseInterface $response): bool

tests/Parsers/ResponseParserTest.php

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
namespace Swis\JsonApi\Client\Tests\Parsers;
66

7+
use GuzzleHttp\Psr7\PumpStream;
78
use GuzzleHttp\Psr7\Response;
89
use PHPUnit\Framework\TestCase;
910
use Swis\JsonApi\Client\CollectionDocument;
@@ -59,6 +60,64 @@ public function it_parses_a_response_with_an_empty_body()
5960
$this->assertSame($response, $document->getResponse());
6061
}
6162

63+
/**
64+
* @test
65+
*/
66+
public function it_parses_a_response_with_an_empty_body_and_unknown_size()
67+
{
68+
$documentParser = $this->createMock(DocumentParser::class);
69+
$documentParser->expects($this->never())
70+
->method('parse');
71+
72+
$parser = new ResponseParser($documentParser);
73+
74+
$stream = new PumpStream(function () {
75+
return false;
76+
});
77+
78+
$response = new Response(204, [], $stream);
79+
80+
$document = $parser->parse($response);
81+
82+
$this->assertInstanceOf(Document::class, $document);
83+
$this->assertSame($response, $document->getResponse());
84+
}
85+
86+
/**
87+
* @test
88+
*/
89+
public function it_parses_a_response_with_a_body_and_unknown_size()
90+
{
91+
$json = json_encode(['meta' => ['ok' => true]]);
92+
93+
$stream = new PumpStream(function () use ($json) {
94+
static $done = false;
95+
if ($done) {
96+
return false;
97+
}
98+
$done = true;
99+
return $json;
100+
});
101+
102+
$parsedDocument = new Document();
103+
104+
$documentParser = $this->createMock(DocumentParser::class);
105+
$documentParser
106+
->expects($this->once())
107+
->method('parse')
108+
->with($this->isType('string'))
109+
->willReturn($parsedDocument);
110+
111+
$parser = new ResponseParser($documentParser);
112+
113+
$response = new Response(200, [], $stream);
114+
115+
$document = $parser->parse($response);
116+
117+
$this->assertSame($parsedDocument, $document);
118+
$this->assertSame($response, $document->getResponse());
119+
}
120+
62121
/**
63122
* @test
64123
*/

0 commit comments

Comments
 (0)