2011-03-25 74 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)。