2011-03-25 69 views
9

我正在寻求帮助Python的开源项目。 据我所知,扭不支持发送和以http接收gzip的信息: http://twistedmatrix.com/trac/ticket/104扭曲的http gzip支持

谷歌似乎也印证了它,因为我找不到它的任何一提的文档。 我的问题是我对此是否正确,或者这是否改变了? 或者,它对任何人都有用吗?我猜这有一个原因尚未实现。

很抱歉,如果这是不是要问正确的地方...

+0

我怀疑很多关心HTTP gzip压缩的人在其他HTTP服务器(如Apache或nginx)后面运行twisted.web应用程序。因此,有扭曲的支持。网络并不特别有趣或重要。也就是说,没有理由为什么每个人都应该*有*在像这样的设置中运行他们的应用程序。像往常一样,答案是“为什么不实施呢?”只是“没有人做过这项工作”...... – mithrandi 2011-03-26 05:56:59

回答

3

票仍然是开放的,所以它是正确的,这个功能还没有在扭曲使用。但是,Nevow支持发送gzip响应:http://bazaar.launchpad.net/~divmod-dev/divmod.org/trunk/view/head:/Nevow/nevow/compression.py。由于Nevow可以很容易地将Twisted Web一起使用,所以这可能是一种获得您想要的方式。

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

+0

如果他的目标是用Python来帮助开源项目,那么将这个特性从Nevow移植到Twisted将是一个很好的方法! – Glyph 2011-03-25 19:34:49

+0

将nevow.compression移植到twisted.web应该相对容易;我相信唯一需要做的重大更改是删除Nevow的请求API所要求的finishRequest错误,并改为取代IRequest.finish。 – mithrandi 2011-03-26 05:55:09

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() 

查看链接了解更多信息。问题中的票现在也关闭了。

+2

重要的是要注意,在这个例子中,isLeaf被设置为true,所以包装的资源将被识别为具有编码器。如果isLeaf不是true,那么getChild将被调用,并且可能不会被EncodingResourceWrapper包装。 – Chris 2016-02-07 15:35:20

6

从文档EncodingResourceWrapper

注意,返回的儿童的资源不会被包裹着,所以你 有,如果你想被应用的编码,以明确他们包裹。

所以,如果一个Resource工具getChild,那么你就需要来包装资源为好。
例如:

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

我想扩大一点@ danbrough是万一别人的土地伟大的答案在这里:的 拳

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的测试所有,如果你碰巧把IResource.putChild的孩子,他的解决方案将不会直接工作,你将不得不覆盖IResource.getChildWithDefault,而不是只有IResource.getChild

这也恰好,即具有HTTP BasicAuthentication为他们服务的压缩与Gzip保护一些资源是有点棘手,因为上面将无法工作。在这种情况下,您需要与HTTPAuthSessionWrapper这样拨弄:

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

您还必须建立RealmCheckersPortal如常(documentation)。