mirror of
https://github.com/OpenXE-org/OpenXE.git
synced 2024-12-26 14:40:29 +01:00
136 lines
4.2 KiB
PHP
136 lines
4.2 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace Xentral\Components\HttpClient\Exception;
|
|
|
|
use GuzzleHttp\Exception\ClientException as GuzzleClientException;
|
|
use GuzzleHttp\Exception\ConnectException as GuzzleConnectException;
|
|
use GuzzleHttp\Exception\GuzzleException;
|
|
use GuzzleHttp\Exception\ServerException as GuzzleServerException;
|
|
use GuzzleHttp\Exception\TooManyRedirectsException as GuzzleRedirectsException;
|
|
use RuntimeException;
|
|
use Throwable;
|
|
use Xentral\Components\HttpClient\Request\ClientRequest;
|
|
use Xentral\Components\HttpClient\Request\ClientRequestInterface;
|
|
use Xentral\Components\HttpClient\Response\ServerResponse;
|
|
use Xentral\Components\HttpClient\Response\ServerResponseInterface;
|
|
|
|
class TransferErrorException extends RuntimeException implements TransferErrorExceptionInterface
|
|
{
|
|
/** @var ClientRequestInterface $request */
|
|
protected $request;
|
|
|
|
/** @var ServerResponseInterface|null $response */
|
|
protected $response;
|
|
|
|
/**
|
|
* @param string $message
|
|
* @param int $code
|
|
* @param Throwable|null $previous
|
|
* @param ClientRequestInterface|null $request
|
|
* @param ServerResponseInterface|null $response
|
|
*/
|
|
public function __construct(
|
|
$message = '',
|
|
$code = 0,
|
|
Throwable $previous = null,
|
|
ClientRequestInterface $request = null,
|
|
ServerResponseInterface $response = null
|
|
) {
|
|
parent::__construct($message, $code, $previous);
|
|
|
|
if ($request !== null) {
|
|
$this->request = $request;
|
|
}
|
|
if ($response !== null) {
|
|
$this->response = $response;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @param GuzzleException $exception
|
|
*
|
|
* @return TransferErrorExceptionInterface
|
|
*/
|
|
public static function fromGuzzleException(GuzzleException $exception): TransferErrorExceptionInterface
|
|
{
|
|
switch (get_class($exception)) {
|
|
case GuzzleConnectException::class:
|
|
$exceptionClass = ConnectionFailedException::class;
|
|
break;
|
|
case GuzzleClientException::class: // HTTP 4xx
|
|
$exceptionClass = ClientErrorException::class;
|
|
break;
|
|
case GuzzleServerException::class: // HTTP 5xx
|
|
$exceptionClass = ServerErrorException::class;
|
|
break;
|
|
case GuzzleRedirectsException::class:
|
|
$exceptionClass = TooManyRedirectsException::class;
|
|
break;
|
|
default:
|
|
$exceptionClass = TransferErrorException::class;
|
|
break;
|
|
}
|
|
|
|
$self = new $exceptionClass(
|
|
$exception->getMessage(),
|
|
$exception->getCode(),
|
|
$exception
|
|
);
|
|
|
|
// Request anhängen; immer verfügbar
|
|
$psrRequest = $exception->getRequest();
|
|
$request = ClientRequest::fromGuzzleRequest($psrRequest);
|
|
$self->request = $request;
|
|
|
|
// Response anhängen; NICHT immer verfügbar
|
|
if ($exception->hasResponse()) {
|
|
$psrResponse = $exception->getResponse();
|
|
$response = ServerResponse::fromGuzzleResponse($psrResponse);
|
|
$self->response = $response;
|
|
}
|
|
|
|
return $self;
|
|
}
|
|
|
|
/**
|
|
* @param ClientRequestInterface $request
|
|
* @param ServerResponseInterface $response
|
|
*
|
|
* @return TransferErrorExceptionInterface
|
|
*/
|
|
public static function fromClientRequest(
|
|
ClientRequestInterface $request,
|
|
ServerResponseInterface $response = null
|
|
): TransferErrorExceptionInterface {
|
|
$message = sprintf('Error Communicating with Server: %s %s', $request->getMethod(), $request->getUri());
|
|
|
|
return new self($message, 0, null, $request, $response);
|
|
}
|
|
|
|
/**
|
|
* @return bool
|
|
*/
|
|
public function hasResponse(): bool
|
|
{
|
|
return $this->response !== null;
|
|
}
|
|
|
|
/**
|
|
* @return ServerResponseInterface|null
|
|
*/
|
|
public function getResponse(): ?ServerResponseInterface
|
|
{
|
|
return $this->response;
|
|
}
|
|
|
|
/**
|
|
* @return ClientRequestInterface
|
|
*/
|
|
public function getRequest(): ClientRequestInterface
|
|
{
|
|
return $this->request;
|
|
}
|
|
}
|