• Модуль: main
  • Путь к файлу: ~/bitrix/modules/main/lib/web/http/curl/handler.php
  • Класс: BitrixMainWebHttpCurlHandler
  • Вызов: Handler::setOptions
protected function setOptions(array $options): void
{
	$request = $this->request;
	$uri = $request->getUri();

	$curlOptions = [
		CURLOPT_URL => (string)$uri,
		CURLOPT_HEADER => false,
		CURLOPT_RETURNTRANSFER => false,
		CURLOPT_FOLLOWLOCATION => false,
		CURLOPT_HTTP_VERSION => ($request->getProtocolVersion() === '1.1' ? CURL_HTTP_VERSION_1_1 : CURL_HTTP_VERSION_1_0),
		CURLOPT_CONNECTTIMEOUT => (int)($options['socketTimeout'] ?? 30),
		CURLOPT_LOW_SPEED_TIME => (int)($options['streamTimeout'] ?? 60),
		CURLOPT_LOW_SPEED_LIMIT => 1, // bytes/sec
		CURLOPT_HTTPHEADER => $this->buildHeaders(),
	];

	if (isset($options['contextOptions']['ssl']['verify_peer']))
	{
		$curlOptions[CURLOPT_SSL_VERIFYPEER] = (bool)$options['contextOptions']['ssl']['verify_peer'];
	}
	if (isset($options['contextOptions']['ssl']['verify_peer_name']))
	{
		$curlOptions[CURLOPT_SSL_VERIFYHOST] = $options['contextOptions']['ssl']['verify_peer_name'] ? 2 : 0;
	}

	$method = $request->getMethod();
	if ($method === 'HEAD')
	{
		$curlOptions[CURLOPT_NOBODY] = true;
	}
	else
	{
		$curlOptions[CURLOPT_CUSTOMREQUEST] = $method;
	}

	if (isset($options['effectiveIp']) && $options['effectiveIp'] instanceof IpAddress)
	{
		//resolved in HttpClient if private IPs were disabled
		$curlOptions[CURLOPT_RESOLVE] = [$uri->getHost() . ':' . $uri->getPort() . ':' . $options['effectiveIp']];
	}

	if (isset($options['proxyHost']))
	{
		$curlOptions[CURLOPT_PROXY] = (string)$options['proxyHost'];

		if (isset($options['proxyPort']))
		{
			$curlOptions[CURLOPT_PROXYPORT] = (int)$options['proxyPort'];
		}
	}

	if ($method != 'GET' && $method != 'HEAD' && $method != 'TRACE')
	{
		$body = $request->getBody();
		$size = $body->getSize();

		if ($size !== 0)
		{
			if ($body->isSeekable())
			{
				$body->rewind();
			}

			$curlOptions[CURLOPT_UPLOAD] = true;

			if ($size !== null)
			{
				$curlOptions[CURLOPT_INFILESIZE] = $size;
			}

			$curlOptions[CURLOPT_READFUNCTION] = [$this, 'readRequestBody'];
		}
	}

	$curlOptions[CURLOPT_HEADERFUNCTION] = [$this, 'receiveHeaders'];

	$curlOptions[CURLOPT_WRITEFUNCTION] = [$this, 'receiveBody'];

	if (!empty($options['curlLogFile']))
	{
		$this->logFileHandle = fopen($options['curlLogFile'], 'a+');
		$curlOptions[CURLOPT_STDERR] = $this->logFileHandle;
		$curlOptions[CURLOPT_VERBOSE] = true;
	}

	curl_setopt_array($this->handle, $curlOptions);
}