扭曲的http gzip支持

时间:2011-03-25 04:13:12

标签: twisted

我希望用Python帮助一个开源项目。 据我所知,Twisted不支持使用http发送和接收gzip信息: http://twistedmatrix.com/trac/ticket/104

谷歌似乎证实了这一点,因为我找不到任何提及它的文件。 我的问题是我对此是否正确,或者这是否已经改变? 或者,它对任何人都有用吗?我想有一个原因尚未实施。

对不起,如果这不是正确的地方......

4 个答案:

答案 0 :(得分:6)

现在可以使用Resource Encoders。引用该链接:

from twisted.web.server import Site, GzipEncoderFactory
from twisted.web.resource import Resource, EncodingResourceWrapper
from twisted.internet import reactor

class Simple(Resource):
    isLeaf = True
    def render_GET(self, request):
        return "<html>Hello, world!</html>"

resource = Simple()
wrapped = EncodingResourceWrapper(resource, [GzipEncoderFactory()])
site = Site(wrapped)
reactor.listenTCP(8080, site)
reactor.run()

有关详细信息,请参阅链接。问题中的票证现在也已关闭。

答案 1 :(得分:6)

来自EncodingResourceWrapper的文档:

  

请注意,返回的子资源不会被包装,所以你   如果你想要应用编码,必须明确地包装它们。

因此,如果Resource实现getChild,那么您也需要包装该资源 例如:

from twisted.web.server import Site, GzipEncoderFactory
from twisted.web.resource import EncodingResourceWrapper
from twisted.web import static
from twisted.internet import reactor
from twisted.python import log
import sys
log.startLogging(sys.stdout)

class WebServer(static.File):        
    def getChild(self, path, request):
        child = static.File.getChild(self, path, request)            
        return EncodingResourceWrapper(child, [GzipEncoderFactory()])

resource = WebServer('/tmp')

site = Site(resource)
reactor.listenTCP(8080, site)
reactor.run()

您可以使用 netcat

进行测试
printf 'GET /  HTTP/1.1\r\nHost: localhost\r\nAccept-Encoding: gzip,deflate\r\nConnection: close\r\n\r\n' | nc localhost 8080

答案 2 :(得分:3)

故障单仍处于打开状态,因此在Twisted中仍然无法使用此功能。但是,Nevow支持发送gzip压缩响应:http://bazaar.launchpad.net/~divmod-dev/divmod.org/trunk/view/head:/Nevow/nevow/compression.py。由于Nevow可以轻松地将Twisted Web结合使用,因此这可能是获得所需内容的一种方式。

希望有一天该功能也将从Nevow移植到Twisted Web。

答案 3 :(得分:1)

我想扩大一点@ danbrough的好答案以防其他人降落在这里: 所有的拳头,如果你碰巧把孩子放在IResource.putChild,他的解决方案不会直接工作,你必须覆盖IResource.getChildWithDefault而不是IResource.getChild。< / p>

还有一种情况是,使用HTTP BasicAuthentication 保护一些资源并且使用Gzip压缩它们有点棘手,因为上面的工作没有成功。在这种情况下,您需要摆弄HTTPAuthSessionWrapper,如下所示:

class GzipAuthSessionWrapper(HTTPAuthSessionWrapper):
  def getChildWithDefault(self, path, request):
    child = HTTPAuthSessionWrapper.getChildWithDefault(self, path, request)
    gzipChild = EncodingResourceWrapper(child, [GzipEncoderFactory()])
    return gzipChild

您还必须像往常一样设置RealmCheckersPortaldocumentation)。