使用 Node JS 执行 HTTP/2.0 请求时 headers 顺序和大小写错误

Wrong headers order and casing when performing an HTTP/2.0 request with Node JS

我需要什么 (TL;DR):

我需要请求 headers 与我在 http2 请求选项中指定的完全相同,它应该保留名称大小写和所有 headers 的顺序。

如何在发送请求之前明确设置或修改此顺序?如果默认 'http2' 库无法实现,请让我知道任何其他能够执行此操作的库。

如果您需要更多上下文,请继续阅读!

现在发生了什么:

当我使用 'http2' 库执行 HTTP/2.0 请求时,所有 header 的名称似乎都标准化为小写字母,并且在发送请求之前更改了顺序.

我用来执行 HTTP/2.0 请求的示例代码:

const http2 = require('http2');

const client = http2.connect('http://localhost:8000');

const request = client.request({
  ':method': 'GET',
  ':authority': 'localhost:8000',
  ':scheme': 'https',
  ':path': '/',
  'sec-ch-ua-mobile': '?0',
  'sec-ch-ua': `" Not A;Brand";v="99", "Chromium";v="99", "Google Chrome";v="99"`,
  'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36',
  'Cookie': 'foo=bar',
});

request.end()

header的订单我希望在服务器上收到

:method: GET
:authority': localhost:8000
:scheme': https
:path: /
sec-ch-ua-mobile: ?0
sec-ch-ua: " Not A;Brand";v="99", "Chromium";v="99", "Google Chrome";v="99"
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36
Cookie: foo=bar

我在服务器上实际收到的内容:

:path: /
:scheme: https
:authority: localhost:8000
:method: GET
sec-ch-ua-mobile: ?0
sec-ch-ua: " Not A;Brand";v="99", "Chromium";v="99", "Google Chrome";v="99"
user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36
cookie: foo=bar

请注意,所有 header 的大小写和 :path、:scheme、:authority 和 :method header 的顺序与我期望的不同...

我已经研究过 http2 的源代码,似乎无法明确定义这 4 header 的顺序并禁用此命名小写规范化。许多现有的 HTTP/2.0 节点库都依赖于本机库,因此,它们也存在这个问题。

但我们什么也没做,我如何明确设置此 header 顺序或在发送请求之前修改它们以符合我的预期? 存在任何库或允许在 Node JS 中实现此目的的库绑定?

PS: 已经试过 node-libcurl 也有同样的问题。

谢谢!

来自HTTP/2 spec

Just as in HTTP/1.x, header field names are strings of ASCII characters that are compared in a case-insensitive fashion. However, header field names MUST be converted to lowercase prior to their encoding in HTTP/2. A request or response containing uppercase header field names MUST be treated as malformed

我不知道关于排序的任何类似限制,但是我也想说取决于顺序是一个坏主意,因为我也不知道它被明确保留。