2009-12-02 9 views
5

J'utilise Amazon S3 pour servir des fichiers statiques. Quand le Content-Type est juste 'text/css' et que je n'ai pas compressé le fichier, il est renvoyé ok. Si j'essaie de zlib.compress() le contenu qui sera retourné et change Content-Encoding en 'gzip', le navigateur ne peut pas décoder le résultat. Dans Chrome, l'erreur estPython zlib non décodable lorsqu'il est retourné par une réponse http

Error 330 net::ERR_CONTENT_DECODING_FAILED 

dans Safari,

“cannot decode raw data” (NSURLErrorDomain:-1015) 

Y at-il quelque chose de spécial à voir avec la zlib de python pour vous assurer que le résultat peut être retourné et décompressé par le navigateur?

+0

Voici comment faire avec la bibliothèque zlib: http://stackoverflow.com/questions/2695152/in-python-how-do-i-decode-gzip-encoding – Ric

Répondre

0

Il est décodable. Le problème est que l'expéditeur ment au destinataire - ce qui n'est pas un bon moyen d'assurer une communication harmonieuse. Essayez de l'appeler "zlib" au lieu de "gzip".

5

J'ai le même problème.

Si vous envoyez l'en-tête:

Content-Encoding: gzip 

Safari/Chrome montrent que l'erreur.

Mais si vous envoyez à la place:

Content-Encoding: deflate 

Safari/Chrome décode l'amende d'entrée.

+0

Merci! Cela me conduisait shnutz. – charleslparker

0

Au lieu d'utiliser le module zlib, (originalString = inputFile.read() puis compressedString = zlib.compress(originalString)) Je suis maintenant en utilisant le module gzip:

stream = cStringIO.StringIO() 
compressor = gzip.GzipFile(fileobj=stream, mode='w') 
while True: # until EOF 
    chunk = inputFile.read(8192) 
    if not chunk: # EOF? 
     compressor.close() 
     return stream.getvalue() 
    compressor.write(chunk) 

Le résultat est alors compatible gzip; Je ne sais pas si cela corrige aussi votre problème de serveur Web.