使用curl时如何设置HTTP/2伪标头?
问题:通过curl设置HTTP/2伪标头是否可行?
尝试用curl发送请求时添加HTTP/2伪标头,执行命令:
curl -v -H ":test: value" https://example.com
以及其他以冒号开头的标头名称,均报错:
curl: (55) Failed sending HTTP request
完整的curl详细输出:
* Trying 93.184.216.34:443... * Connected to example.com (93.184.216.34) port 443 (#0) * ALPN, offering h2 * ALPN, offering http/1.1 * CAfile: /etc/ssl/certs/ca-certificates.crt * CApath: /etc/ssl/certs * TLSv1.0 (OUT), TLS header, Certificate Status (22): * TLSv1.3 (OUT), TLS handshake, Client hello (1): * TLSv1.2 (IN), TLS header, Certificate Status (22): * TLSv1.3 (IN), TLS handshake, Server hello (2): * TLSv1.2 (OUT), TLS header, Finished (20): * TLSv1.3 (OUT), TLS change cipher, Change cipher spec (1): * TLSv1.2 (OUT), TLS header, Certificate Status (22): * TLSv1.3 (OUT), TLS handshake, Client hello (1): * TLSv1.2 (IN), TLS header, Finished (20): * TLSv1.2 (IN), TLS header, Certificate Status (22): * TLSv1.3 (IN), TLS handshake, Server hello (2): * TLSv1.2 (IN), TLS header, Supplemental data (23): * TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8): * TLSv1.2 (IN), TLS header, Supplemental data (23): * TLSv1.3 (IN), TLS handshake, Certificate (11): * TLSv1.2 (IN), TLS header, Supplemental data (23): * TLSv1.3 (IN), TLS handshake, CERT verify (15): * TLSv1.2 (IN), TLS header, Supplemental data (23): * TLSv1.3 (IN), TLS handshake, Finished (20): * TLSv1.2 (OUT), TLS header, Supplemental data (23): * TLSv1.3 (OUT), TLS handshake, Finished (20): * SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384 * ALPN, server accepted to use h2 * Server certificate: * subject: C=US; ST=California; L=Los Angeles; O=Internet�Corporation�for�Assigned�Names�and�Numbers; CN=www.example.org * start date: Jan 13 00:00:00 2023 GMT * expire date: Feb 13 23:59:59 2024 GMT * subjectAltName: host "example.com" matched cert's "example.com" * issuer: C=US; O=DigiCert Inc; CN=DigiCert TLS RSA SHA256 2020 CA1 * SSL certificate verify ok. * Using HTTP2, server supports multiplexing * Connection state changed (HTTP/2 confirmed) * Copying HTTP/2 data in stream buffer to connection buffer after upgrade: len=0 * TLSv1.2 (OUT), TLS header, Supplemental data (23): * TLSv1.2 (OUT), TLS header, Supplemental data (23): * TLSv1.2 (OUT), TLS header, Supplemental data (23): * Failed sending HTTP request * Connection #0 to host example.com left intact curl: (55) Failed sending HTTP request
解答
curl不允许用户自定义HTTP/2伪标头,核心原因如下:
- HTTP/2的伪标头(如
:method、:path、:authority、:scheme)是协议规定的专用标头,由curl自动生成和管理,用户无法通过-H选项添加自定义的伪标头(即以冒号开头的自定义标头名称)。 - 当尝试发送自定义伪标头时,curl会判定这类请求不符合协议规范,直接终止发送流程,触发
(55) Failed sending HTTP request错误。
如果需要调整HTTP/2的标准伪标头,可通过curl的专用参数实现:
- 修改
:path:直接在URL中指定目标路径,或使用--request-target参数 - 修改
:method:使用-X或--request参数指定请求方法 - 修改
:authority:通过--header "Host: 目标域名"设置,curl会自动将其映射为HTTP/2的:authority伪标头
内容的提问来源于stack exchange,提问作者Mustafa
相关产品推荐
相关产品推荐

