EncodingResourceWrappper と GzipEncoderFactory を使用して、ねじれた Web サーバーの応答を gzip しようとしました。
これは、ほとんどのファイルで機能するようです。しかし、requirejs を介して後で読み込まれる JavaScript ファイルを提供することはできません。(ブラウザ (Chrome または Firefox) は回転し続けます。
JavaScript ソース パスを URL として入力すると、ファイルは正常に機能します。[更新: いいえ、ブラウザのキャッシュから出てきたので]
ファイルは AppEngine から問題なく提供されます (gzip も行います)。
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 ヘッダーが返されるだけで (ネットワーク トレースで確認できます)、2 回目の呼び出しでは何も返されません (残りの圧縮された出力は、フラッシュ呼び出しで発生します (ネットワーク トレースでは確認できません)。
(abstract.FileDescriptor の) バッファー サイズを増やしてテストしても問題は解決しませんでした。