【问题标题】:HTTP POST Response Fails Using Web.py使用 Web.py 的 HTTP POST 响应失败
【发布时间】: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


【解决方案1】:

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

类:

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)时,这一切都正常。

您是否使用任何中间件?

【讨论】:

  • 我对中间件有点不确定。如果中间件是我在 app.run(middleware) 中添加的东西,那么我没有使用任何东西。但是,我在 Apache 的 mod_cgi 之上使用了 Flup。我最近一直在研究这个问题,我很快就会用更多信息更新这个问题。
  • 也许是 Apache Config 中的 KeepAlive 指令?我不使用 apache 和/或 mod_cgi,所以在这里帮不了你。
  • mod_cgi和webpy无关!
猜你喜欢
  • 2018-04-26
  • 2020-06-01
  • 1970-01-01
  • 2013-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-12
  • 2020-09-04
相关资源
最近更新 更多