Skip to content

Commit 7c216db

Browse files
authored
Merge pull request #41 from contentful/fix/github-40-guzzle-exception
Fix/GitHub 40 guzzle exception
2 parents 7de178d + 0eaad96 commit 7c216db

File tree

3 files changed

+81
-2
lines changed

3 files changed

+81
-2
lines changed

src/Api/Requester.php

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
use GuzzleHttp\Client as HttpClient;
1515
use GuzzleHttp\Exception\ClientException;
1616
use function GuzzleHttp\json_decode as guzzle_json_decode;
17+
use InvalidArgumentException;
1718
use Psr\Http\Message\RequestInterface;
1819

1920
class Requester
@@ -82,8 +83,12 @@ private function createCustomException(ClientException $exception): Exception
8283
$errorId = '';
8384
$response = $exception->getResponse();
8485
if ($response) {
85-
$data = guzzle_json_decode((string) $response->getBody(), true);
86-
$errorId = (string) $data['sys']['id'] ?? '';
86+
try {
87+
$data = guzzle_json_decode((string) $response->getBody(), true);
88+
$errorId = (string) $data['sys']['id'] ?? '';
89+
} catch (InvalidArgumentException $invalidArgumentException) {
90+
$errorId = 'InvalidResponseBody';
91+
}
8792
}
8893

8994
$exceptionClass = $this->getExceptionClass($errorId);
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
<?php
2+
3+
/**
4+
* This file is part of the contentful/contentful-core package.
5+
*
6+
* @copyright 2015-2020 Contentful GmbH
7+
* @license MIT
8+
*/
9+
10+
declare(strict_types=1);
11+
12+
namespace Contentful\Core\Exception;
13+
14+
use Contentful\Core\Api\Exception;
15+
16+
/**
17+
* A InvalidResponseBodyException indicates that there was problem with response body.
18+
*/
19+
class InvalidResponseBodyException extends Exception
20+
{
21+
}
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
<?php
2+
3+
/**
4+
* This file is part of the contentful/contentful-core package.
5+
*
6+
* @copyright 2015-2020 Contentful GmbH
7+
* @license MIT
8+
*/
9+
10+
declare(strict_types=1);
11+
12+
namespace Contentful\Tests\Core\Unit\Exception;
13+
14+
use Contentful\Core\Api\Requester;
15+
use Contentful\Core\Exception\InvalidResponseBodyException;
16+
use Contentful\Tests\TestCase;
17+
use GuzzleHttp\Client as HttpClient;
18+
use GuzzleHttp\Exception\ClientException;
19+
use GuzzleHttp\Handler\CurlHandler;
20+
use GuzzleHttp\HandlerStack;
21+
use GuzzleHttp\Psr7\Request;
22+
use GuzzleHttp\Psr7\Response;
23+
use Psr\Http\Message\RequestInterface;
24+
25+
class InvalidResponseBodyExceptionTest extends TestCase
26+
{
27+
public function testInvalidResponseException()
28+
{
29+
$response = new Response(200, [], '{}');
30+
$handler = function (RequestInterface $request, array $options) use ($response) {
31+
return $response;
32+
};
33+
$httpClient = $this->createHttpClient($handler);
34+
$requester = new Requester($httpClient, 'DELIVERY');
35+
36+
$request = new Request('GET', 'https://www.example.com/some-page');
37+
$message = $requester->sendRequest($request);
38+
$this->assertInstanceOf(InvalidResponseBodyException::class, $message->getException());
39+
}
40+
41+
public function createHttpClient(callable $handlerOverride = \null)
42+
{
43+
$stack = new HandlerStack();
44+
$stack->setHandler(new CurlHandler());
45+
$stack->push(function (callable $handler) use ($handlerOverride) {
46+
return function (RequestInterface $request, array $options) use ($handler, $handlerOverride) {
47+
throw new ClientException('Foo', $request, new Response(500, [], 'FOO'));
48+
};
49+
});
50+
51+
return new HttpClient(['handler' => $stack]);
52+
}
53+
}

0 commit comments

Comments
 (0)