TrueAsync\HttpRequest
(PHP 8.6+, true_async_server 0.6+)
Read-only об'єкт, що передається першим параметром в обробник. Створюється сервером — не конструюється користувачем.
namespace TrueAsync;
final class HttpRequest
{
// --- загальні ---
public function getMethod(): string;
public function getUri(): string;
public function getPath(): string;
public function getHttpVersion(): string;
public function isKeepAlive(): bool;
// --- query ---
public function getQuery(): array;
public function getQueryParam(string $name, mixed $default = null): mixed;
// --- headers ---
public function hasHeader(string $name): bool;
public function getHeader(string $name): ?string;
public function getHeaderLine(string $name): string;
public function getHeaders(): array;
public function getContentType(): ?string;
public function getContentLength(): ?int;
// --- body ---
public function getBody(): string;
public function hasBody(): bool;
public function awaitBody(): static;
public function readBody(int $maxLen = 65536): ?string;
// --- multipart / form ---
public function getPost(): array;
public function getFiles(): array;
public function getFile(string $name): ?UploadedFile;
// --- W3C Trace Context ---
public function getTraceParent(): ?string;
public function getTraceState(): ?string;
public function getTraceId(): ?string;
public function getSpanId(): ?string;
public function getTraceFlags(): ?int;
}Загальні
getMethod
public HttpRequest::getMethod(): string"GET", "POST", "PUT", "DELETE" тощо.
getUri
public HttpRequest::getUri(): stringПовний URI запиту — шлях + query string.
getPath
public HttpRequest::getPath(): stringШлях без query-string. Наприклад, /search з /search?q=hello. Однаково для HTTP/1.1, HTTP/2 (:path pseudo-header) і HTTP/3. Разом із getQuery() використовує один лінивий парс — URI розбивається на path/query при першому зверненні і кешується в request-struct.
getHttpVersion
public HttpRequest::getHttpVersion(): string"1.1", "2", "3".
isKeepAlive
public HttpRequest::isKeepAlive(): boolQuery
getQuery
public HttpRequest::getQuery(): arrayУсі query-параметри як асоціативний масив — еквівалент $_GET. Підтримує percent-decoding, +-as-space, PHP array notation (foo[], foo[bar]). Парсинг делегується в php_default_treat_data(PARSE_STRING, ...) — та сама функція, що наповнює $_GET.
getQueryParam
public HttpRequest::getQueryParam(string $name, mixed $default = null): mixedОдин параметр за іменем або $default (за замовчуванням null), якщо відсутній.
Заголовки
hasHeader
public HttpRequest::hasHeader(string $name): boolCase-insensitive.
getHeader
public HttpRequest::getHeader(string $name): ?stringОдне значення, case-insensitive. null, якщо немає.
getHeaderLine
public HttpRequest::getHeaderLine(string $name): stringУсі значення, об'єднані комою. Порожній рядок, якщо немає.
getHeaders
public HttpRequest::getHeaders(): arrayУсі заголовки. Імена в lowercase.
getContentType
public HttpRequest::getContentType(): ?stringЗначення Content-Type або null.
getContentLength
public HttpRequest::getContentLength(): ?intContent-Length або null (відсутній або невалідний).
Тіло
getBody
public HttpRequest::getBody(): stringТіло запиту. Порожній рядок, якщо без body.
У режимі streaming-body (
HttpServerConfig::setBodyStreamingEnabled(true))getBody()кидає — читайте черезreadBody().
hasBody
public HttpRequest::hasBody(): boolawaitBody
public HttpRequest::awaitBody(): staticЧекати повного тіла. З Phase 6 Step 3+ обробник може викликатися відразу після parsed-headers, до приймання тіла. awaitBody() паркує корутину до message-complete.
Коли тіло вже цілком у буфері (поточний дефолт) — повертається одразу без suspend'а.
readBody
public HttpRequest::readBody(int $maxLen = 65536): ?stringPull-based стрім тіла (issue #26). Повертає один parser-supplied чанк за виклик:
- H2 DATA-фрейм (≈ 16 KiB);
- llhttp
on_bodyslice (обмежений read-buffer'ом H1 — 8 KiB).
Поведінка:
- Порожня черга → корутина паркується на per-request trigger event.
- EOF →
null(ідемпотентно). - Помилка стріма (peer reset, перевищення
max_body_size) →\Exception. $maxLenзарезервовано для майбутньої coalesce-оптимізації, зараз ігнорується. Сигнатура тримається binary-compatible з прийдешнім допилом.
Доступно лише при HttpServerConfig::setBodyStreamingEnabled(true).
Див. Стрімінг.
Multipart / form
getPost
public HttpRequest::getPost(): arrayPOST-дані з multipart/form-data або application/x-www-form-urlencoded. Підтримує PHP-style масиви: name[], user[name], matrix[0][1].
getFiles
public HttpRequest::getFiles(): arrayУсі завантажені файли. Декілька файлів з одним іменем: ['photos' => [UploadedFile, UploadedFile, ...]].
getFile
public HttpRequest::getFile(string $name): ?UploadedFileОдин файл за іменем. Для photos[] — перший з масиву. null, якщо немає.
Див. UploadedFile.
W3C Trace Context
Потребує HttpServerConfig::setTelemetryEnabled(true).
getTraceParent
public HttpRequest::getTraceParent(): ?stringСирий traceparent як прийшов. null, якщо відсутній / malformed / telemetry вимкнено.
getTraceState
public HttpRequest::getTraceState(): ?stringСирий tracestate. null, якщо відсутній / telemetry вимкнено.
getTraceId
public HttpRequest::getTraceId(): ?stringДекодований 32-символьний lower-hex trace-id або null.
getSpanId
public HttpRequest::getSpanId(): ?stringДекодований 16-символьний lower-hex parent span-id або null.
getTraceFlags
public HttpRequest::getTraceFlags(): ?intДекодований 8-бітний flags-байт (наприклад, 0x01 — sampled) або null.
Приклад
$server->addHttpHandler(function (HttpRequest $req, HttpResponse $res) {
error_log(sprintf(
"[%s] %s %s (HTTP/%s, body=%s, traceid=%s)",
$req->getMethod(),
$req->getPath(),
$req->getQuery() ? json_encode($req->getQuery()) : '-',
$req->getHttpVersion(),
$req->getContentLength() ?? 'n/a',
$req->getTraceId() ?? '-'
));
if ($req->getMethod() === 'POST' && $req->getContentType() === 'application/json') {
$body = json_decode($req->getBody(), true);
// ...
}
$res->json(['ok' => true]);
});