mailgun-php/src/Exception/HttpClientException.php
2021-05-17 22:41:41 +01:00

126 lines
3.6 KiB
PHP

<?php
declare(strict_types=1);
/*
* Copyright (C) 2013 Mailgun
*
* This software may be modified and distributed under the terms
* of the MIT license. See the LICENSE file for details.
*/
namespace Mailgun\Exception;
use Mailgun\Exception;
use Psr\Http\Message\ResponseInterface;
/**
* @author Tobias Nyholm <tobias.nyholm@gmail.com>
*/
final class HttpClientException extends \RuntimeException implements Exception
{
/**
* @var ResponseInterface|null
*/
private $response;
/**
* @var array
*/
private $responseBody = [];
/**
* @var int
*/
private $responseCode;
public function __construct(string $message, int $code, ResponseInterface $response)
{
parent::__construct($message, $code);
$this->response = $response;
$this->responseCode = $response->getStatusCode();
$body = $response->getBody()->__toString();
if (0 !== strpos($response->getHeaderLine('Content-Type'), 'application/json')) {
$this->responseBody['message'] = $body;
} else {
$this->responseBody = json_decode($body, true);
}
}
public static function badRequest(ResponseInterface $response)
{
$body = $response->getBody()->__toString();
if (0 !== strpos($response->getHeaderLine('Content-Type'), 'application/json')) {
$validationMessage = $body;
} else {
$jsonDecoded = json_decode($body, true);
$validationMessage = isset($jsonDecoded['message']) ? $jsonDecoded['message'] : $body;
}
$message = sprintf("The parameters passed to the API were invalid. Check your inputs!\n\n%s", $validationMessage);
return new self($message, 400, $response);
}
public static function unauthorized(ResponseInterface $response)
{
return new self('Your credentials are incorrect.', 401, $response);
}
public static function requestFailed(ResponseInterface $response)
{
return new self('Parameters were valid but request failed. Try again.', 402, $response);
}
public static function notFound(ResponseInterface $response)
{
return new self('The endpoint you have tried to access does not exist. Check if the domain matches the domain you have configure on Mailgun.', 404, $response);
}
public static function conflict(ResponseInterface $response)
{
return new self('Request conflicts with current state of the target resource.', 409, $response);
}
public static function payloadTooLarge(ResponseInterface $response)
{
return new self('Payload too large, your total attachment size is too big.', 413, $response);
}
public static function tooManyRequests(ResponseInterface $response)
{
return new self('Too many requests.', 429, $response);
}
public static function forbidden(ResponseInterface $response)
{
$body = $response->getBody()->__toString();
if (0 !== strpos($response->getHeaderLine('Content-Type'), 'application/json')) {
$validationMessage = $body;
} else {
$jsonDecoded = json_decode($body, true);
$validationMessage = isset($jsonDecoded['Error']) ? $jsonDecoded['Error'] : $body;
}
$message = sprintf("Forbidden!\n\n%s", $validationMessage);
return new self($message, 403, $response);
}
public function getResponse(): ?ResponseInterface
{
return $this->response;
}
public function getResponseBody(): array
{
return $this->responseBody;
}
public function getResponseCode(): int
{
return $this->responseCode;
}
}