You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
yanzong/vendor/qcloud/cos-sdk-v5/src/ExceptionMiddleware.php

69 lines
2.1 KiB

<?php
namespace Qcloud\Cos;
use Qcloud\Cos\Exception\ServiceResponseException;
use GuzzleHttp\Promise\PromiseInterface;
use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;
class ExceptionMiddleware {
private $nextHandler;
protected $parser;
protected $defaultException;
/**
* @param callable $nextHandler Next handler to invoke.
*/
public function __construct(callable $nextHandler) {
$this->nextHandler = $nextHandler;
$this->parser = new ExceptionParser();
$this->defaultException = 'Qcloud\Cos\Exception\ServiceResponseException';
}
/**
* @param RequestInterface $request
* @param array $options
*
* @return PromiseInterface
*/
public function __invoke(RequestInterface $request, array $options) {
$fn = $this->nextHandler;
return $fn($request, $options)->then(
function (ResponseInterface $response) use ($request) {
return $this->handle($request, $response);
}
);
}
public function handle(RequestInterface $request, ResponseInterface $response) {
$code = $response->getStatusCode();
if ($code < 400) {
return $response;
}
$parts = $this->parser->parse($request, $response);
$className = 'Qcloud\\Cos\\Exception\\' . $parts['code'];
if (substr($className, -9) !== 'Exception') {
$className .= 'Exception';
}
$className = class_exists($className) ? $className : $this->defaultException;
throw $this->createException($className, $request, $response, $parts);
}
protected function createException($className, RequestInterface $request, ResponseInterface $response, array $parts) {
$class = new $className($parts['message']);
if ($class instanceof ServiceResponseException) {
$class->setExceptionCode($parts['code']);
$class->setExceptionType($parts['type']);
$class->setResponse($response);
$class->setRequest($request);
$class->setRequestId($parts['request_id']);
}
return $class;
}
}