python - Python hyper HTTP20Connection 以 1024 字节块发送数据
问题描述
我正在尝试使用超 0.7.0 作为客户端发送一些 HTTP/2 数据。数据在发送到服务器之前被分成 1024 字节的段(让我很懊恼)。当我查看 HTTP/2 SETTINGs 数据包时,我看不到任何可以将大小降低到 64 kB 以下的东西,我认为这是连接和流的默认值。有没有办法知道为什么选择 1024,以及如何增加它?
我试过了:
from hyper import HTTP20Connection
from hyper.http20.window import BaseFlowControlManager
...
class LargerWindowControlManager(BaseFlowControlManager):
def __init__(self, *args, **kwargs):
super().__init__(64000)
...
remote_connection = HTTP20Connection(f'{remote_node}', timeout=600)
remote_connection.network_buffer_size = 256000
...
remote_connection.request('POST', f'{path}', body=data, headers=headers, window_manager=LargerWindowControlManager)
我data
的长度约为 2557 字节,它在 Stream ID = 1 中作为三个单独的正文片段发送。curl --http2-prior-knowledge
虽然我认为这应该是完全有效的,但这是我在工作的 HTTP/2 POST (with ) 和失败的 HTTP/2 POST with之间找到的唯一区别hyper
。当我使用curl
它时,它以单个数据包(长度为 2557 字节)发送数据,服务器响应成功。但是当我发送具有相同标头的相同数据时hyper
,我得到一个失败(404
)。所以我试图让数据在一个数据包中发送,而不是分成三个数据包。有小费吗?
解决方案
我发现这可以通过在源代码中更改来全局更改:
超0.7.0/hyper/http20/stream.py:MAX_CHUNK = 1024
我不知道它是否可以在每个连接或每个会话的基础上进行更改。而且由于某种原因,即使我以这样的大块发送它,我仍然会从服务器收到 404 错误。
最后的问题是 hyper 发送的 :Authority 标头仅包含服务器的 IP。服务器需要标头包含 IP:Port。
推荐阅读
- excel - 仅将过滤后的数据/可见单元格从多个工作表复制到新工作簿
- reactjs - Recharts:allowDuplicatedCategories 中断工具提示
- visual-studio-code - 如何在 VS Code 中的行首或行尾获取多个光标?
- gremlin - 在 Tinkerpop Graph 中重新运行现有路线
- python - 基于 DatetimeIndex 变量对 Pandas 数据框进行重采样
- javascript - 当前页和上一页的url
- javascript - 在 JSel 中转义方括号
- typescript - 如何正确遍历 TypeScript 中的对象
- c++ - 使用指针在 C++ 中解读单词
- c# - 实体框架避免多对多关系中的重复