Поддержка Twisted http gzip - PullRequest
       5

Поддержка Twisted http gzip

9 голосов
/ 25 марта 2011

Я хочу помочь проекту с открытым исходным кодом на Python.Насколько я могу судить, Twisted не поддерживает отправку и получение gzip-информации с http: http://twistedmatrix.com/trac/ticket/104

Похоже, Google подтверждает это, поскольку я не нашел упоминаний об этом в документации.У меня вопрос, прав ли я по этому поводу, или это изменилось?Альтернативно, действительно ли это кому-нибудь полезно?Я думаю, что есть причина, по которой он еще не был реализован.

Извините, если это не то место, чтобы спрашивать ...

Ответы [ 4 ]

6 голосов
/ 04 марта 2013

Теперь это возможно с использованием кодировщиков ресурсов .Цитирование по этой ссылке:

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

См. Ссылку для получения дополнительной информации.Билет в вопросе теперь также закрыт.

6 голосов
/ 09 июля 2013

Из документации для 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
3 голосов
/ 25 марта 2011

Билет все еще открыт, поэтому правильно, что эта функция все еще недоступна в Twisted.Тем не менее, Nevow включает поддержку отправки gzipped ответов: http://bazaar.launchpad.net/~divmod-dev/divmod.org/trunk/view/head:/Nevow/nevow/compression.py. Поскольку Nevow может легко использовать Twisted Web, это может быть способом получить то, что вы хотите.

Надеемся, что эта функция также будеткогда-нибудь также портировал с Nevow на Twisted Web.

1 голос
/ 09 апреля 2015

Я бы хотел немного расширить замечательный ответ @ danbrough в случае, если кто-то еще приземлится здесь: в первую очередь, если вам случится поставить детей с 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

Вам также нужно будет настроить Realm, Checkers и Portal как обычно ( документация ).

...