2

我想不用说我对以下内容感到困惑。这是我在此处查询的虚假延续: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 响应)?

4

1 回答 1

0

我试图复制你的问题。一切正常。

班级:

class User:
    def GET(self, id):
        """List a single user"""
        web.header('Cache-control', 'no-cache')
        return 'GET' + str(id)

    def POST(self, id):
        """Save an updated user"""
        web.header('Cache-control', 'no-cache')
        raise web.seeother('/user/2')

对于网址: urls = ( r'/user/?(\d*)', "User", )

当我做 POST(使用 FF)时,这一切都有效。

您使用任何中间件吗?

于 2013-01-12T10:30:35.893 回答