10namespace Bitrix\Main\Web;
13use Bitrix\Main\Config\Configuration;
14use Bitrix\Main\ArgumentException;
16use Psr\Http\Message\RequestInterface;
17use Psr\Http\Message\ResponseInterface;
18use Psr\Http\Client\ClientInterface;
19use Psr\Http\Client\ClientExceptionInterface;
20use Psr\Http\Client\NetworkExceptionInterface;
21use Http\Promise\Promise as PromiseInterface;
25 use Log\LoggerAwareTrait;
110 $defaultOptions = Configuration::getValue(
'http_client_options');
111 if ($defaultOptions !==
null)
122 if (isset(
$options[
'waitResponse']))
126 if (isset(
$options[
'socketTimeout']))
130 if (isset(
$options[
'streamTimeout']))
150 if (isset(
$options[
'disableSslVerification']) &&
$options[
'disableSslVerification'] ===
true)
154 if (isset(
$options[
'bodyLengthMax']))
176 $this->useCurl = (bool)
$options[
'useCurl'];
180 $this->curlLogFile =
$options[
'curlLogFile'];
184 $this->sendEvents = (bool)
$options[
'sendEvents'];
186 if (isset(
$options[
'responseBuilder']))
192 if ($this->useCurl && !function_exists(
'curl_init'))
194 $this->useCurl =
false;
268 $this->
setHeader(
'Content-type',
'multipart/form-data; boundary=' .
$data->getBoundary());
274 $this->
addError(
'MULTIPART', $e->getMessage(),
true);
292 $this->effectiveUrl =
$url;
293 $this->effectiveIp =
null;
296 if (is_array($entityBody))
301 if ($entityBody instanceof
Http\Stream)
305 elseif (is_resource($entityBody))
312 $body->write($entityBody ??
'');
315 $this->redirectCount = 0;
320 $uri =
new Uri($this->effectiveUrl);
330 catch (ClientExceptionInterface $e)
333 if ($e instanceof NetworkExceptionInterface)
335 $this->
addError(
'NETWORK', $e->getMessage());
347 if ($this->redirectCount < $this->redirectMax)
350 $this->headers->delete(
'Host');
353 $this->effectiveUrl = (string)(
new Uri(
$location))->resolveRelativeUri(
$uri);
361 $this->redirectCount++;
365 $this->
addError(
'REDIRECT',
"Maximum number of redirects ({$this->redirectMax}) has been reached at URL {$url}",
true);
386 if ($replace || !$this->headers->has(
$name))
388 $this->headers->set(
$name, $value);
417 return $this->request->getHeadersCollection();
427 $this->headers->clear();
438 if (!empty($cookies))
468 $this->redirect = (bool)$value;
471 $this->redirectMax = intval(
$max);
501 $this->socketTimeout = intval($value);
513 $this->streamTimeout = intval($value);
539 $this->compress = (bool)$value;
551 $this->requestCharset = $value;
562 $this->sslVerify =
false;
574 $this->privateIp = (bool)$value;
612 $this->outputStream = $handler;
659 $file =
new IO\File($filePath);
660 $handler = $file->open(
'w+');
686 $this->contextOptions = array_replace_recursive($this->contextOptions,
$options);
699 return $this->response->getHeadersCollection();
723 return $this->response->getStatusCode();
738 $body = $this->response->getBody();
740 if ($this->outputStream ===
null)
746 $body->copyTo($this->outputStream);
799 if ($this->effectiveIp)
812 trigger_error(
$message, E_USER_WARNING);
822 $punyUri =
new Uri((
string)
$uri);
823 if (($punyHost = $punyUri->convertToPunycode()) !=
$uri->getHost())
833 if (!
$request->hasHeader(
'Connection'))
841 if (!
$request->hasHeader(
'Accept-Language'))
849 if (($userInfo =
$uri->getUserInfo()) !=
'')
851 $request =
$request->withHeader(
'Authorization',
'Basic ' . base64_encode($userInfo));
853 if ($this->proxyHost !=
'' && $this->proxyUser !=
'')
855 $request =
$request->withHeader(
'Proxy-Authorization',
'Basic ' . base64_encode($this->proxyUser .
':' . $this->proxyPassword));
867 if (!
$request->hasHeader(
'Content-Type'))
870 if ($this->requestCharset !=
'')
878 $size = $body->getSize();
883 if (!
$request->hasHeader(
'Content-Length'))
885 $request =
$request->withHeader(
'Content-Length', $size ?? strlen((
string)$body));
889 if ($this->sendEvents)
895 foreach (
$event->getResults() as $eventResult)
897 $request = $eventResult->getRequest();
914 $scheme =
$uri->getScheme();
915 if ($scheme !==
'http' && $scheme !==
'https')
917 $this->
addError(
'URI_SCHEME',
'Only http and https shemes are supported.');
921 if (
$uri->getHost() ==
'')
923 $this->
addError(
'URI_HOST',
'Incorrect host in URI.');
927 $punyUri =
new Uri((
string)
$uri);
928 $error = $punyUri->convertToPunycode();
931 $this->
addError(
'URI_PUNICODE',
"Error converting hostname to punycode: {$error->getMessage()}");
935 if (!$this->privateIp)
938 if ($ip->isPrivate())
940 $this->
addError(
'PRIVATE_IP',
"Resolved IP is incorrect or private: {$ip->get()}");
943 $this->effectiveIp = $ip;
963 $this->response = $handler->execute();
982 if ($this->queue ===
null)
991 $this->queue->add($promise);
1003 if ($this->sslVerify ===
false)
1005 $this->contextOptions[
'ssl'][
'verify_peer_name'] =
false;
1006 $this->contextOptions[
'ssl'][
'verify_peer'] =
false;
1007 $this->contextOptions[
'ssl'][
'allow_self_signed'] =
true;
1023 if (!isset($this->responseBuilder))
1037 if ($this->logger !==
null)
1039 $handler->setLogger($this->logger);
1040 $handler->setDebugLevel($this->debugLevel);
1088 foreach ($this->queue->wait() as $promise)
1090 $responses[$promise->getId()] = $promise->wait();
static createDirectory($path)
static getDirectory($path)
setProxy($proxyHost, $proxyPort=null, $proxyUser=null, $proxyPassword=null)
post($url, $postData=null, $multipart=false)
shouldFetchBody(callable $callback)
setCookies(array $cookies)
setOutputStream($handler)
__construct(array $options=null)
prepareMultipart($postData)
checkRequest(RequestInterface $request)
const DEFAULT_SOCKET_TIMEOUT
const DEFAULT_STREAM_TIMEOUT_NO_WAIT
setContextOptions(array $options)
setResponseBuilder(Http\ResponseBuilderInterface $responseBuilder)
sendRequest(RequestInterface $request)
createHandler(RequestInterface $request, bool $async=false)
download($url, $filePath, string $method=Http\Method::GET, $entityBody=null)
setHeader($name, $value, $replace=true)
setAuthorization($user, $pass)
Http ResponseBuilderInterface $responseBuilder
createPromise($handler, Http\Queue $queue)
query($method, $url, $entityBody=null)
setRedirect($value, $max=null)
sendAsyncRequest(RequestInterface $request)
const DEFAULT_STREAM_TIMEOUT
setBodyLengthMax($bodyLengthMax)
setHeaders(array $headers)
addError($code, $message, $triggerWarning=false)
buildRequest(RequestInterface $request)
static createByUri(UriInterface $uri)
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
setDebugLevel(int $debugLevel)
if(!is_null($config))($config as $configItem)(! $configItem->isVisible()) $code
if(file_exists($_SERVER['DOCUMENT_ROOT'] . "/urlrewrite.php")) $uri
trait DebugInterfaceTrait
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)