Skip to content
This repository has been archived by the owner on Oct 24, 2023. It is now read-only.

Commit

Permalink
feat(Client): log response body and headers of api exceptions
Browse files Browse the repository at this point in the history
Closes #186
  • Loading branch information
Jens Schulze committed Mar 22, 2016
1 parent f346dc5 commit f371979
Show file tree
Hide file tree
Showing 2 changed files with 112 additions and 0 deletions.
26 changes: 26 additions & 0 deletions src/Client.php
Original file line number Diff line number Diff line change
Expand Up @@ -242,6 +242,7 @@ public function execute(ClientRequestInterface $request)
throw $exception;
}
$response = $exception->getResponse();
$this->logException($exception);
}
$this->logDeprecatedRequest($response, $httpRequest);

Expand Down Expand Up @@ -308,6 +309,7 @@ public function executeBatch()
) {
throw $httpResponse;
}
$this->logException($httpResponse);
$httpResponse = $httpResponse->getResponse();
}
$responses[$request->getIdentifier()] = $request->buildResponse($httpResponse);
Expand All @@ -319,6 +321,30 @@ public function executeBatch()
return $responses;
}

/**
* @param $exception
* @return $this
*/
protected function logException(ApiException $exception)
{
if (is_null($this->logger)) {
return $this;
}
$response = $exception->getResponse();

$context = [];
if ($response instanceof ResponseInterface) {
$context = [
'responseStatusCode' => $response->getStatusCode(),
'responseHeaders' => $response->getHeaders(),
'responseBody' => (string)$response->getBody(),
];
}
$this->logger->error($exception->getMessage(), $context);

return $this;
}

/**
* @param ResponseInterface $response
* @param RequestInterface $request
Expand Down
86 changes: 86 additions & 0 deletions tests/unit/ClientTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -355,6 +355,92 @@ public function testLogDeprecatedMethod()
);
}

public function testLoggingBody()
{
$handler = new TestHandler();
$logger = new Logger('test');
$logger->pushHandler($handler);

$errorBody = '
{
"statusCode": 400,
"message": "Some error",
"errors": [
{
"code": "InvalidOperation",
"message": "Some error"
}
]
}';
$client = $this->getMockClient(
$this->getConfig(),
$errorBody,
400,
$logger
);

$endpoint = new JsonEndpoint('test');
/**
* @var ClientRequestInterface $request
*/
$request = $this->getMockForAbstractClass(
'\Commercetools\Core\Request\AbstractByIdGetRequest',
[$endpoint, 'id']
);
$client->execute($request);

$logEntry = $handler->getRecords()[1];
$this->assertSame(Logger::ERROR, $logEntry['level']);
$this->assertSame(
'Client error response [url] test/id [status code] 400 [reason phrase] Bad Request',
(string)$logEntry['message']
);
$this->assertJsonStringEqualsJsonString($errorBody, $logEntry['context']['responseBody']);
}

public function testLoggingBatchBody()
{
$handler = new TestHandler();
$logger = new Logger('test');
$logger->pushHandler($handler);

$errorBody = '
{
"statusCode": 400,
"message": "Some error",
"errors": [
{
"code": "InvalidOperation",
"message": "Some error"
}
]
}';
$client = $this->getMockClient(
$this->getConfig(),
$errorBody,
400,
$logger
);

$endpoint = new JsonEndpoint('test');
/**
* @var ClientRequestInterface $request
*/
$request = $this->getMockForAbstractClass(
'\Commercetools\Core\Request\AbstractByIdGetRequest',
[$endpoint, 'id']
);
$client->addBatchRequest($request);
$client->executeBatch();

$logEntry = $handler->getRecords()[1];
$this->assertSame(Logger::ERROR, $logEntry['level']);
$this->assertSame(
'Client error response [url] test/id [status code] 400 [reason phrase] Bad Request',
(string)$logEntry['message']
);
$this->assertJsonStringEqualsJsonString($errorBody, $logEntry['context']['responseBody']);
}
/**
* @expectedException \Commercetools\Core\Error\ApiException
*/
Expand Down

0 comments on commit f371979

Please # to comment.