phpsoftbox / http-client
PSR-18 HTTP client implementation for the PhpSoftBox framework
Requires
- php: ^8.5
- ext-curl: *
- phpsoftbox/http-message: ^1.0
- psr/http-client: ^1.0
- psr/http-factory: ^1.0
- psr/http-message: ^2.0
Requires (Dev)
- phpsoftbox/cs-fixer: ^1.2.2
- phpunit/phpunit: ^13.3
Suggests
None
Provides
Conflicts
None
Replaces
None
This package is auto-updated.
Last update: 2026-09-29 11:53:18 UTC
README
About
phpsoftbox/http-client — базовая реализация PSR-18 клиента, построенная на cURL.
Компонент принимает PSR-17 фабрики ответа, стрима и запроса и возвращает ResponseInterface.
Все фабрики необязательны: по умолчанию используются фабрики phpsoftbox/http-message.
Ключевые особенности:
- минимальная обвязка вокруг cURL;
- поддержка любых методов и заголовков;
- таймауты по умолчанию и ограничение протоколов до
http/https; - возможность передать дополнительные
CURLOPT_*через конструктор; - исключения PSR-18 при сетевых ошибках и некорректных запросах.
Quick Start
use PhpSoftBox\Http\Client\HttpClient; use PhpSoftBox\Http\Message\RequestFactory; use PhpSoftBox\Http\Message\ResponseFactory; use PhpSoftBox\Http\Message\StreamFactory; $client = new HttpClient( new ResponseFactory(), new StreamFactory(), [ CURLOPT_CONNECTTIMEOUT_MS => 1000, CURLOPT_TIMEOUT_MS => 5000, ], ); $response = $client->post( 'https://api.example.com/v1/ping', '{"ping":true}', ['Content-Type' => 'application/json'], ); $status = $response->getStatusCode(); $body = (string) $response->getBody(); // Если нужно отключить проверку SSL: $insecureClient = $client->withoutSslVerification();
Без аргументов клиент тоже работоспособен: new HttpClient()->get('https://example.com').
Таймауты
По умолчанию действуют таймауты HttpClient::DEFAULT_CONNECT_TIMEOUT_MS (10 секунд на соединение) и
HttpClient::DEFAULT_TIMEOUT_MS (30 секунд на весь запрос), чтобы воркер не зависал на медленном сервере. Их
переопределяют CURLOPT_CONNECTTIMEOUT(_MS) и CURLOPT_TIMEOUT(_MS) в options; значение 0 снимает ограничение.
Безопасность
- Разрешены только протоколы
httpиhttps, в том числе при переходе по redirect (CURLOPT_FOLLOWLOCATIONпо умолчанию выключен). URLfile://,gopher://и т. п. даютRequestException. - Заголовок с CR, LF или NUL (возможен у запроса другой реализации PSR-7) не отправляется:
RequestException. - Опции, которыми управляет клиент, в options запрещены — конструктор бросает
InvalidArgumentException:CURLOPT_URL,CURLOPT_CUSTOMREQUEST,CURLOPT_NOBODY,CURLOPT_RETURNTRANSFER,CURLOPT_HEADER,CURLOPT_HTTPHEADER,CURLOPT_POSTFIELDS,CURLOPT_PROTOCOLS(_STR),CURLOPT_REDIR_PROTOCOLS(_STR).
Ответ
- Версия протокола и reason phrase берутся из status line ответа (
HTTP/1.0 200 All Good→1.0,All Good). При промежуточных ответах (100 Continue, redirect) используется последний. HEADвыполняется без ожидания тела (CURLOPT_NOBODY): заголовки, включаяContent-Length, возвращаются как есть.
Ошибки
NetworkException— сетевые ошибки и таймауты (PSR-18NetworkExceptionInterface).RequestException— некорректный запрос: неподдерживаемый протокол, некорректный URL, заголовок с переводом строки (PSR-18RequestExceptionInterface).HttpClientException— ошибки инициализации клиента.
Интеграции
Клиент можно напрямую передавать в компоненты, ожидающие PSR-18:
$telegram = new \PhpSoftBox\Telegram\Api\TelegramClient( token: $_ENV['TELEGRAM_BOT_TOKEN'], httpClient: $client, requestFactory: new RequestFactory(), streamFactory: new StreamFactory(), );
Требования
- PHP 8.5+
- расширение
ext-curl phpsoftbox/http-message(устанавливается как зависимость)