<?php
namespace GuzzleHttp\Command\Exception;
use GuzzleHttp\Exception\GuzzleException;
use GuzzleHttp\Exception\RequestException;
use GuzzleHttp\Command\CommandInterface;
use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;
class CommandException extends \RuntimeException implements GuzzleException
{
private $command;
private $request;
private $response;
public static function fromPrevious(CommandInterface $command, \Exception $prev)
{
if ($prev instanceof self && $command === $prev->getCommand()) {
return $prev;
}
$request = $response = null;
if ($prev instanceof RequestException) {
$request = $prev->getRequest();
$response = $prev->getResponse();
}
$class = self::class;
$statusCode = $response ? $response->getStatusCode() : 0;
if ($statusCode >= 400 && $statusCode < 500) {
$class = CommandClientException::class;
} elseif ($statusCode >= 500 && $statusCode < 600) {
$class = CommandServerException::class;
}
$message = 'There was an error executing the ' . $command->getName()
. ' command: ' . $prev->getMessage();
return new $class($message, $command, $prev, $request, $response);
}
public function __construct(
$message,
CommandInterface $command,
\Exception $previous = null,
RequestInterface $request = null,
ResponseInterface $response = null
) {
$this->command = $command;
$this->request = $request;
$this->response = $response;
parent::__construct($message, 0, $previous);
}
public function getCommand()
{
return $this->command;
}
public function getRequest()
{
return $this->request;
}
public function getResponse()
{
return $this->response;
}
}