Dev*_*ion 7 django rest curl amazon-web-services cloudflare
我有一个 Django 应用程序,它在调用 API 时返回一个大的 JSON。问题是当我请求数据时,数据本身被截断,导致前端崩溃。
我将云前端用于 DNS 和 SSL 以及它们提供的其他功能,用于缓存和提高性能。
我尝试卷曲 API 并从 curl 中得到以下错误:
curl: (92) HTTP/2 流 1 没有完全关闭:INTERNAL_ERROR (err 2)
我尝试禁用 Cloudflare 但没有用。然而,在我的本地主机上,一切正常。
HTTP/2 流 1 没有完全关闭:INTERNAL_ERROR (err 2)
- 关闭连接 0
- TLSv1.2 (OUT)、TLS 警报、客户端问候 (1): curl: (92) HTTP/2 流 1 没有完全关闭:INTERNAL_ERROR (err 2)
JSON 应该被完全获取而不会被分块。
veb*_*ben 32
我使用以下命令在 AWS Application Load Balancer 后面的应用程序中遇到了同样的错误:
curl "https://console.aws.example/api/xxx" -b "SESSION=$SESSION"
Run Code Online (Sandbox Code Playgroud)
15:14:30curl:(92)HTTP/2流1没有完全关闭:PROTOCOL_ERROR(错误1)
我不得不通过参数强制使用HTTP/1.1--http1.1
所以最终的命令是:
curl "https://console.aws.example/api/xxx" -b "SESSION=$SESSION" --http1.1
Run Code Online (Sandbox Code Playgroud)
修复或删除Content-LengthHTTP 请求中的标头。
当我尝试连接到 AWS 网关时,出现了这个问题。我能够使用 POSTMAN 获得正确的响应,但如果我将相同的标头复制到curl,则会出现此错误。
最终对我有用的是删除Content-Length标头,因为请求的长度与 POSTMAN 中的请求长度curl不匹配。
因为就我而言,我只是测试 API,所以这很好,但我不建议在生产中删除这个标头。如果您在代码库中遇到这种情况,请检查以确保长度计算正确。
我在使用 AWS 的应用程序负载均衡器 (ALB) 时遇到了这个问题。这个问题是我将 Apache 配置为使用 http2,但在 ALB 后面。ALB 默认支持 http2:
应用程序负载均衡器通过 HTTPS 侦听器为 HTTP/2 提供本机支持。您可以使用一个 HTTP/2 连接并行发送多达 128 个请求。负载均衡器将这些转换为单独的 HTTP/1.1 请求,并将它们分发到目标组中的健康目标。因为 HTTP/2 更有效地使用前端连接,您可能会注意到客户端和负载均衡器之间的连接更少。您不能使用 HTTP/2 的服务器推送功能。1
因此,curl 使用 HTTP/2 连接 ALB,然后将其转换为 HTTP/1 请求。Apache 正在向请求客户端添加UpgradeHTTP/2响应头,ALB 刚刚将其传递回客户端,并且 curl 将其读取为无效,因为它已经在使用 HTTP/2 连接。我通过在我的 Apache 实例上禁用 HTTP/2 解决了这个问题。由于它将始终位于 ALB 之后,并且 ALB 永远不会使用 HTTP/2,因此拥有它是没有意义的。
| 归档时间: |
|
| 查看次数: |
20538 次 |
| 最近记录: |