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 字节块发送数据的主要内容,如果未能解决你的问题,请参考以下文章