8

将 Cro 与 HTTP1.1 一起使用时,我可以通过Cro::Urirequest.uri.host中的 host 方法以及浏览器通过Cro::HTTP::Request中的方法发送的 Host 或 :authority 标头访问请求的 Host 。request.header

但是,当我使用 HTTP/2 时,这些都不起作用。Uri 对象仅包含架构和路径。

我正在为子域使用带有通配符的官方证书,并通过将这些子域添加到我的主机文件中来在本地运行它。Chrome DevTools 说它已经在 HTTP/2 下发送了 :authority 请求标头,而 Firefox 开发者工具说它已经在 HTTP/2 下发送了 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";
    }
  }
}

我知道 HTTP/2 使用服务器名称指示,并且主机名是作为 TLS 协商的一部分发送的。另一方面,这也是 Cro 模块 (Cro::TLS) 的一部分,并且标头仍然由浏览器发送。

那么如何获取HTTP/2下的主机呢?

4

1 回答 1

8

这似乎是一个普通的错误(与 Raiph 命名的错误无关)。

我写了一个补丁并发送了一个 PR ( https://github.com/croservices/cro-http/pull/104 ),将它合并后,您可以更新您的 Cro::HTTP 分发以及您指定的两种方式(request.uri构造或请求header('Host')) 将工作。

于 2020-06-10T18:47:09.733 回答