Skip to main content
Drupal API
User account menu
  • Log in

Breadcrumb

  1. Drupal Core 11.1.x
  2. CurlFactory.php

function CurlFactory::applyHandlerOptions

1 call to CurlFactory::applyHandlerOptions()
CurlFactory::create in vendor/guzzlehttp/guzzle/src/Handler/CurlFactory.php
Creates a cURL handle resource.

File

vendor/guzzlehttp/guzzle/src/Handler/CurlFactory.php, line 435

Class

CurlFactory
Creates curl resources from a request

Namespace

GuzzleHttp\Handler

Code

private function applyHandlerOptions(EasyHandle $easy, array &$conf) : void {
    $options = $easy->options;
    if (isset($options['verify'])) {
        if ($options['verify'] === false) {
            unset($conf[\CURLOPT_CAINFO]);
            $conf[\CURLOPT_SSL_VERIFYHOST] = 0;
            $conf[\CURLOPT_SSL_VERIFYPEER] = false;
        }
        else {
            $conf[\CURLOPT_SSL_VERIFYHOST] = 2;
            $conf[\CURLOPT_SSL_VERIFYPEER] = true;
            if (\is_string($options['verify'])) {
                // Throw an error if the file/folder/link path is not valid or doesn't exist.
                if (!\file_exists($options['verify'])) {
                    throw new \InvalidArgumentException("SSL CA bundle not found: {$options['verify']}");
                }
                // If it's a directory or a link to a directory use CURLOPT_CAPATH.
                // If not, it's probably a file, or a link to a file, so use CURLOPT_CAINFO.
                if (\is_dir($options['verify']) || \is_link($options['verify']) === true && ($verifyLink = \readlink($options['verify'])) !== false && \is_dir($verifyLink)) {
                    $conf[\CURLOPT_CAPATH] = $options['verify'];
                }
                else {
                    $conf[\CURLOPT_CAINFO] = $options['verify'];
                }
            }
        }
    }
    if (!isset($options['curl'][\CURLOPT_ENCODING]) && !empty($options['decode_content'])) {
        $accept = $easy->request
            ->getHeaderLine('Accept-Encoding');
        if ($accept) {
            $conf[\CURLOPT_ENCODING] = $accept;
        }
        else {
            // The empty string enables all available decoders and implicitly
            // sets a matching 'Accept-Encoding' header.
            $conf[\CURLOPT_ENCODING] = '';
            // But as the user did not specify any encoding preference,
            // let's leave it up to server by preventing curl from sending
            // the header, which will be interpreted as 'Accept-Encoding: *'.
            // https://www.rfc-editor.org/rfc/rfc9110#field.accept-encoding
            $conf[\CURLOPT_HTTPHEADER][] = 'Accept-Encoding:';
        }
    }
    if (!isset($options['sink'])) {
        // Use a default temp stream if no sink was set.
        $options['sink'] = \GuzzleHttp\Psr7\Utils::tryFopen('php://temp', 'w+');
    }
    $sink = $options['sink'];
    if (!\is_string($sink)) {
        $sink = \GuzzleHttp\Psr7\Utils::streamFor($sink);
    }
    elseif (!\is_dir(\dirname($sink))) {
        // Ensure that the directory exists before failing in curl.
        throw new \RuntimeException(\sprintf('Directory %s does not exist for sink value of %s', \dirname($sink), $sink));
    }
    else {
        $sink = new LazyOpenStream($sink, 'w+');
    }
    $easy->sink = $sink;
    $conf[\CURLOPT_WRITEFUNCTION] = static function ($ch, $write) use ($sink) : int {
        return $sink->write($write);
    };
    $timeoutRequiresNoSignal = false;
    if (isset($options['timeout'])) {
        $timeoutRequiresNoSignal |= $options['timeout'] < 1;
        $conf[\CURLOPT_TIMEOUT_MS] = $options['timeout'] * 1000;
    }
    // CURL default value is CURL_IPRESOLVE_WHATEVER
    if (isset($options['force_ip_resolve'])) {
        if ('v4' === $options['force_ip_resolve']) {
            $conf[\CURLOPT_IPRESOLVE] = \CURL_IPRESOLVE_V4;
        }
        elseif ('v6' === $options['force_ip_resolve']) {
            $conf[\CURLOPT_IPRESOLVE] = \CURL_IPRESOLVE_V6;
        }
    }
    if (isset($options['connect_timeout'])) {
        $timeoutRequiresNoSignal |= $options['connect_timeout'] < 1;
        $conf[\CURLOPT_CONNECTTIMEOUT_MS] = $options['connect_timeout'] * 1000;
    }
    if ($timeoutRequiresNoSignal && \strtoupper(\substr(\PHP_OS, 0, 3)) !== 'WIN') {
        $conf[\CURLOPT_NOSIGNAL] = true;
    }
    if (isset($options['proxy'])) {
        if (!\is_array($options['proxy'])) {
            $conf[\CURLOPT_PROXY] = $options['proxy'];
        }
        else {
            $scheme = $easy->request
                ->getUri()
                ->getScheme();
            if (isset($options['proxy'][$scheme])) {
                $host = $easy->request
                    ->getUri()
                    ->getHost();
                if (isset($options['proxy']['no']) && Utils::isHostInNoProxy($host, $options['proxy']['no'])) {
                    unset($conf[\CURLOPT_PROXY]);
                }
                else {
                    $conf[\CURLOPT_PROXY] = $options['proxy'][$scheme];
                }
            }
        }
    }
    if (isset($options['crypto_method'])) {
        $protocolVersion = $easy->request
            ->getProtocolVersion();
        // If HTTP/2, upgrade TLS 1.0 and 1.1 to 1.2
        if ('2' === $protocolVersion || '2.0' === $protocolVersion) {
            if (\STREAM_CRYPTO_METHOD_TLSv1_0_CLIENT === $options['crypto_method'] || \STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT === $options['crypto_method'] || \STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT === $options['crypto_method']) {
                $conf[\CURLOPT_SSLVERSION] = \CURL_SSLVERSION_TLSv1_2;
            }
            elseif (defined('STREAM_CRYPTO_METHOD_TLSv1_3_CLIENT') && \STREAM_CRYPTO_METHOD_TLSv1_3_CLIENT === $options['crypto_method']) {
                if (!self::supportsTls13()) {
                    throw new \InvalidArgumentException('Invalid crypto_method request option: TLS 1.3 not supported by your version of cURL');
                }
                $conf[\CURLOPT_SSLVERSION] = \CURL_SSLVERSION_TLSv1_3;
            }
            else {
                throw new \InvalidArgumentException('Invalid crypto_method request option: unknown version provided');
            }
        }
        elseif (\STREAM_CRYPTO_METHOD_TLSv1_0_CLIENT === $options['crypto_method']) {
            $conf[\CURLOPT_SSLVERSION] = \CURL_SSLVERSION_TLSv1_0;
        }
        elseif (\STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT === $options['crypto_method']) {
            $conf[\CURLOPT_SSLVERSION] = \CURL_SSLVERSION_TLSv1_1;
        }
        elseif (\STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT === $options['crypto_method']) {
            if (!self::supportsTls12()) {
                throw new \InvalidArgumentException('Invalid crypto_method request option: TLS 1.2 not supported by your version of cURL');
            }
            $conf[\CURLOPT_SSLVERSION] = \CURL_SSLVERSION_TLSv1_2;
        }
        elseif (defined('STREAM_CRYPTO_METHOD_TLSv1_3_CLIENT') && \STREAM_CRYPTO_METHOD_TLSv1_3_CLIENT === $options['crypto_method']) {
            if (!self::supportsTls13()) {
                throw new \InvalidArgumentException('Invalid crypto_method request option: TLS 1.3 not supported by your version of cURL');
            }
            $conf[\CURLOPT_SSLVERSION] = \CURL_SSLVERSION_TLSv1_3;
        }
        else {
            throw new \InvalidArgumentException('Invalid crypto_method request option: unknown version provided');
        }
    }
    if (isset($options['cert'])) {
        $cert = $options['cert'];
        if (\is_array($cert)) {
            $conf[\CURLOPT_SSLCERTPASSWD] = $cert[1];
            $cert = $cert[0];
        }
        if (!\file_exists($cert)) {
            throw new \InvalidArgumentException("SSL certificate not found: {$cert}");
        }
        // OpenSSL (versions 0.9.3 and later) also support "P12" for PKCS#12-encoded files.
        // see https://curl.se/libcurl/c/CURLOPT_SSLCERTTYPE.html
        $ext = pathinfo($cert, \PATHINFO_EXTENSION);
        if (preg_match('#^(der|p12)$#i', $ext)) {
            $conf[\CURLOPT_SSLCERTTYPE] = strtoupper($ext);
        }
        $conf[\CURLOPT_SSLCERT] = $cert;
    }
    if (isset($options['ssl_key'])) {
        if (\is_array($options['ssl_key'])) {
            if (\count($options['ssl_key']) === 2) {
                [
                    $sslKey,
                    $conf[\CURLOPT_SSLKEYPASSWD],
                ] = $options['ssl_key'];
            }
            else {
                [
                    $sslKey,
                ] = $options['ssl_key'];
            }
        }
        $sslKey = $sslKey ?? $options['ssl_key'];
        if (!\file_exists($sslKey)) {
            throw new \InvalidArgumentException("SSL private key not found: {$sslKey}");
        }
        $conf[\CURLOPT_SSLKEY] = $sslKey;
    }
    if (isset($options['progress'])) {
        $progress = $options['progress'];
        if (!\is_callable($progress)) {
            throw new \InvalidArgumentException('progress client option must be callable');
        }
        $conf[\CURLOPT_NOPROGRESS] = false;
        $conf[\CURLOPT_PROGRESSFUNCTION] = static function ($resource, int $downloadSize, int $downloaded, int $uploadSize, int $uploaded) use ($progress) {
            $progress($downloadSize, $downloaded, $uploadSize, $uploaded);
        };
    }
    if (!empty($options['debug'])) {
        $conf[\CURLOPT_STDERR] = Utils::debugResource($options['debug']);
        $conf[\CURLOPT_VERBOSE] = true;
    }
}

API Navigation

  • Drupal Core 11.1.x
  • Topics
  • Classes
  • Functions
  • Constants
  • Globals
  • Files
  • Namespaces
  • Deprecated
  • Services
RSS feed
Powered by Drupal