我正在尝试通过HTTP与网络交换机通信。当我使用aiohttp执行请求时,会收到ServerDisconnectedError,但是当我尝试使用请求,cURL或Postman执行相同的请求时,则会收到HTTP响应,就像我期望的那样。我尝试在Postman中更改一堆标题,以查看是否可以得到与aiohttp类似的行为,但是没有任何东西会重现相同的错误。
我还尝试更改aiohttp请求中的某些标头。奇怪的是,导致问题的唯一原因是在aiohttp.post参数中设置了compress=True
。当我以此方式执行请求时,服务器实际上确实发送了HTTP响应,但是该响应并未反映API应该如何表现(我认为它明确拒绝了我正在使用压缩的事实)。
当在Wireshark中分析这些请求时,当我使用不带compress=True
的aiohttp时,交换机确实在发送HTTP响应之前确实发送了TCP FIN数据包。
关于aiohttp,我注意到的一个独特之处是它使用2个TCP数据包执行请求:第一个数据包包含HTTP方法和标头,第二个数据包包含HTTP正文。另外,在第一个数据包上设置了PSH标志。
Wireshark capture using aiohttp
使用cURL时似乎不会发生这种情况。
我想将其隔离为问题还是非问题,但是我不知道如何使程序首先在一个数据包中发送请求,然后在两个数据包中发送相同的请求。< / p>
当然,这在TCP层上可能根本不是问题。但是我不明白为什么交换机会关闭连接而不是发送HTTP错误代码。