【问题标题】:How can I use "Expect: 100-continue" header in Twisted Web?如何在 Twisted Web 中使用“Expect: 100-continue”标头?
【发布时间】:2011-08-27 06:18:43
【问题描述】:

我一直在使用基于 Twisted 的 WebDAV 服务器 AkaDAV,并且我正在尝试支持完整的 litmus 测试套件。我目前被困在 http 子套件上。

具体来说,我可以运行:

$ TESTS=http litmus http://localhost:8080/steder/
-> running `http':
 0. init.................. pass
 1. begin................. pass
 2. expect100............. FAIL (timeout waiting for interim response)
 3. finish................ pass

这个测试基本上做了以下事情:

  1. 打开 WebDAV 服务器的套接字
  2. 发出以下 PUT:

    PUT /steder/litmus/expect100 HTTP/1.1 主机:本地主机:8080 内容长度:100 期望:100-继续

  3. 等待响应 HTTP/1.1 100 Continue 响应。

  4. 上传 100 字节内容负载

这里令人困惑的是,这个 PUT 请求似乎永远不会到达 Twisted。作为一个健全的检查,我已经确认通过curl -X PUT ... 发出的 PUT 请求有效,所以这个测试用例似乎有一些特别之处。

任何想法我可能做错了什么?如果有帮助,我很乐意分享源代码。

编辑:

再环顾四周后,似乎这是一个已知的twisted.web 问题:http://twistedmatrix.com/trac/ticket/4673

有人知道解决方法吗?

【问题讨论】:

  • 因为这是 Twisted 问题,您将在 Twisted 特定论坛上对此问题有更好的响应率 - 我相信它不太可能是 stackoverflow.com 所填充的“普通程序员”解决这个问题。

标签: python http twisted webdav


【解决方案1】:

经过更多调查,如何修改 HTTP 协议实现以支持此用例已经很清楚了。看起来官方修复程序很快就会在 Twisted 中发布,但与此同时我正在使用它作为解决方法。

在您实例化您的Site(或t.w.http.HTTPFactory)之前,只需包含此代码:

from twisted.web import http


class HTTPChannelWithExpectContinue(http.HTTPChannel):
    def headerReceived(self, line):
        """Just extract the header and handle Expect 100-continue:
        """
        header, data = line.split(':', 1)
        header = header.lower()
        data = data.strip()
        if (self._version=="HTTP/1.1" and
            header == 'expect' and data.lower() == '100-continue'):
            self.transport.write("HTTP/1.1 100 Continue\r\n\r\n")
        return http.HTTPChannel.headerReceived(self, line)


http.HTTPFactory.protocol = HTTPChannelWithExpectContinue

我想如果您需要在协议级别进行其他修改,您也可以使用相同的方法来修补它们。它不一定漂亮,但对我有用。

【讨论】:

  • 这是解决此问题的一种非常粗略的方法。 expect continue 的目的是让服务器有机会在客户端开始发送之前拒绝可能很大的请求,从而为双方节省带宽。更好的解决方案可能是调用协议上的方法,该方法可以返回 true 或 false 以指示应接受请求(默认始终返回 true)
猜你喜欢
  • 1970-01-01
  • 2013-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-04
  • 2022-11-21
相关资源
最近更新 更多