TrueAsync\HttpRequest
(PHP 8.6+, true_async_server 0.6+)
Objet read-only passé en premier paramètre au handler. Créé par le serveur — pas instancié par l'utilisateur.
namespace TrueAsync;
final class HttpRequest
{
// --- général ---
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;
// --- en-têtes ---
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;
// --- corps ---
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;
}Général
getMethod
public HttpRequest::getMethod(): string"GET", "POST", "PUT", "DELETE", etc.
getUri
public HttpRequest::getUri(): stringURI complète de la requête — path + query string.
getPath
public HttpRequest::getPath(): stringPath sans query-string. Par exemple /search à partir de /search?q=hello. Uniforme pour HTTP/1.1, HTTP/2 (:path pseudo-header) et HTTP/3. Avec getQuery(), partage un parse paresseux — l'URI est splittée en path/query au premier accès et cachée dans la struct request.
getHttpVersion
public HttpRequest::getHttpVersion(): string"1.1", "2", "3".
isKeepAlive
public HttpRequest::isKeepAlive(): boolQuery
getQuery
public HttpRequest::getQuery(): arrayTous les paramètres query sous forme de tableau associatif — équivalent de $_GET. Supporte le percent-decoding, +-as-space, la notation PHP array (foo[], foo[bar]). Le parsing est délégué à php_default_treat_data(PARSE_STRING, ...) — la même fonction qui remplit $_GET.
getQueryParam
public HttpRequest::getQueryParam(string $name, mixed $default = null): mixedUn paramètre par nom, ou $default (par défaut null) s'il est absent.
En-têtes
hasHeader
public HttpRequest::hasHeader(string $name): boolCase-insensitive.
getHeader
public HttpRequest::getHeader(string $name): ?stringUne valeur, case-insensitive. null s'il n'y en a pas.
getHeaderLine
public HttpRequest::getHeaderLine(string $name): stringToutes les valeurs jointes par une virgule. Chaîne vide s'il n'y en a pas.
getHeaders
public HttpRequest::getHeaders(): arrayTous les en-têtes. Noms en minuscules.
getContentType
public HttpRequest::getContentType(): ?stringValeur de Content-Type, ou null.
getContentLength
public HttpRequest::getContentLength(): ?intContent-Length ou null (absent ou invalide).
Corps
getBody
public HttpRequest::getBody(): stringCorps de la requête. Chaîne vide s'il n'y a pas de body.
En mode streaming-body (
HttpServerConfig::setBodyStreamingEnabled(true)),getBody()lève — il faut lire viareadBody().
hasBody
public HttpRequest::hasBody(): boolawaitBody
public HttpRequest::awaitBody(): staticAttendre le corps complet. Depuis Phase 6 Step 3+, le handler peut être appelé immédiatement après parsed-headers, avant la réception du corps. awaitBody() suspend la coroutine jusqu'au message-complete.
Quand le corps est déjà entièrement en buffer (le défaut actuel), retourne immédiatement sans suspend.
readBody
public HttpRequest::readBody(int $maxLen = 65536): ?stringStreaming pull-based du corps (issue #26). Renvoie un chunk fourni par le parseur :
- frame DATA H2 (≈ 16 KiB) ;
- slice
on_bodyllhttp (limité par le read-buffer H1 = 8 KiB).
Comportement :
- File vide → la coroutine s'endort sur le trigger event par requête.
- EOF →
null(idempotent). - Erreur stream (peer reset, dépassement de
max_body_size) →\Exception. $maxLenest réservé à une future optimisation de coalesce et est actuellement ignoré. La signature reste binary-compatible avec la finalisation à venir.
Disponible uniquement quand HttpServerConfig::setBodyStreamingEnabled(true).
Voir Streaming.
Multipart / form
getPost
public HttpRequest::getPost(): arrayDonnées POST depuis multipart/form-data ou application/x-www-form-urlencoded. Supporte les tableaux à la PHP : name[], user[name], matrix[0][1].
getFiles
public HttpRequest::getFiles(): arrayTous les fichiers téléversés. Plusieurs fichiers avec un même nom : ['photos' => [UploadedFile, UploadedFile, ...]].
getFile
public HttpRequest::getFile(string $name): ?UploadedFileUn seul fichier par nom. Pour photos[] — le premier du tableau. null s'il n'y en a pas.
Voir UploadedFile.
W3C Trace Context
Nécessite HttpServerConfig::setTelemetryEnabled(true).
getTraceParent
public HttpRequest::getTraceParent(): ?stringtraceparent brut tel qu'arrivé. null si absent / malformed / télémétrie désactivée.
getTraceState
public HttpRequest::getTraceState(): ?stringtracestate brut. null si absent / télémétrie désactivée.
getTraceId
public HttpRequest::getTraceId(): ?stringtrace-id décodé sur 32 caractères hex minuscule, ou null.
getSpanId
public HttpRequest::getSpanId(): ?stringparent span-id décodé sur 16 caractères hex minuscule, ou null.
getTraceFlags
public HttpRequest::getTraceFlags(): ?intOctet de flags décodé sur 8 bits (par ex. 0x01 = sampled), ou null.
Exemple
$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]);
});