HTTP POST响应失败使用Web.py

时间:2013-01-03 02:40:17

标签: python http wireshark web.py

我想不用说,我对以下内容感到困惑。这是我在这里查询的虚假延续: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,我会根据请求的来源获得混合结果。

  • Google Chrome:完全失败。使用开发人员工具网络分析器,我可以看到请求消失。大约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响应似乎缺少最后一个块。因此,连接保持打开状态直到超时(因为它希望从服务器获得更多数据)。

以下是触及服务器端请求的内容。我不确定哪一个负责“分块”数据。

  • 的Apache
  • mod_cgi一样
  • flup
  • web.py
  • 我的应用

我现在的问题:

哪个组件实际上是“我的请求”?

为什么无法发送最后一个块(仅用于POST响应)?

1 个答案:

答案 0 :(得分: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)时,这一切都正常工作。

您使用任何中间件吗?