| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172 | <?phpnamespace Qcloud\Cos;use Qcloud\Cos\Exception\ServiceResponseException;use GuzzleHttp\Promise\PromiseInterface;use GuzzleHttp\Psr7;use Psr\Http\Message\RequestInterface;use Psr\Http\Message\ResponseInterface;use GuzzleHttp\Exception\RequestException;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;		}		//throw RequestException::create($request, $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;    }}
 |