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

acw*_*acw 8 virtualhost request-headers http2 cro raku

当使用克罗马与HTTP1.1我可以通过这两个主机的方法访问请求的主机request.uri.host克罗马::乌里权威标头中发送的浏览器通过:以及主机或request.header在方法克罗马:: HTTP ::请求

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

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

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

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

Tak*_*kao 8

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

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

  • 我的方法是:1)运行“http2.t”测试,并将“note $request.uri”添加到两个 HTTP 版本的“/”路由块中;2)不同。使用 `CRO_TRACE=1` 作为环境变量运行;3)在“CRO_TRACE”输出中,请求有标头,但是当服务器解析它时,就不再有标头了;4)转到HTTP/2解析器设置标头的部分;5)HTTP/2中有5个伪标头,但我们只处理了其中的3个;6)添加缺失的一项;7)修复,添加测试,PR。没有调试手册,但是设置“CRO_TRACE”并运行有助于了解哪个模块有问题并转到那里。 (3认同)
  • Cro 非常模块化,有助于调试,但 HTTP 本身很棘手,因此某些地方的代码很难获取。存在一些已知的并发问题,以及与各种情况下的错误报告相关的问题。但当涉及到协议数据处理部分(比如这个)时,这些错误通常很容易调试。 (2认同)