首页 > 解决方案 > 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)。所以我试图让数据在一个数据包中发送,而不是分成三个数据包。有小费吗?

标签: pythonhttp2packethyper

解决方案


我发现这可以通过在源代码中更改来全局更改:

超0.7.0/hyper/http20/stream.py:MAX_CHUNK = 1024

我不知道它是否可以在每个连接或每个会话的基础上进行更改。而且由于某种原因,即使我以这样的大块发送它,我仍然会从服务器收到 404 错误。

最后的问题是 hyper 发送的 :Authority 标头仅包含服务器的 IP。服务器需要标头包含 IP:Port。


推荐阅读