我想不用说我对以下内容感到困惑。这是我在此处查询的虚假延续: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!!' 文本作为回应。
如果我发布到这个资源,我会根据请求的来源得到不同的结果。
- 谷歌浏览器:完全失败。使用开发者工具网络分析器,我可以看到请求出去了。大约 15 秒后,它说它失败了。
- IE9:从技术上讲,它有效。等待约 15 秒后,预期的响应总会到达。
- PuTTY/Telnet:完美运行。正如预期的那样,响应几乎是即时出现的。
考虑到 Web 浏览器可能添加了一些破坏 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
- 扑通
- 网页.py
- 我的应用
我现在的问题:
哪个组件实际上“分块”了我的请求?
为什么无法发送最后一个块(仅适用于 POST 响应)?