diff --git a/lib/Tmdb/Exception/TmdbApiException.php b/lib/Tmdb/Exception/TmdbApiException.php index f440440f..fa00fab7 100644 --- a/lib/Tmdb/Exception/TmdbApiException.php +++ b/lib/Tmdb/Exception/TmdbApiException.php @@ -55,16 +55,6 @@ class TmdbApiException extends \Exception const STATUS_INVALID_REQUEST_TOKEN = 33; const STATUS_RESOURCE_NOT_FOUND = 34; - /** - * @var int - */ - protected $code; - - /** - * @var string - */ - protected $message; - /** * @var Request */ @@ -78,15 +68,16 @@ class TmdbApiException extends \Exception /** * Create the exception * - * @param string $message - * @param int $code - * @param Request|null $request - * @param Response|null $response + * @param int $code + * @param string $message + * @param Request|null $request + * @param Response|null $response + * @param \Exception|null $previous */ - public function __construct($code, $message, $request = null, $response = null) + public function __construct($code, $message, $request = null, $response = null, \Exception $previous = null) { - $this->code = $code; - $this->message = $message; + parent::__construct($message, $code, $previous); + $this->request = $request; $this->response = $response; } diff --git a/lib/Tmdb/HttpClient/Adapter/AbstractAdapter.php b/lib/Tmdb/HttpClient/Adapter/AbstractAdapter.php index 5a6e6968..31a3d221 100644 --- a/lib/Tmdb/HttpClient/Adapter/AbstractAdapter.php +++ b/lib/Tmdb/HttpClient/Adapter/AbstractAdapter.php @@ -26,17 +26,19 @@ abstract class AbstractAdapter implements AdapterInterface * * @param Request $request * @param Response $response + * @param \Exception $previous * @return TmdbApiException */ - protected function createApiException(Request $request, Response $response) + protected function createApiException(Request $request, Response $response, \Exception $previous= null) { $errors = json_decode((string) $response->getBody()); return new TmdbApiException( - $errors->status_code, - $errors->status_message, + isset($errors->status_code) ? $errors->status_code : $response->getCode(), + isset($errors->status_message) ? $errors->status_message : null, $request, - $response + $response, + $previous ); } } diff --git a/lib/Tmdb/HttpClient/Adapter/GuzzleAdapter.php b/lib/Tmdb/HttpClient/Adapter/GuzzleAdapter.php index 1927d3c2..b9b98f5d 100644 --- a/lib/Tmdb/HttpClient/Adapter/GuzzleAdapter.php +++ b/lib/Tmdb/HttpClient/Adapter/GuzzleAdapter.php @@ -119,8 +119,14 @@ private function createResponse(ResponseInterface $adapterResponse = null) */ protected function handleRequestException(Request $request, RequestException $previousException) { - if (null !== $previousException && null == $previousException->getResponse()) { - throw new NullResponseException($this->request, $previousException); + if (null !== $previousException) { + $response = $previousException->getResponse(); + if(null == $response) { + throw new NullResponseException($this->request, $previousException); + } + if($response->getStatusCode() >= 500 && $response->getStatusCode() <= 599) { + throw new NullResponseException($this->request, $previousException); + } } throw $this->createApiException( diff --git a/test/Tmdb/Tests/HttpClient/Adapter/GuzzleAdapterTest.php b/test/Tmdb/Tests/HttpClient/Adapter/GuzzleAdapterTest.php index 7b4a354f..a284e5ce 100644 --- a/test/Tmdb/Tests/HttpClient/Adapter/GuzzleAdapterTest.php +++ b/test/Tmdb/Tests/HttpClient/Adapter/GuzzleAdapterTest.php @@ -298,6 +298,29 @@ public function shouldThrowNullResponseException() $adapter->get(new Request()); } + /** + * @expectedException \Tmdb\Exception\NullResponseException + * @test + */ + public function shouldThrowExceptionForServerError() + { + $client = $this->getMock('GuzzleHttp\ClientInterface'); + + $client->expects($this->once()) + ->method('get') + ->will($this->throwException( + new RequestException( + '500', + new \GuzzleHttp\Message\Request('get', '/'), + new \GuzzleHttp\Message\Response(500, [], Stream::factory('Internal Server Error')) + ) + )) + ; + + $adapter = new GuzzleAdapter($client); + $adapter->get(new Request()); + } + /** * @test */