Proxy
Proxy принимает TCP-подключение, извлекает целевой адрес из первой строки HTTP-запроса и связывает клиентское соединение с AsyncTcpConnection к этому адресу. Основной класс localzet\Proxy наследует Localzet Server.
Реализация не добавляет авторизацию пользователя, ACL адресов, кэширование и полноценный HTTP-parser. Используйте её только в изолированной доверенной среде с контролируемым форматом запросов.
Подключение
Заголовок раздела «Подключение»Манифест требует PHP 8.1+ и Localzet Server ^4.1:
composer config repositories.localzet-proxy vcs https://github.com/localzet/Proxycomposer require localzet/proxy:dev-mainuse localzet\Proxy;use localzet\Server;
require __DIR__ . '/vendor/autoload.php';
$proxy = new Proxy('tcp://127.0.0.1:8080');$proxy->count = 1;Server::runAll();Явный loopback-адрес не допускает внешних клиентов. Если нужен доступ по сети, настройте его ограничение отдельно; отсутствие проверок в самом Proxy иначе превращает сервис в открытый выход к сети сервера.
Форма входящего запроса
Заголовок раздела «Форма входящего запроса»Обработчик делит полученный buffer по пробелам и передаёт второй элемент в parse_url(). Для извлечения hostname нужен абсолютный URL:
GET http://example.test/path HTTP/1.1Host: example.testОн не разрешает обычный origin-form GET /path HTTP/1.1 по заголовку Host. Если parse_url() не вернул host, callback просто завершается, без HTTP-ответа об ошибке.
Исходящий порт берётся из URL либо устанавливается в 80. Схема https не включает TLS автоматически: создаётся именно tcp://host:port. Переданный buffer отправляется upstream без переписывания request target и hop-by-hop-заголовков.
CONNECT
Заголовок раздела «CONNECT»В коде есть ветка для метода CONNECT, но стандартный authority-form CONNECT example.test:443 HTTP/1.1 не содержит hostname в форме, ожидаемой parse_url(), и не проходит предварительную проверку.
Если передать искусственный absolute-form с host, обработчик отправит 200 Connection Established до подтверждения соединения с upstream. Поэтому эту ветку нельзя считать надёжным HTTPS CONNECT-прокси для браузера. Ошибка upstream не преобразуется в соответствующий HTTP-ответ: callback onError пустой.
Передача данных и границы
Заголовок раздела «Передача данных и границы»После создания upstream обе стороны соединяются через pipe(). Proxy не реализует отдельные ограничения размера HTTP-body, разбор нескольких запросов на keep-alive, маршрутизацию каждого следующего запроса или изоляцию destinations в одном клиентском соединении.
На входе используется raw TCP. Первая строка может прийти несколькими фрагментами, но собственного буфера ожидания полной строки здесь нет. Не считайте успешный запрос из одного buffer подтверждением корректной обработки произвольного TCP-разбиения.
Для дальнейшего использования в качестве общего forward proxy нужны явный parser состояния запроса, корректный CONNECT, подтверждение upstream до ответа, ACL и ограниченная обработка ошибок. Эти механизмы не скрываются за настройками данного класса — их в реализации нет.
Параметры класса и обработка ошибок
Исходный код · AGPL-3.0