When using Cro with HTTP1.1 I can access the requested Host via both the host method request.uri.host
in Cro::Uri as well as the Host or :authority header sent by the browser via the request.header
method in Cro::HTTP::Request.
However, when I use HTTP/2, none of these work. The Uri object only contains the schema and the path.
I'm using an official certificate with a wildcard for subdomains and running this locally by adding these subdomains to my hosts file. Chrome DevTools says it has sent the :authority request header under HTTP/2 and Firefox Developer Tools says it has sent the Host request header under HTTP/2. However if I write the headers to a log like below, I see several headers, but not the Host or :authority header.
sub routes() is export {
route {
get -> {
my $log = "/data/myapp/logs/cro.log";
my $fh = open $log, :w;
my $host = request.uri.host;
$fh.say( "Host with host method: " ~ $host );
$host = request.header('Host');
$fh.say( "Host: " ~ $host );
$host = request.header(':authority');
$fh.say(":authority: " ~ $host );
$fh.say( "Request headers:" );
for request.headers {
$fh.say( "{.name}: {.value}" );
}
$fh.close;
content 'text/html', "<h1> MyApp </h1><p>Running";
}
}
}
I'm aware that HTTP/2 uses Server Name Indication and that the host name is sent as part of the TLS negotiation. On the other hand this is also part of the Cro modules (Cro::TLS) and the headers are sent by the browser nonetheless.
So how to get the host under HTTP/2?
say
statements?) and if you essentially guessed the problem because you know the relevant protocols and the Cro source code? Is there a good single link that gives an overview of debugging Cro issues in general, and http ones in particular? (And if not, any quick comments you might have would be great.) – Endo