Python hyper HTTP20Connection 以 1024 字节块发送数据

Posted

技术标签:

【中文标题】Python hyper HTTP20Connection 以 1024 字节块发送数据【英文标题】:Python hyper HTTP20Connection is sending DATA in 1024 byte chunks 【发布时间】:2020-12-16 20:27:19 【问题描述】:

我正在尝试使用超 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 中作为三个单独的正文片段发送。虽然我认为这应该是完全有效的,但这是我在工作 HTTP/2 POST(使用curl --http2-prior-knowledge)和失败的 HTTP/2 POST(使用hyper)之间找到的唯一区别。当我使用curl 时,它会以单个数据包(长度为 2557 字节)发送数据,并且服务器会成功响应。但是,当我使用 hyper 发送具有相同标头的相同数据时,我遇到了失败 (404)。所以我试图让数据在一个数据包中发送,而不是分成三个数据包。有什么建议吗?

【问题讨论】:

【参考方案1】:

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

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

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

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

【讨论】:

以上是关于Python hyper HTTP20Connection 以 1024 字节块发送数据的主要内容,如果未能解决你的问题,请参考以下文章

AVS V2 建立 HTTP2 连接

python操作mysql

使用Hyper HTTP Client实施重试

python下操作mysql 之 pymsql

CLOUDSTACK FOR HYPER-V

安装VMware16兼容Hyper-v+WSL2+Docker+解决0x80370102报错