krz/vox-populi
A Tumblr web client.
clone: git clone https://gitbay.org/krz/vox-populi.git
main: vendor/guzzlehttp/guzzle/src/Exception/RequestException.php · raw
1<?php
2namespace GuzzleHttp\Exception;
3
4use GuzzleHttp\Promise\PromiseInterface;
5use Psr\Http\Message\RequestInterface;
6use Psr\Http\Message\ResponseInterface;
7use Psr\Http\Message\UriInterface;
8
9/**
10 * HTTP Request exception
11 */
12class RequestException extends TransferException
13{
14 /** @var RequestInterface */
15 private $request;
16
17 /** @var ResponseInterface|null */
18 private $response;
19
20 /** @var array */
21 private $handlerContext;
22
23 public function __construct(
24 $message,
25 RequestInterface $request,
26 ResponseInterface $response = null,
27 \Exception $previous = null,
28 array $handlerContext = []
29 ) {
30 // Set the code of the exception if the response is set and not future.
31 $code = $response && !($response instanceof PromiseInterface)
32 ? $response->getStatusCode()
33 : 0;
34 parent::__construct($message, $code, $previous);
35 $this->request = $request;
36 $this->response = $response;
37 $this->handlerContext = $handlerContext;
38 }
39
40 /**
41 * Wrap non-RequestExceptions with a RequestException
42 *
43 * @param RequestInterface $request
44 * @param \Exception $e
45 *
46 * @return RequestException
47 */
48 public static function wrapException(RequestInterface $request, \Exception $e)
49 {
50 return $e instanceof RequestException
51 ? $e
52 : new RequestException($e->getMessage(), $request, null, $e);
53 }
54
55 /**
56 * Factory method to create a new exception with a normalized error message
57 *
58 * @param RequestInterface $request Request
59 * @param ResponseInterface $response Response received
60 * @param \Exception $previous Previous exception
61 * @param array $ctx Optional handler context.
62 *
63 * @return self
64 */
65 public static function create(
66 RequestInterface $request,
67 ResponseInterface $response = null,
68 \Exception $previous = null,
69 array $ctx = []
70 ) {
71 if (!$response) {
72 return new self(
73 'Error completing request',
74 $request,
75 null,
76 $previous,
77 $ctx
78 );
79 }
80
81 $level = (int) floor($response->getStatusCode() / 100);
82 if ($level === 4) {
83 $label = 'Client error';
84 $className = ClientException::class;
85 } elseif ($level === 5) {
86 $label = 'Server error';
87 $className = ServerException::class;
88 } else {
89 $label = 'Unsuccessful request';
90 $className = __CLASS__;
91 }
92
93 $uri = $request->getUri();
94 $uri = static::obfuscateUri($uri);
95
96 // Client Error: `GET /` resulted in a `404 Not Found` response:
97 // <html> ... (truncated)
98 $message = sprintf(
99 '%s: `%s %s` resulted in a `%s %s` response',
100 $label,
101 $request->getMethod(),
102 $uri,
103 $response->getStatusCode(),
104 $response->getReasonPhrase()
105 );
106
107 $summary = static::getResponseBodySummary($response);
108
109 if ($summary !== null) {
110 $message .= ":\n{$summary}\n";
111 }
112
113 return new $className($message, $request, $response, $previous, $ctx);
114 }
115
116 /**
117 * Get a short summary of the response
118 *
119 * Will return `null` if the response is not printable.
120 *
121 * @param ResponseInterface $response
122 *
123 * @return string|null
124 */
125 public static function getResponseBodySummary(ResponseInterface $response)
126 {
127 return \GuzzleHttp\Psr7\get_message_body_summary($response);
128 }
129
130 /**
131 * Obfuscates URI if there is a username and a password present
132 *
133 * @param UriInterface $uri
134 *
135 * @return UriInterface
136 */
137 private static function obfuscateUri(UriInterface $uri)
138 {
139 $userInfo = $uri->getUserInfo();
140
141 if (false !== ($pos = strpos($userInfo, ':'))) {
142 return $uri->withUserInfo(substr($userInfo, 0, $pos), '***');
143 }
144
145 return $uri;
146 }
147
148 /**
149 * Get the request that caused the exception
150 *
151 * @return RequestInterface
152 */
153 public function getRequest()
154 {
155 return $this->request;
156 }
157
158 /**
159 * Get the associated response
160 *
161 * @return ResponseInterface|null
162 */
163 public function getResponse()
164 {
165 return $this->response;
166 }
167
168 /**
169 * Check if a response was received
170 *
171 * @return bool
172 */
173 public function hasResponse()
174 {
175 return $this->response !== null;
176 }
177
178 /**
179 * Get contextual information about the error from the underlying handler.
180 *
181 * The contents of this array will vary depending on which handler you are
182 * using. It may also be just an empty array. Relying on this data will
183 * couple you to a specific handler, but can give more debug information
184 * when needed.
185 *
186 * @return array
187 */
188 public function getHandlerContext()
189 {
190 return $this->handlerContext;
191 }
192}