使用HTTP2时,如何获取Cro中的Host或:authority头。

问题描述 投票:5回答:1

当使用Cro与HTTP1.1时,我可以通过主机方法访问请求的Host。request.uri.hostCro::Uri 以及浏览器通过浏览器的 request.header 方法中 Cro::HTTP::请求.

然而,当我使用HTTP2时,这些都不工作。Uri对象只包含模式和路径。

我正在使用带有通配符的官方证书,并通过将这些子域添加到我的hosts文件中来在本地运行。Chrome DevTools说它已经在HTTP2下发送了 :authority请求头,Firefox Developer Tools说它已经在HTTP2下发送了Host请求头。然而,如果我把头写到像下面这样的日志中,我看到了几个头,但没有Host或:authority头。

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";
    }
  }
}

我知道HTTP2使用 服务器名称指示 而主机名是作为TLS协商的一部分发送的。另一方面这也是Cro模块(Cro::TLS)的一部分,头信息还是由浏览器发送。

那么如何在HTTP2下获取主机呢?

virtualhost raku http2 request-headers cro
1个回答
7
投票

这似乎是一个普通的bug(与Raiph命名的那些无关)。

我写了一个补丁并发送了一个PR (https:/github.comcroservicescro-httppull104。),合并后您可以更新您的Cro::HTTP分布和您指定的两种方式(request.uri 建设或要求 header('Host'))就可以了。

© www.soinside.com 2019 - 2024. All rights reserved.