我尝试使用 EncodingResourceWrappper 和 GzipEncoderFactory 来压缩我扭曲的 Web 服务器响应。
这似乎适用于大多数文件。但我无法提供稍后通过 requirejs 加载的 JavaScript 文件。(浏览器(Chrome 或 Firefox)只是不停地旋转。
当我将 JavaScript 源路径作为 URL 输入时,这些文件可以正常运行。[更新:不,因为它们来自浏览器缓存]
这些文件可以从 AppEngine 中正常使用(它也可以压缩它们)。
class SharedRoot(resource.Resource):
"""Root resource that combines the two sites/entry points"""
WSGI = None
def getChild(self, child, request):
request.prepath.pop()
request.postpath.insert(0, child)
return self.WSGI
def render(self, request):
return self.WSGI.render(request)
def render_POST(self, request):
logger.debug(pformat(request.__dict__))
newdata = request.content.getvalue()
logger.debug(newdata)
return ''
class WildcardResource(resource.Resource):
def __init__(self, childResource):
resource.Resource.__init__(self)
self.childResource=childResource
def getChild(self,child, request):
return self.childResource
class GzipFileResource(static.File):
def getChild(self, path, request):
child = super(GzipFileResource, self).getChild(path, request)
return EncodingResourceWrapper(child, [GzipEncoderFactory()])
class DynamicFile(GzipFileResource):
def render_GET(self, request):
request.setHeader("Cache-Control", ["no-cache"])
request.setHeader("Pragma", ["no-cache"])
request.setHeader("Expires", ["Sat, 26 Jul 1997 05:00:00 GMT"])
return super(DynamicFile, self).render_GET(request)
shared=SharedRoot()
shared.WSGI=EncodingResourceWrapper(wsgiResource,[GzipEncoderFactory()])
shared.putChild("static",GzipFileResource("static"))
shared.putChild("css", GzipFileResource("static/css"))
shared.putChild("js",WildcardResource(GzipFileResource("source")))
有任何想法吗?
更新:
跟踪和调试表明,脚本文件 > 64 KB 时会出现问题,其中第一次调用 gzip 压缩对象只返回 gzip 标头(我可以在网络跟踪中看到),第二次调用什么也不返回(因为其余的压缩输出将通过刷新调用发生(我在网络跟踪中看不到)。
增加缓冲区大小(abstract.FileDescriptor)的测试并没有解决问题