cloud-castle / http-request
Быстрая и безопасная PSR-7/PSR-17 реализация HTTP-сообщений для PHP 8.1+: неизменяемые Request, Uri, Stream и фабрики, fail-loud, без утечки данных в исключениях.
Requires
- php: >=8.1
- psr/http-factory: ^1.0
- psr/http-message: ^1.1 || ^2.0
Requires (Dev)
- deptrac/deptrac: ^3.0 || ^4.0
- ergebnis/composer-normalize: ^2.45
- friendsofphp/php-cs-fixer: ^3.75
- guzzlehttp/psr7: ^2.7
- httpsoft/http-message: ^1.1
- icanhazstring/composer-unused: ^0.9
- infection/infection: ^0.29 || ^0.33
- laminas/laminas-diactoros: ^3.5
- nyholm/psr7: ^1.8
- php-parallel-lint/php-parallel-lint: ^1.4
- phpmd/phpmd: ^2.15
- phpstan/extension-installer: ^1.4
- phpstan/phpstan: ^1.12 || ^2.1
- phpstan/phpstan-deprecation-rules: ^1.2 || ^2.0
- phpstan/phpstan-phpunit: ^1.4 || ^2.0
- phpstan/phpstan-strict-rules: ^1.6 || ^2.0
- phpunit/phpunit: ^10.5 || ^11.5
- psalm/plugin-phpunit: ^0.19 || ^0.20
- rector/rector: ^1.2 || ^2.0
- roave/security-advisories: dev-latest
- slim/psr7: ^1.7
- squizlabs/php_codesniffer: ^3.12 || ^4.0
- vimeo/psalm: ^6.0
- webmozart/assert: ^1.11
Provides
This package is auto-updated.
Last update: 2026-07-30 05:58:59 UTC
README
🇷🇺 Русский · 🇬🇧 English · 🇩🇪 Deutsch · 🇫🇷 Français · 🇪🇸 Español · 🇮🇹 Italiano
CloudCastle Http Request
Быстрая и безопасная реализация PSR-7/PSR-17 для PHP 8.1+: неизменяемые
Request,Uri,Streamи фабрики. Fail-loud на любом некорректном вводе, строгая валидация метода и заголовков (RFC 7230), а исключения не содержат значений заголовков и данных — безопасно для логов с персональными данными. Единственные зависимости — контрактыpsr/http-*.
Установка
composer require cloud-castle/http-request
Требуется PHP 8.1+ и расширение ext-* не нужно — только контракты PSR.
Быстрый старт
<?php
use CloudCastle\Http\Request\Request;
use CloudCastle\Http\Request\Stream;
use CloudCastle\Http\Request\Uri;
// Собрать исходящий запрос (неизменяемый, заголовок Host выставляется из URI).
$request = (new Request('GET', new Uri('https://api.example.com/v1/items?page=2')))
->withHeader('Accept', 'application/json')
->withHeader('Authorization', 'Bearer …');
$request->getMethod(); // 'GET'
$request->getHeaderLine('accept'); // 'application/json' (регистр не важен)
$request->getUri()->getHost(); // 'api.example.com'
$request->getRequestTarget(); // '/v1/items?page=2'
// Тело через поток (PSR-7 StreamInterface, fail-loud).
$withBody = $request
->withMethod('POST')
->withBody(Stream::fromString('{"name":"widget"}'));
// PSR-17 фабрики — для кода, который принимает интерфейсы.
use CloudCastle\Http\Request\RequestFactory;
use CloudCastle\Http\Request\StreamFactory;
use CloudCastle\Http\Request\UriFactory;
$request = (new RequestFactory())->createRequest('GET', 'https://example.com/');
$uri = (new UriFactory())->createUri('https://example.com:443/'); // порт 443 опускается
$stream = (new StreamFactory())->createStream('payload');
Возможности
- PSR-7 сообщения:
Request,Uri,Stream— неизменяемые, всеwith*возвращают новый экземпляр. - PSR-17 фабрики:
RequestFactory,UriFactory,StreamFactory. - Fail-loud: некорректный метод, имя/значение заголовка или порт URI — сразу
исключение (
InvalidMethodException/InvalidHeaderException/InvalidUriException/StreamException), а не тихая порча данных. - Строгая валидация метода и заголовков по RFC 7230 (защита от инъекции CRLF) и диапазона порта URI (1–65535).
- Исключения не раскрывают данные — в сообщении только имя заголовка/причина, без значения; безопасно для логов с персональными и финансовыми данными.
- Нормализация URI по RFC 3986: схема/хост в нижнем регистре, стандартный порт опускается, ленивое процент-кодирование пути (без затрат, если путь не читают).
- Регистронезависимые заголовки с сохранением исходного написания имени.
- Минимум зависимостей — только контракты
psr/http-factoryиpsr/http-message, без polyfill'ов иgetallheaders.
Коротко
Лёгкий, быстрый и безопасный слой PSR-7/17 для исходящих HTTP-запросов: строгая
валидация метода и заголовков (без CRLF-инъекций), исключения без раскрытия значений
(безопасно для логов с ПД), нормализация URI по RFC 3986 — при минимуме зависимостей.
Лидер по функционалу, скорости и безопасности среди PSR-7 реализаций; по памяти —
практически вровень с самым лёгким nyholm.
Сравнение с аналогами
Все таблицы ниже сгенерированы автоматически из честных сравнительных
тестов (benchmarks/compare.php) на ОДИНАКОВОЙ операции для всех аналогов,
PHP 8.1.34, без Xdebug.
1. Функциональность
| Возможность | 🏆 CloudCastle | nyholm | guzzle | laminas | slim | httpsoft |
|---|---|---|---|---|---|---|
| Неизменяемые PSR-7 сообщения (with* возвращают клон) | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Строгая валидация метода и заголовков (fail-loud, RFC 7230) | ✅ | ❌ | ✅ | ✅ | ✅ | ✅ |
| Исключения не раскрывают значение заголовка (безопасно для логов с ПД) | ✅ | ❌ | ❌ | ❌ | ✅ | ❌ |
| Минимум зависимостей (только PSR-контракты, без polyfill/getallheaders) | ✅ | ✅ | ❌ | ❌ | ❌ | ✅ |
| Нормализация URI по RFC 3986 (порт по умолчанию опускается) | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Всего | 🏆 5 | 3 | 3 | 3 | 4 | 4 |
2. Безопасность и корректность
| Свойство | 🏆 CloudCastle | nyholm | guzzle | laminas | slim | httpsoft |
|---|---|---|---|---|---|---|
| Валидация имён заголовков (нет инъекции CRLF) | ✅ | ❌ | ✅ | ✅ | ✅ | ✅ |
| Валидация значений заголовков (нет управляющих символов) | ✅ | ❌ | ✅ | ✅ | ✅ | ✅ |
| Исключения не раскрывают значение заголовка (нет утечки ПД в логи) | ✅ | ❌ | ❌ | ❌ | ✅ | ❌ |
| Валидация метода (token RFC 7230) | ✅ | ❌ | ✅ | ✅ | ✅ | ✅ |
| Проверка диапазона порта URI (1–65535) | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Всего | 🏆 5 | 1 | 4 | 4 | 🏆 5 | 4 |
3. Производительность
разбор URI + сборка GET-запроса с заголовками, 100 000 раз (минимум из 4).
| Решение | Время (мс) | Итог |
|---|---|---|
| 🏆 CloudCastle | 6 019,8 | быстрейшее среди библиотек |
| nyholm | 6 206,6 | аналог |
| httpsoft | 8 395 | аналог |
| laminas | 15 143,4 | аналог |
| guzzle | 19 987,7 | аналог |
| slim | 20 225,8 | аналог |
4. Потребление памяти
Фактическая память 100 000 удержанных объектов-запросов (изолированный процесс).
| Решение | Пиковая память (KB) | Итог |
|---|---|---|
| 🏆 nyholm | 242 196 | легчайшее среди библиотек |
| CloudCastle | 242 198 | аналог |
| guzzle | 242 410 | аналог |
| httpsoft | 245 352 | аналог |
| slim | 350 930 | аналог |
| laminas | 352 301 | аналог |
О памяти честно. Замер — фактически занятая память (
memory_get_usage) при удержании 100 000 объектов-запросов в изолированном процессе (не производной строки — та одинакова у всех и мерила бы лишь шум). CloudCastle практически вровень с самым лёгкимnyholm/psr7(разница ~2 КБ из 242 МБ — в пределах шума) и на ~45% легчеlaminas/slim. Память — не та ось, где пакет уступает; при этом он первый по скорости, функционалу и безопасности.
Плюсы, минусы и когда применять
Сильные стороны:
- Функционал = объединение аналогов — единственный набирает все пункты матрицы (неизменяемость, строгая валидация, безопасные исключения, минимум зависимостей, нормализация URI по RFC 3986).
- Быстрейшая сборка запроса среди PSR-7 реализаций — быстрее
nyholm,httpsoft,laminas,guzzleна разборе URI + сборке запроса с заголовками. - Безопасность — валидация имён/значений заголовков (нет CRLF-инъекции), проверка
метода и диапазона порта; исключения не раскрывают значение заголовка — нет
утечки секретов/ПД в логи (у
guzzle/laminas/httpsoftзначение попадает в текст исключения).nyholmвовсе не валидирует заголовки. - Память — практически вровень с самым лёгким
nyholm, легче большинства. - Минимум зависимостей — только PSR-контракты, без polyfill/
getallheaders.
Слабые стороны (честно):
- Только исходящий запрос — реализованы
RequestInterfaceи фабрики; серверныйServerRequest, загрузка файлов и cookie — вне области (для них берите полныйlaminas-diactoros/guzzle). - Экосистема — у
guzzle/laminasшире набор готовых middleware и адаптеров.
Когда применять. Как лёгкий, быстрый и безопасный PSR-7/17 слой для исходящих
HTTP-запросов в клиентах и интеграциях — особенно там, где важна защита от утечки
данных в логи и минимум зависимостей. Для серверной стороны (обработка входящих
запросов, загрузки, cookie) берите полноценный laminas-diactoros или guzzle.
Разработка
composer install
composer check # линтеры + статический анализ + тесты
composer fix # автоисправления (Rector, PHP CS Fixer, PHPCBF)
composer ci # полный CI-пайплайн локально
Полный список команд с описаниями: composer run-script --list.
Документация
- Репозиторий: https://gitverse.ru/cloud-castle/http-request
- История изменений: CHANGELOG.md
- Как внести вклад: CONTRIBUTING.md
- Кодекс поведения: CODE_OF_CONDUCT.md
- Политика безопасности: SECURITY.md
Лицензия
MIT © CloudCastle (alex-4-17@yandex.ru)
🇷🇺 Русский · 🇬🇧 English · 🇩🇪 Deutsch · 🇫🇷 Français · 🇪🇸 Español · 🇮🇹 Italiano