123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281 |
- <?php
- namespace GuzzleHttp;
- use GuzzleHttp\Handler\CurlHandler;
- use GuzzleHttp\Handler\CurlMultiHandler;
- use GuzzleHttp\Handler\Proxy;
- use GuzzleHttp\Handler\StreamHandler;
- use Psr\Http\Message\StreamInterface;
- /**
- * Expands a URI template
- *
- * @param string $template URI template
- * @param array $variables Template variables
- *
- * @return string
- */
- function uri_template($template, array $variables)
- {
- if (extension_loaded('uri_template')) {
- // @codeCoverageIgnoreStart
- return \uri_template($template, $variables);
- // @codeCoverageIgnoreEnd
- }
- static $uriTemplate;
- if (!$uriTemplate) {
- $uriTemplate = new UriTemplate();
- }
- return $uriTemplate->expand($template, $variables);
- }
- /**
- * Debug function used to describe the provided value type and class.
- *
- * @param mixed $input
- *
- * @return string Returns a string containing the type of the variable and
- * if a class is provided, the class name.
- */
- function describe_type($input)
- {
- switch (gettype($input)) {
- case 'object':
- return 'object(' . get_class($input) . ')';
- case 'array':
- return 'array(' . count($input) . ')';
- default:
- ob_start();
- var_dump($input);
- // normalize float vs double
- return str_replace('double(', 'float(', rtrim(ob_get_clean()));
- }
- }
- /**
- * Parses an array of header lines into an associative array of headers.
- *
- * @param array $lines Header lines array of strings in the following
- * format: "Name: Value"
- * @return array
- */
- function headers_from_lines($lines)
- {
- $headers = [];
- foreach ($lines as $line) {
- $parts = explode(':', $line, 2);
- $headers[trim($parts[0])][] = isset($parts[1])
- ? trim($parts[1])
- : null;
- }
- return $headers;
- }
- /**
- * Returns a debug stream based on the provided variable.
- *
- * @param mixed $value Optional value
- *
- * @return resource
- */
- function debug_resource($value = null)
- {
- if (is_resource($value)) {
- return $value;
- } elseif (defined('STDOUT')) {
- return STDOUT;
- }
- return fopen('php://output', 'w');
- }
- /**
- * Chooses and creates a default handler to use based on the environment.
- *
- * The returned handler is not wrapped by any default middlewares.
- *
- * @throws \RuntimeException if no viable Handler is available.
- * @return callable Returns the best handler for the given system.
- */
- function choose_handler()
- {
- $handler = null;
- if (extension_loaded('curl')) {
- $handler = Proxy::wrapSync(new CurlMultiHandler(), new CurlHandler());
- }
- if (ini_get('allow_url_fopen')) {
- $handler = $handler
- ? Proxy::wrapStreaming($handler, new StreamHandler())
- : new StreamHandler();
- } elseif (!$handler) {
- throw new \RuntimeException('GuzzleHttp requires cURL, the '
- . 'allow_url_fopen ini setting, or a custom HTTP handler.');
- }
- return $handler;
- }
- /**
- * Get the default User-Agent string to use with Guzzle
- *
- * @return string
- */
- function default_user_agent()
- {
- static $defaultAgent = '';
- if (!$defaultAgent) {
- $defaultAgent = 'GuzzleHttp/' . Client::VERSION;
- if (extension_loaded('curl') && function_exists('curl_version')) {
- $defaultAgent .= ' curl/' . \curl_version()['version'];
- }
- $defaultAgent .= ' PHP/' . PHP_VERSION;
- }
- return $defaultAgent;
- }
- /**
- * Returns the default cacert bundle for the current system.
- *
- * First, the openssl.cafile and curl.cainfo php.ini settings are checked.
- * If those settings are not configured, then the common locations for
- * bundles found on Red Hat, CentOS, Fedora, Ubuntu, Debian, FreeBSD, OS X
- * and Windows are checked. If any of these file locations are found on
- * disk, they will be utilized.
- *
- * Note: the result of this function is cached for subsequent calls.
- *
- * @return string
- * @throws \RuntimeException if no bundle can be found.
- */
- function default_ca_bundle()
- {
- static $cached = null;
- static $cafiles = [
- // Red Hat, CentOS, Fedora (provided by the ca-certificates package)
- '/etc/pki/tls/certs/ca-bundle.crt',
- // Ubuntu, Debian (provided by the ca-certificates package)
- '/etc/ssl/certs/ca-certificates.crt',
- // FreeBSD (provided by the ca_root_nss package)
- '/usr/local/share/certs/ca-root-nss.crt',
- // OS X provided by homebrew (using the default path)
- '/usr/local/etc/openssl/cert.pem',
- // Google app engine
- '/etc/ca-certificates.crt',
- // Windows?
- 'C:\\windows\\system32\\curl-ca-bundle.crt',
- 'C:\\windows\\curl-ca-bundle.crt',
- ];
- if ($cached) {
- return $cached;
- }
- if ($ca = ini_get('openssl.cafile')) {
- return $cached = $ca;
- }
- if ($ca = ini_get('curl.cainfo')) {
- return $cached = $ca;
- }
- foreach ($cafiles as $filename) {
- if (file_exists($filename)) {
- return $cached = $filename;
- }
- }
- throw new \RuntimeException(<<< EOT
- No system CA bundle could be found in any of the the common system locations.
- PHP versions earlier than 5.6 are not properly configured to use the system's
- CA bundle by default. In order to verify peer certificates, you will need to
- supply the path on disk to a certificate bundle to the 'verify' request
- option: http://docs.guzzlephp.org/en/latest/clients.html#verify. If you do not
- need a specific certificate bundle, then Mozilla provides a commonly used CA
- bundle which can be downloaded here (provided by the maintainer of cURL):
- https://raw.githubusercontent.com/bagder/ca-bundle/master/ca-bundle.crt. Once
- you have a CA bundle available on disk, you can set the 'openssl.cafile' PHP
- ini setting to point to the path to the file, allowing you to omit the 'verify'
- request option. See http://curl.haxx.se/docs/sslcerts.html for more
- information.
- EOT
- );
- }
- /**
- * Creates an associative array of lowercase header names to the actual
- * header casing.
- *
- * @param array $headers
- *
- * @return array
- */
- function normalize_header_keys(array $headers)
- {
- $result = [];
- foreach (array_keys($headers) as $key) {
- $result[strtolower($key)] = $key;
- }
- return $result;
- }
- /**
- * Returns true if the provided host matches any of the no proxy areas.
- *
- * This method will strip a port from the host if it is present. Each pattern
- * can be matched with an exact match (e.g., "foo.com" == "foo.com") or a
- * partial match: (e.g., "foo.com" == "baz.foo.com" and ".foo.com" ==
- * "baz.foo.com", but ".foo.com" != "foo.com").
- *
- * Areas are matched in the following cases:
- * 1. "*" (without quotes) always matches any hosts.
- * 2. An exact match.
- * 3. The area starts with "." and the area is the last part of the host. e.g.
- * '.mit.edu' will match any host that ends with '.mit.edu'.
- *
- * @param string $host Host to check against the patterns.
- * @param array $noProxyArray An array of host patterns.
- *
- * @return bool
- */
- function is_host_in_noproxy($host, array $noProxyArray)
- {
- if (strlen($host) === 0) {
- throw new \InvalidArgumentException('Empty host provided');
- }
- // Strip port if present.
- if (strpos($host, ':')) {
- $host = explode($host, ':', 2)[0];
- }
- foreach ($noProxyArray as $area) {
- // Always match on wildcards.
- if ($area === '*') {
- return true;
- } elseif (empty($area)) {
- // Don't match on empty values.
- continue;
- } elseif ($area === $host) {
- // Exact matches.
- return true;
- } else {
- // Special match if the area when prefixed with ".". Remove any
- // existing leading "." and add a new leading ".".
- $area = '.' . ltrim($area, '.');
- if (substr($host, -(strlen($area))) === $area) {
- return true;
- }
- }
- }
- return false;
- }
|