使用 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
我不知道关于排序的任何类似限制,但是我也想说取决于顺序是一个坏主意,因为我也不知道它被明确保留。
我需要什么 (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
我不知道关于排序的任何类似限制,但是我也想说取决于顺序是一个坏主意,因为我也不知道它被明确保留。