2010-10-27 4 views
1

Je rencontre un problème lors de l'implémentation d'un client Flex 3.0.0 qui reçoit le corps HTTP compressé du serveur via une bibliothèque HTTP socket (pas class HTTPService).Ecriture Flex 3 Algorithme de dégonflement ByteArray

D'abord, il semble que nginx ne supporte que la compression gzip avec gzip on;. (Corrigez-moi si je me trompe.) Donc, ajoutez l'en-tête HTTP de Accept-Encoding: gzip pour demander.

Ensuite, je reçois une réponse HTTP ByteArray compressée avec l'en-tête Content-Encoding: gzip.

Le problème ici est de décompresser les données compressées, à savoir le corps HTTP, correctement.

Dans la version ultérieure de Flex, il existe une fonction deflate dans ByteArray. Mais il est absent dans Flex 3.0.0. La mise à niveau vers une version supérieure n'est pas une option, car cela rendrait les applications existantes instables avec de nouveaux bogues visibles et invisibles.

Existe-t-il une méthode, un code ou une bibliothèque alternative pour décompresser les données gzip dans ByteArray?

Répondre

1

Les méthodes de ByteArray nécessaires ne sont pas liés à une version particulière de Flex. (La classe ByteArray n'est pas une classe Flex - elle fait partie des classes intégrées dans Flash Player et AIR.) Donc, même si votre application utilise Flex 3, si vous pouvez cibler Flash Player 10+ ou AIR 1+, alors vous devrait pouvoir utiliser cette bibliothèque.

Si ce n'est absolument pas possible, il y a une autre possibilité mais cela demandera du travail.

Cette bibliothèque ActionScript est créée pour travailler avec des fichiers .zip: http://nochump.com/blog/archives/15

Cependant, il n'utilise pas la compression intégré ByteArray mais comprend plutôt une implémentation de l'algorithme ActionScript flate. Vous pouvez donc (théoriquement) utiliser la classe Inflater de cette bibliothèque à la place de l'appel à ByteArray.uncompress() dans la bibliothèque GZip mentionnée par Chubbard

+0

Il ne compile pas. Ce pourrait être le SWC? venir avec Flex 3.0.0 n'a pas une telle fonction dans ByteArray. Est-ce global.swc? Je ne suis pas sûr. – OmniBus

+0

La bibliothèque fonctionne bien. J'ai modifié le GzipEncoder pour l'utiliser à la place de celui de ByteArray. Merci beaucoup. – OmniBus

1

De la réponse de chubbard et probertson. J'ai travaillé sur la solution.

http://probertson.com/projects/gzipencoder/

http://nochump.com/blog/archives/15

Ajouter GzipEncoder et Bibliothèque Zip Src

En GzipBytesEncoder.as de GzipEncoder (com.probertson.utils),

remplacer

srcBytes.deflate(); 

avec

var outBuffer:ByteArray = new ByteArray; 
var deflater:Deflater = new Deflater(); 
deflater.setInput(srcBytes); 
deflater.deflate(outBuffer) 
srcBytes = outBuffer; 

Et remplacer

data.inflate(); 

avec

var outBuffer:ByteArray = new ByteArray; 
var inflater:Inflater = new Inflater(); 
inflater.setInput(data); 
inflater.inflate(outBuffer) 
data = outBuffer;