如何在Twisted Web中使用“Expect:100-continue”标题?

时间:2011-08-27 06:18:43

标签: python http twisted webdav

我一直在使用基于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 主持人:localhost:8080 内容长度:100 期待:100-continue

  3. 等待回复HTTP/1.1 100 Continue回复。

  4. 上传100字节内容有效负载
  5. 令人困惑的是,看起来这个PUT请求永远不会让它变成Twisted。作为一个完整性检查我已经确认通过curl -X PUT ...发出的PUT请求工作,所以看起来这个测试用例有些特别之处。

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

    编辑:

    再看一遍后,这是一个众所周知的twisted.web问题:http://twistedmatrix.com/trac/ticket/4673

    有没有人知道解决方法?

1 个答案:

答案 0 :(得分: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

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