【发布时间】:2012-12-17 10:15:57
【问题描述】:
我想不用说我对以下内容感到困惑。这是我在此处查询的虚假延续:HTTP 303 (SeeOther): GET Works, POST Fails 我正在发布另一个问题,因为另一个问题主要处理 HTTP 重定向,并且没有解决我现在认为是潜在问题的问题。
我有一个非常简单的 web.py 类:
class user:
def GET(self, id):
"""List a single user"""
web.header('Cache-control', 'no-cache')
return 'wtf!!'
def POST(self, id):
"""Save an updated user"""
web.header('Cache-control', 'no-cache')
return 'wtf!!'
如果我从这个资源中获取,我会收到我的愚蠢简单的“wtf!!”回复文字。
如果我 POST 到这个资源,我会根据请求的来源得到不同的结果。
- 谷歌浏览器:完全失败。使用开发者工具网络分析器,我可以看到请求出去了。大约 15 秒后,它说它失败了。
- IE9: 从技术上讲,它可以工作。等待约 15 秒后,预期的响应总会到达。
- PuTTY/Telnet: 完美运行。正如预期的那样,响应几乎是即时出现的。
考虑到可能是网络浏览器添加了一些破坏 web.py 的标头,我决定打开 Wireshark 进行调查。我发现客户总是及时收到回复。但是,我确实注意到 Wireshark 没有将 POST 请求的响应识别为 HTTP(这是它对 GET 请求的响应会做的事情)。
编辑: 我一直在对此进行测试/故障排除,并且我有更多的进展。
GET 和 POST 响应都以“Transfer-encoding: chunked”标头返回客户端。这意味着它不会发送整个页面,而是会在它们准备好时发送点点滴滴。一般格式为:
200 OK, etc
{Headers}
5 # Num. of Chars in This Chunk (in hex)
Hello
200 OK, etc
{Headers}
0 # Signifies no more chunks to come
我使用 Wireshark 来查找这些数据包。我注意到 GET 响应看起来应该如此,但 POST 响应似乎缺少最后一块。因此,连接会一直保持打开状态,直到超时(因为它希望更多数据来自服务器)。
以下是涉及服务器端请求的内容。我不确定哪个负责“分块”数据。
- 阿帕奇
- mod_cgi
- 扑通
- web.py
- 我的应用
我现在的问题:
哪个组件实际上“分块”了我的请求?
为什么无法发送最后一个块(仅适用于 POST 响应)?
【问题讨论】:
-
我现在正在处理一个几乎相同的问题。虽然这是一个 3 年前的问题,但如果您记得如何解决它,我将非常感谢您的帮助。如果您对我的问题的详细信息感兴趣,我将它们发布在这里:stackoverflow.com/questions/36092395/…
-
不幸的是,我认为我没有找到解决方案。我发现我在 web.py 上的大部分时间都花在了解决像这样的小问题上。出于这个原因(以及稀疏的支持/更新),我转向了其他事情。
标签: python http wireshark web.py