TrueAsync\HttpRequest
(PHP 8.6+, true_async_server 0.6+)
Read-only Objekt, das als erster Parameter an den Handler übergeben wird. Wird vom Server erzeugt — nicht vom Benutzer konstruiert.
namespace TrueAsync;
final class HttpRequest
{
// --- allgemein ---
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;
}Allgemein
getMethod
public HttpRequest::getMethod(): string"GET", "POST", "PUT", "DELETE" usw.
getUri
public HttpRequest::getUri(): stringVollständige Request-URI — Pfad + Query-String.
getPath
public HttpRequest::getPath(): stringPfad ohne Query-String. Beispiel: /search aus /search?q=hello. Einheitlich für HTTP/1.1, HTTP/2 (:path Pseudo-Header) und HTTP/3. Gemeinsam mit getQuery() nutzt es einen lazy Parse — die URI wird beim ersten Zugriff in Path/Query gesplittet und in der Request-Struct gecacht.
getHttpVersion
public HttpRequest::getHttpVersion(): string"1.1", "2", "3".
isKeepAlive
public HttpRequest::isKeepAlive(): boolQuery
getQuery
public HttpRequest::getQuery(): arrayAlle Query-Parameter als assoziatives Array — Pendant zu $_GET. Unterstützt Percent-Decoding, +-as-space, PHP-Array-Notation (foo[], foo[bar]). Parsing delegiert an php_default_treat_data(PARSE_STRING, ...) — dieselbe Funktion, die $_GET befüllt.
getQueryParam
public HttpRequest::getQueryParam(string $name, mixed $default = null): mixedEin Parameter per Name oder $default (Default null) falls nicht vorhanden.
Header
hasHeader
public HttpRequest::hasHeader(string $name): boolCase-insensitive.
getHeader
public HttpRequest::getHeader(string $name): ?stringEin Wert, case-insensitive. null falls nicht vorhanden.
getHeaderLine
public HttpRequest::getHeaderLine(string $name): stringAlle Werte durch Komma verbunden. Leerer String falls nicht vorhanden.
getHeaders
public HttpRequest::getHeaders(): arrayAlle Header. Namen in lowercase.
getContentType
public HttpRequest::getContentType(): ?stringWert von Content-Type oder null.
getContentLength
public HttpRequest::getContentLength(): ?intContent-Length oder null (nicht vorhanden oder ungültig).
Body
getBody
public HttpRequest::getBody(): stringRequest-Body. Leerer String, wenn kein Body.
Im Streaming-Body-Modus (
HttpServerConfig::setBodyStreamingEnabled(true)) wirftgetBody()— überreadBody()lesen.
hasBody
public HttpRequest::hasBody(): boolawaitBody
public HttpRequest::awaitBody(): staticAuf den vollständigen Body warten. Seit Phase 6 Step 3+ kann der Handler sofort nach Parsed-Headers aufgerufen werden, vor Empfang des Bodys. awaitBody() suspendiert die Coroutine bis Message-Complete.
Liegt der Body bereits vollständig im Buffer (aktueller Default), kehrt es sofort ohne Suspend zurück.
readBody
public HttpRequest::readBody(int $maxLen = 65536): ?stringPull-basiertes Streaming des Bodys (Issue #26). Liefert einen parser-supplied Chunk pro Aufruf:
- H2 DATA-Frame (≈ 16 KiB);
- llhttp
on_body-Slice (begrenzt durch H1-Read-Buffer — 8 KiB).
Verhalten:
- Leere Queue → Coroutine parkt auf einem Per-Request-Trigger-Event.
- EOF →
null(idempotent). - Stream-Fehler (Peer-Reset, Überschreitung von
max_body_size) →\Exception. $maxLenist für ein künftiges Coalesce-Refinement reserviert und wird derzeit ignoriert. Die Signatur bleibt binary-compatible mit dem geplanten Refinement.
Verfügbar nur bei HttpServerConfig::setBodyStreamingEnabled(true).
Siehe Streaming.
Multipart / Form
getPost
public HttpRequest::getPost(): arrayPOST-Daten aus multipart/form-data oder application/x-www-form-urlencoded. Unterstützt PHP-Style-Arrays: name[], user[name], matrix[0][1].
getFiles
public HttpRequest::getFiles(): arrayAlle hochgeladenen Dateien. Mehrere Dateien mit demselben Namen: ['photos' => [UploadedFile, UploadedFile, ...]].
getFile
public HttpRequest::getFile(string $name): ?UploadedFileEine Datei per Name. Für photos[] — die erste aus dem Array. null falls nicht vorhanden.
Siehe UploadedFile.
W3C Trace Context
Benötigt HttpServerConfig::setTelemetryEnabled(true).
getTraceParent
public HttpRequest::getTraceParent(): ?stringRohes traceparent, wie es ankam. null falls nicht vorhanden / malformed / Telemetry aus.
getTraceState
public HttpRequest::getTraceState(): ?stringRohes tracestate. null falls nicht vorhanden / Telemetry aus.
getTraceId
public HttpRequest::getTraceId(): ?stringDekodierte 32-Zeichen-lower-hex Trace-ID oder null.
getSpanId
public HttpRequest::getSpanId(): ?stringDekodierte 16-Zeichen-lower-hex Parent-Span-ID oder null.
getTraceFlags
public HttpRequest::getTraceFlags(): ?intDekodiertes 8-Bit Flags-Byte (z. B. 0x01 — sampled) oder null.
Beispiel
$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]);
});