public function filters(InternalRequest $ireq, array $userFilters) : array
{
// We need this in filters to be able to return HTTP/2.0 filters; if we allow HTTP/1.1 filters to be returned, we have lost
if (isset($ireq->headers["upgrade"][0]) && $ireq->headers["upgrade"][0] === "h2c" && $ireq->protocol === "1.1" && isset($ireq->headers["http2-settings"][0]) && false !== ($h2cSettings = base64_decode(strtr($ireq->headers["http2-settings"][0], "-_", "+/"), true))) {
// Send upgrading response
$ireq->responseWriter->send([":status" => HTTP_STATUS["SWITCHING_PROTOCOLS"], ":reason" => "Switching Protocols", "connection" => ["Upgrade"], "upgrade" => ["h2c"]]);
$ireq->responseWriter->send(false);
// flush before replacing
// internal upgrade
$client = $ireq->client;
$client->httpDriver = $this->http2;
$client->requestParser = $client->httpDriver->parser($client, $h2cSettings);
$client->requestParser->valid();
// start generator
$ireq->responseWriter = $client->httpDriver->writer($ireq);
$ireq->streamId = 1;
$client->streamWindow = [];
$client->streamWindow[$ireq->streamId] = $client->window;
$client->streamWindowBuffer[$ireq->streamId] = "";
$ireq->protocol = "2.0";
/* unnecessary:
// Make request look HTTP/2 compatible
$ireq->headers[":scheme"] = $client->isEncrypted ? "https" : "http";
$ireq->headers[":authority"] = $ireq->headers["host"][0];
$ireq->headers[":path"] = $ireq->uriPath;
$ireq->headers[":method"] = $ireq->method;
$host = \explode(":", $ireq->headers["host"][0]);
if (count($host) > 1) {
$ireq->uriPort = array_pop($host);
}
$ireq->uriHost = implode(":", $host);
unset($ireq->headers["host"]);
*/
return $client->httpDriver->filters($ireq, $userFilters);
}
$filters = [[$this, "responseInitFilter"], '\\Aerys\\genericResponseFilter'];
if ($userFilters) {
$filters = array_merge($filters, $userFilters);
}
if ($ireq->client->options->deflateEnable) {
$filters[] = '\\Aerys\\deflateResponseFilter';
}
if ($ireq->protocol === "1.1") {
$filters[] = [$this, "chunkedResponseFilter"];
}
if ($ireq->method === "HEAD") {
$filters[] = '\\Aerys\\nullBodyResponseFilter';
}
return $filters;
}