我一直在使用基于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
此测试基本上执行以下操作:
发出以下PUT:
PUT / steder / litmus / expect100 HTTP / 1.1 主持人:localhost:8080 内容长度:100 期待:100-continue
等待回复HTTP/1.1 100 Continue
回复。
令人困惑的是,看起来这个PUT请求永远不会让它变成Twisted。作为一个完整性检查我已经确认通过curl -X PUT ...
发出的PUT请求工作,所以看起来这个测试用例有些特别之处。
任何想法我可能做错了什么?如果有帮助,我很乐意分享源代码。
编辑:
再看一遍后,这是一个众所周知的twisted.web
问题:http://twistedmatrix.com/trac/ticket/4673
有没有人知道解决方法?
答案 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
我想如果您需要在协议级别进行其他修改,您也可以使用相同的方法对它们进行修补。它不一定漂亮,但它对我有用。