/** * Factory method to create a new exception with a normalized error message * * @param RequestInterface $request Request * @param ResponseInterface $response Response received * @param \Exception $previous Previous exception * * @return self */ public static function create(RequestInterface $request, ResponseInterface $response = null, \Exception $previous = null) { if (!$response) { return new self('Error completing request', $request, null, $previous); } $level = floor($response->getStatusCode() / 100); if ($level == '4') { $label = 'Client error response'; $className = __NAMESPACE__ . '\\ClientException'; } elseif ($level == '5') { $label = 'Server error response'; $className = __NAMESPACE__ . '\\ServerException'; } else { $label = 'Unsuccessful response'; $className = __CLASS__; } $message = $label . ' [url] ' . $request->getUrl() . ' [status code] ' . $response->getStatusCode() . ' [reason phrase] ' . $response->getReasonPhrase(); return new $className($message, $request, $response, $previous); }
/** * Set the appropriate URL on the request based on the location header * * @param RequestInterface $request * @param ResponseInterface $response * @param array $protocols */ private function setRedirectUrl(RequestInterface $request, ResponseInterface $response, array $protocols) { $location = $response->getHeader('Location'); $location = Url::fromString($location); // Combine location with the original URL if it is not absolute. if (!$location->isAbsolute()) { $originalUrl = Url::fromString($request->getUrl()); // Remove query string parameters and just take what is present on // the redirect Location header $originalUrl->getQuery()->clear(); $location = $originalUrl->combine($location); } // Ensure that the redirect URL is allowed based on the protocols. if (!in_array($location->getScheme(), $protocols)) { throw new BadResponseException(sprintf('Redirect URL, %s, does not use one of the allowed redirect protocols: %s', $location, implode(', ', $protocols)), $request, $response); } $request->setUrl($location); }