Mercurial > hg > cmmr2012-drupal-site
comparison vendor/guzzlehttp/guzzle/src/functions.php @ 0:c75dbcec494b
Initial commit from drush-created site
author | Chris Cannam |
---|---|
date | Thu, 05 Jul 2018 14:24:15 +0000 |
parents | |
children | 5311817fb629 |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:c75dbcec494b |
---|---|
1 <?php | |
2 namespace GuzzleHttp; | |
3 | |
4 use GuzzleHttp\Handler\CurlHandler; | |
5 use GuzzleHttp\Handler\CurlMultiHandler; | |
6 use GuzzleHttp\Handler\Proxy; | |
7 use GuzzleHttp\Handler\StreamHandler; | |
8 | |
9 /** | |
10 * Expands a URI template | |
11 * | |
12 * @param string $template URI template | |
13 * @param array $variables Template variables | |
14 * | |
15 * @return string | |
16 */ | |
17 function uri_template($template, array $variables) | |
18 { | |
19 if (extension_loaded('uri_template')) { | |
20 // @codeCoverageIgnoreStart | |
21 return \uri_template($template, $variables); | |
22 // @codeCoverageIgnoreEnd | |
23 } | |
24 | |
25 static $uriTemplate; | |
26 if (!$uriTemplate) { | |
27 $uriTemplate = new UriTemplate(); | |
28 } | |
29 | |
30 return $uriTemplate->expand($template, $variables); | |
31 } | |
32 | |
33 /** | |
34 * Debug function used to describe the provided value type and class. | |
35 * | |
36 * @param mixed $input | |
37 * | |
38 * @return string Returns a string containing the type of the variable and | |
39 * if a class is provided, the class name. | |
40 */ | |
41 function describe_type($input) | |
42 { | |
43 switch (gettype($input)) { | |
44 case 'object': | |
45 return 'object(' . get_class($input) . ')'; | |
46 case 'array': | |
47 return 'array(' . count($input) . ')'; | |
48 default: | |
49 ob_start(); | |
50 var_dump($input); | |
51 // normalize float vs double | |
52 return str_replace('double(', 'float(', rtrim(ob_get_clean())); | |
53 } | |
54 } | |
55 | |
56 /** | |
57 * Parses an array of header lines into an associative array of headers. | |
58 * | |
59 * @param array $lines Header lines array of strings in the following | |
60 * format: "Name: Value" | |
61 * @return array | |
62 */ | |
63 function headers_from_lines($lines) | |
64 { | |
65 $headers = []; | |
66 | |
67 foreach ($lines as $line) { | |
68 $parts = explode(':', $line, 2); | |
69 $headers[trim($parts[0])][] = isset($parts[1]) | |
70 ? trim($parts[1]) | |
71 : null; | |
72 } | |
73 | |
74 return $headers; | |
75 } | |
76 | |
77 /** | |
78 * Returns a debug stream based on the provided variable. | |
79 * | |
80 * @param mixed $value Optional value | |
81 * | |
82 * @return resource | |
83 */ | |
84 function debug_resource($value = null) | |
85 { | |
86 if (is_resource($value)) { | |
87 return $value; | |
88 } elseif (defined('STDOUT')) { | |
89 return STDOUT; | |
90 } | |
91 | |
92 return fopen('php://output', 'w'); | |
93 } | |
94 | |
95 /** | |
96 * Chooses and creates a default handler to use based on the environment. | |
97 * | |
98 * The returned handler is not wrapped by any default middlewares. | |
99 * | |
100 * @throws \RuntimeException if no viable Handler is available. | |
101 * @return callable Returns the best handler for the given system. | |
102 */ | |
103 function choose_handler() | |
104 { | |
105 $handler = null; | |
106 if (function_exists('curl_multi_exec') && function_exists('curl_exec')) { | |
107 $handler = Proxy::wrapSync(new CurlMultiHandler(), new CurlHandler()); | |
108 } elseif (function_exists('curl_exec')) { | |
109 $handler = new CurlHandler(); | |
110 } elseif (function_exists('curl_multi_exec')) { | |
111 $handler = new CurlMultiHandler(); | |
112 } | |
113 | |
114 if (ini_get('allow_url_fopen')) { | |
115 $handler = $handler | |
116 ? Proxy::wrapStreaming($handler, new StreamHandler()) | |
117 : new StreamHandler(); | |
118 } elseif (!$handler) { | |
119 throw new \RuntimeException('GuzzleHttp requires cURL, the ' | |
120 . 'allow_url_fopen ini setting, or a custom HTTP handler.'); | |
121 } | |
122 | |
123 return $handler; | |
124 } | |
125 | |
126 /** | |
127 * Get the default User-Agent string to use with Guzzle | |
128 * | |
129 * @return string | |
130 */ | |
131 function default_user_agent() | |
132 { | |
133 static $defaultAgent = ''; | |
134 | |
135 if (!$defaultAgent) { | |
136 $defaultAgent = 'GuzzleHttp/' . Client::VERSION; | |
137 if (extension_loaded('curl') && function_exists('curl_version')) { | |
138 $defaultAgent .= ' curl/' . \curl_version()['version']; | |
139 } | |
140 $defaultAgent .= ' PHP/' . PHP_VERSION; | |
141 } | |
142 | |
143 return $defaultAgent; | |
144 } | |
145 | |
146 /** | |
147 * Returns the default cacert bundle for the current system. | |
148 * | |
149 * First, the openssl.cafile and curl.cainfo php.ini settings are checked. | |
150 * If those settings are not configured, then the common locations for | |
151 * bundles found on Red Hat, CentOS, Fedora, Ubuntu, Debian, FreeBSD, OS X | |
152 * and Windows are checked. If any of these file locations are found on | |
153 * disk, they will be utilized. | |
154 * | |
155 * Note: the result of this function is cached for subsequent calls. | |
156 * | |
157 * @return string | |
158 * @throws \RuntimeException if no bundle can be found. | |
159 */ | |
160 function default_ca_bundle() | |
161 { | |
162 static $cached = null; | |
163 static $cafiles = [ | |
164 // Red Hat, CentOS, Fedora (provided by the ca-certificates package) | |
165 '/etc/pki/tls/certs/ca-bundle.crt', | |
166 // Ubuntu, Debian (provided by the ca-certificates package) | |
167 '/etc/ssl/certs/ca-certificates.crt', | |
168 // FreeBSD (provided by the ca_root_nss package) | |
169 '/usr/local/share/certs/ca-root-nss.crt', | |
170 // SLES 12 (provided by the ca-certificates package) | |
171 '/var/lib/ca-certificates/ca-bundle.pem', | |
172 // OS X provided by homebrew (using the default path) | |
173 '/usr/local/etc/openssl/cert.pem', | |
174 // Google app engine | |
175 '/etc/ca-certificates.crt', | |
176 // Windows? | |
177 'C:\\windows\\system32\\curl-ca-bundle.crt', | |
178 'C:\\windows\\curl-ca-bundle.crt', | |
179 ]; | |
180 | |
181 if ($cached) { | |
182 return $cached; | |
183 } | |
184 | |
185 if ($ca = ini_get('openssl.cafile')) { | |
186 return $cached = $ca; | |
187 } | |
188 | |
189 if ($ca = ini_get('curl.cainfo')) { | |
190 return $cached = $ca; | |
191 } | |
192 | |
193 foreach ($cafiles as $filename) { | |
194 if (file_exists($filename)) { | |
195 return $cached = $filename; | |
196 } | |
197 } | |
198 | |
199 throw new \RuntimeException(<<< EOT | |
200 No system CA bundle could be found in any of the the common system locations. | |
201 PHP versions earlier than 5.6 are not properly configured to use the system's | |
202 CA bundle by default. In order to verify peer certificates, you will need to | |
203 supply the path on disk to a certificate bundle to the 'verify' request | |
204 option: http://docs.guzzlephp.org/en/latest/clients.html#verify. If you do not | |
205 need a specific certificate bundle, then Mozilla provides a commonly used CA | |
206 bundle which can be downloaded here (provided by the maintainer of cURL): | |
207 https://raw.githubusercontent.com/bagder/ca-bundle/master/ca-bundle.crt. Once | |
208 you have a CA bundle available on disk, you can set the 'openssl.cafile' PHP | |
209 ini setting to point to the path to the file, allowing you to omit the 'verify' | |
210 request option. See http://curl.haxx.se/docs/sslcerts.html for more | |
211 information. | |
212 EOT | |
213 ); | |
214 } | |
215 | |
216 /** | |
217 * Creates an associative array of lowercase header names to the actual | |
218 * header casing. | |
219 * | |
220 * @param array $headers | |
221 * | |
222 * @return array | |
223 */ | |
224 function normalize_header_keys(array $headers) | |
225 { | |
226 $result = []; | |
227 foreach (array_keys($headers) as $key) { | |
228 $result[strtolower($key)] = $key; | |
229 } | |
230 | |
231 return $result; | |
232 } | |
233 | |
234 /** | |
235 * Returns true if the provided host matches any of the no proxy areas. | |
236 * | |
237 * This method will strip a port from the host if it is present. Each pattern | |
238 * can be matched with an exact match (e.g., "foo.com" == "foo.com") or a | |
239 * partial match: (e.g., "foo.com" == "baz.foo.com" and ".foo.com" == | |
240 * "baz.foo.com", but ".foo.com" != "foo.com"). | |
241 * | |
242 * Areas are matched in the following cases: | |
243 * 1. "*" (without quotes) always matches any hosts. | |
244 * 2. An exact match. | |
245 * 3. The area starts with "." and the area is the last part of the host. e.g. | |
246 * '.mit.edu' will match any host that ends with '.mit.edu'. | |
247 * | |
248 * @param string $host Host to check against the patterns. | |
249 * @param array $noProxyArray An array of host patterns. | |
250 * | |
251 * @return bool | |
252 */ | |
253 function is_host_in_noproxy($host, array $noProxyArray) | |
254 { | |
255 if (strlen($host) === 0) { | |
256 throw new \InvalidArgumentException('Empty host provided'); | |
257 } | |
258 | |
259 // Strip port if present. | |
260 if (strpos($host, ':')) { | |
261 $host = explode($host, ':', 2)[0]; | |
262 } | |
263 | |
264 foreach ($noProxyArray as $area) { | |
265 // Always match on wildcards. | |
266 if ($area === '*') { | |
267 return true; | |
268 } elseif (empty($area)) { | |
269 // Don't match on empty values. | |
270 continue; | |
271 } elseif ($area === $host) { | |
272 // Exact matches. | |
273 return true; | |
274 } else { | |
275 // Special match if the area when prefixed with ".". Remove any | |
276 // existing leading "." and add a new leading ".". | |
277 $area = '.' . ltrim($area, '.'); | |
278 if (substr($host, -(strlen($area))) === $area) { | |
279 return true; | |
280 } | |
281 } | |
282 } | |
283 | |
284 return false; | |
285 } | |
286 | |
287 /** | |
288 * Wrapper for json_decode that throws when an error occurs. | |
289 * | |
290 * @param string $json JSON data to parse | |
291 * @param bool $assoc When true, returned objects will be converted | |
292 * into associative arrays. | |
293 * @param int $depth User specified recursion depth. | |
294 * @param int $options Bitmask of JSON decode options. | |
295 * | |
296 * @return mixed | |
297 * @throws \InvalidArgumentException if the JSON cannot be decoded. | |
298 * @link http://www.php.net/manual/en/function.json-decode.php | |
299 */ | |
300 function json_decode($json, $assoc = false, $depth = 512, $options = 0) | |
301 { | |
302 $data = \json_decode($json, $assoc, $depth, $options); | |
303 if (JSON_ERROR_NONE !== json_last_error()) { | |
304 throw new \InvalidArgumentException( | |
305 'json_decode error: ' . json_last_error_msg()); | |
306 } | |
307 | |
308 return $data; | |
309 } | |
310 | |
311 /** | |
312 * Wrapper for JSON encoding that throws when an error occurs. | |
313 * | |
314 * @param mixed $value The value being encoded | |
315 * @param int $options JSON encode option bitmask | |
316 * @param int $depth Set the maximum depth. Must be greater than zero. | |
317 * | |
318 * @return string | |
319 * @throws \InvalidArgumentException if the JSON cannot be encoded. | |
320 * @link http://www.php.net/manual/en/function.json-encode.php | |
321 */ | |
322 function json_encode($value, $options = 0, $depth = 512) | |
323 { | |
324 $json = \json_encode($value, $options, $depth); | |
325 if (JSON_ERROR_NONE !== json_last_error()) { | |
326 throw new \InvalidArgumentException( | |
327 'json_encode error: ' . json_last_error_msg()); | |
328 } | |
329 | |
330 return $json; | |
331 } |