提问者:小点点

如何在使用HTTP/2时在Cro中获取Host或:权限标头


在HTTP1.1中使用Cro时,我可以通过Cro::Uri中的主机方法request.uri.host以及浏览器通过Cro中的request. header方法发送的主机或:权限头访问请求的主机::::请求。

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

我使用带有子域通配符的官方证书,并通过将这些子域添加到我的主机文件中来在本地运行它。ChromeDevTools说它已经在HTTP/2下发送了:权限请求标头,Firefox Developer Tools说它已经在HTTP/2下发送了主机请求标头。但是,如果我将标头写入下面的日志,我会看到几个标头,但不是主机或:权限标头。

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以下的主机呢?


共1个答案

匿名用户

这似乎是一个普通的bug(与雷夫命名的无关)。

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