TrueAsync\HttpRequest
(PHP 8.6+, true_async_server 0.6+)
Objeto de solo lectura que se pasa como primer parámetro al manejador. Lo crea el servidor; no se construye desde el código de usuario.
namespace TrueAsync;
final class HttpRequest
{
// --- general ---
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;
// --- cabeceras ---
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;
// --- cuerpo ---
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;
}General
getMethod
public HttpRequest::getMethod(): string"GET", "POST", "PUT", "DELETE", etc.
getUri
public HttpRequest::getUri(): stringURI completa de la solicitud: ruta + query string.
getPath
public HttpRequest::getPath(): stringRuta sin query-string. Por ejemplo, /search a partir de /search?q=hello. Uniforme para HTTP/1.1, HTTP/2 (pseudo-header :path) y HTTP/3. Junto con getQuery() usa un único parse perezoso: la URI se divide en path/query en el primer acceso y se cachea en la request-struct.
getHttpVersion
public HttpRequest::getHttpVersion(): string"1.1", "2", "3".
isKeepAlive
public HttpRequest::isKeepAlive(): boolQuery
getQuery
public HttpRequest::getQuery(): arrayTodos los parámetros de query como array asociativo, equivalente a $_GET. Admite percent-decoding, + como espacio, notación de arrays de PHP (foo[], foo[bar]). El parsing se delega a php_default_treat_data(PARSE_STRING, ...), la misma función que rellena $_GET.
getQueryParam
public HttpRequest::getQueryParam(string $name, mixed $default = null): mixedUn único parámetro por nombre, o $default (por defecto null) si no está.
Cabeceras
hasHeader
public HttpRequest::hasHeader(string $name): boolCase-insensitive.
getHeader
public HttpRequest::getHeader(string $name): ?stringUn valor, case-insensitive. null si no está.
getHeaderLine
public HttpRequest::getHeaderLine(string $name): stringTodos los valores unidos por coma. Cadena vacía si no está.
getHeaders
public HttpRequest::getHeaders(): arrayTodas las cabeceras. Nombres en minúsculas.
getContentType
public HttpRequest::getContentType(): ?stringValor de Content-Type, o null.
getContentLength
public HttpRequest::getContentLength(): ?intContent-Length o null (ausente o inválido).
Cuerpo
getBody
public HttpRequest::getBody(): stringCuerpo de la solicitud. Cadena vacía si no hay body.
En el modo body streaming (
HttpServerConfig::setBodyStreamingEnabled(true))getBody()lanza; lee mediantereadBody().
hasBody
public HttpRequest::hasBody(): boolawaitBody
public HttpRequest::awaitBody(): staticEsperar al cuerpo completo. Desde Phase 6 Step 3+ el manejador puede invocarse justo después del parsed-headers, antes de recibir el cuerpo. awaitBody() suspende la corrutina hasta el message-complete.
Cuando el cuerpo ya está íntegramente en el buffer (default actual) regresa de inmediato sin suspend.
readBody
public HttpRequest::readBody(int $maxLen = 65536): ?stringStreaming pull-based del cuerpo (issue #26). Devuelve un chunk entregado por el parser por llamada:
- frame DATA de H2 (≈ 16 KiB);
- slice de
on_bodyde llhttp (limitado por el read-buffer de H1 — 8 KiB).
Comportamiento:
- Cola vacía → la corrutina se aparca en el evento-trigger per-request.
- EOF →
null(idempotente). - Error de stream (peer reset, superar
max_body_size) →\Exception. $maxLenestá reservado para una futura optimización de coalesce y ahora se ignora. La firma se mantiene binariamente compatible con la mejora prevista.
Disponible solo con HttpServerConfig::setBodyStreamingEnabled(true).
Véase Streaming.
Multipart / form
getPost
public HttpRequest::getPost(): arrayDatos POST de multipart/form-data o application/x-www-form-urlencoded. Admite arrays estilo PHP: name[], user[name], matrix[0][1].
getFiles
public HttpRequest::getFiles(): arrayTodos los archivos subidos. Varios archivos con un mismo nombre: ['photos' => [UploadedFile, UploadedFile, ...]].
getFile
public HttpRequest::getFile(string $name): ?UploadedFileUn único archivo por nombre. Para photos[], el primero del array. null si no está.
Véase UploadedFile.
W3C Trace Context
Requiere HttpServerConfig::setTelemetryEnabled(true).
getTraceParent
public HttpRequest::getTraceParent(): ?stringtraceparent crudo tal y como llegó. null si está ausente / mal formado / la telemetría está desactivada.
getTraceState
public HttpRequest::getTraceState(): ?stringtracestate crudo. null si está ausente / la telemetría está desactivada.
getTraceId
public HttpRequest::getTraceId(): ?stringTrace-id decodificado, 32 caracteres lower-hex, o null.
getSpanId
public HttpRequest::getSpanId(): ?stringParent span-id decodificado, 16 caracteres lower-hex, o null.
getTraceFlags
public HttpRequest::getTraceFlags(): ?intByte de flags decodificado de 8 bits (por ejemplo, 0x01 = sampled), o null.
Ejemplo
$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]);
});