virtualhost - 如何获取主机或:authority header in Cro when using HTTP/2

标签 virtualhost raku http2 request-headers cro

当使用带有 HTTP1.1 的 Cro 时,我可以通过主机方法 request.uri.host 访问请求的主机。在 Cro::Uri以及浏览器通过 request.header 发送的 Host 或 :authority header Cro::HTTP::Request 中的方法.

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

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

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

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

最佳答案

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

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

关于virtualhost - 如何获取主机或:authority header in Cro when using HTTP/2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62253651/

相关文章:

operators - 是否可以在 Raku 中定义自定义元操作符?

raku - 在 Perl 6 NativeCall 中将指针传递给指针

ios - APNS - 是否可以通过基于 HTTP/2 的 API 推送 MDM 配置设备?

windows - 修改windows 7 hosts文件不生效

php - Lighty (Lighttpd) 虚拟主机配置

apache - MAMP 虚拟主机无法正常工作,正在加载 'It Works!' 页面

metaprogramming - 您如何从它们所属的类型之外访问私有(private)方法或属性?

asp.net - 如何确定客户端是否使用 HTTP/2 进行连接?

server-push - 当资源在缓存中时,浏览器是否会取消服务器推送?

apache - 指向同一目录的本地虚拟主机