TrueAsync\HttpRequest
(PHP 8.6+, true_async_server 0.6+)
Oggetto read-only passato come primo parametro all'handler. È creato dal server e non viene costruito dall'utente.
namespace TrueAsync;
final class HttpRequest
{
// --- generali ---
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;
// --- header ---
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;
// --- corpo ---
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;
}Generali
getMethod
public HttpRequest::getMethod(): string"GET", "POST", "PUT", "DELETE", ecc.
getUri
public HttpRequest::getUri(): stringURI completo della richiesta: path + query string.
getPath
public HttpRequest::getPath(): stringPath senza la query string. Ad esempio /search da /search?q=hello. Uniforme per HTTP/1.1, HTTP/2 (pseudo-header :path) e HTTP/3. Insieme a getQuery() usa un singolo parsing lazy: l'URI viene separato in path/query alla prima richiesta e messo in cache nella request-struct.
getHttpVersion
public HttpRequest::getHttpVersion(): string"1.1", "2", "3".
isKeepAlive
public HttpRequest::isKeepAlive(): boolQuery
getQuery
public HttpRequest::getQuery(): arrayTutti i parametri di query come array associativo: equivalente a $_GET. Supporta percent-decoding, +-come-spazio, notazione array di PHP (foo[], foo[bar]). Il parsing è delegato a php_default_treat_data(PARSE_STRING, ...), la stessa funzione che popola $_GET.
getQueryParam
public HttpRequest::getQueryParam(string $name, mixed $default = null): mixedUn singolo parametro per nome, oppure $default (predefinito null) se assente.
Header
hasHeader
public HttpRequest::hasHeader(string $name): boolCase-insensitive.
getHeader
public HttpRequest::getHeader(string $name): ?stringUn valore, case-insensitive. null se assente.
getHeaderLine
public HttpRequest::getHeaderLine(string $name): stringTutti i valori uniti da virgola. Stringa vuota se assente.
getHeaders
public HttpRequest::getHeaders(): arrayTutti gli header. Nomi in lowercase.
getContentType
public HttpRequest::getContentType(): ?stringValore di Content-Type, oppure null.
getContentLength
public HttpRequest::getContentLength(): ?intContent-Length oppure null (assente o non valido).
Corpo
getBody
public HttpRequest::getBody(): stringCorpo della richiesta. Stringa vuota se non c'è corpo.
In modalità streaming del corpo (
HttpServerConfig::setBodyStreamingEnabled(true))getBody()lancia un'eccezione: leggi tramitereadBody().
hasBody
public HttpRequest::hasBody(): boolawaitBody
public HttpRequest::awaitBody(): staticAttende il corpo completo. Dal Phase 6 Step 3+ l'handler può essere chiamato subito dopo gli header parsati, prima della ricezione del corpo. awaitBody() sospende la coroutine fino al message-complete.
Quando il corpo è già interamente nel buffer (default attuale), ritorna subito senza sospendere.
readBody
public HttpRequest::readBody(int $maxLen = 65536): ?stringStream pull-based del corpo (issue #26). Restituisce un blocco fornito dal parser per chiamata:
- frame DATA H2 (≈ 16 KiB);
- slice da
on_bodydi llhttp (limitato al read buffer H1: 8 KiB).
Comportamento:
- Coda vuota → la coroutine si sospende su un trigger event della richiesta.
- EOF →
null(idempotente). - Errore di stream (peer reset, superamento di
max_body_size) →\Exception. $maxLenè riservato a una futura coalesce-optimization, ora viene ignorato. La firma resta binary-compatible con gli sviluppi futuri.
Disponibile solo con HttpServerConfig::setBodyStreamingEnabled(true).
Vedi Streaming.
Multipart / form
getPost
public HttpRequest::getPost(): arrayDati POST da multipart/form-data o application/x-www-form-urlencoded. Supporta gli array stile PHP: name[], user[name], matrix[0][1].
getFiles
public HttpRequest::getFiles(): arrayTutti i file caricati. Più file con lo stesso nome: ['photos' => [UploadedFile, UploadedFile, ...]].
getFile
public HttpRequest::getFile(string $name): ?UploadedFileUn singolo file per nome. Per photos[]: il primo dell'array. null se assente.
Vedi UploadedFile.
W3C Trace Context
Richiede HttpServerConfig::setTelemetryEnabled(true).
getTraceParent
public HttpRequest::getTraceParent(): ?stringtraceparent grezzo, così com'è arrivato. null se assente / malformato / telemetria disattivata.
getTraceState
public HttpRequest::getTraceState(): ?stringtracestate grezzo. null se assente / telemetria disattivata.
getTraceId
public HttpRequest::getTraceId(): ?stringTrace-id decodificato (32 caratteri lower-hex), oppure null.
getSpanId
public HttpRequest::getSpanId(): ?stringParent span-id decodificato (16 caratteri lower-hex), oppure null.
getTraceFlags
public HttpRequest::getTraceFlags(): ?intByte di flags decodificato a 8 bit (ad esempio 0x01 = sampled), oppure null.
Esempio
$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]);
});