views:

20

answers:

3

I come into a trouble implementing a Flex 3.0.0 client that receives compressed HTTP body from server via a socket HTTP library (not class HTTPService ).

First it seems that nginx supports ONLY gzip compression with gzip on;. (Correct me if I'm wrong.) So, add HTTP header of Accept-Encoding: gzip to request.

Then I get a compressed ByteArray from HTTP response with header Content-Encoding: gzip.

The problem here is to decompress the compressed data, namely the HTTP body, correctly.

In later version of Flex, there is a function deflate in ByteArray. But it is absent in Flex 3.0.0. Upgrading to higher version is not an option as it would make existing applications unstable with some new seen and unseen bugs.

Is there an alternative way, code or library, to decompress the gzip data in ByteArray?

A: 

Give this a try:

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

chubbard
I have tried this, but it does not compile for Flex 3.0.0. It relies on deflate function in ByteArray.
OmniBus
+1  A: 

The ByteArray methods that are needed aren't tied to a particular version of Flex. (The ByteArray class isn't a Flex class -- it's part of the built-in classes in Flash Player and AIR.) So even if your app uses Flex 3, if you can target Flash Player 10+ or AIR 1+ then you should be able to use that library.

If that's absolutely not possible, there is another possibility but it will take some work.

This ActionScript library is created for working with .zip files: http://nochump.com/blog/archives/15

However, it doesn't use the built-in ByteArray compression but instead includes an ActionScript implementation of the flate algorithm. So you could (theoretically) use the Inflater class from that library in place of the call to ByteArray.uncompress() in the GZip library mentioned by Chubbard

probertson
It does not compile. It might be the SWC? come with Flex 3.0.0 has no such function in ByteArray. Is that global.swc? I'm not sure.
OmniBus
The library works well. I have modified the GzipEncoder to use it instead of the ByteArray one. Thanks a lot.
OmniBus
A: 

From chubbard and probertson's answer. I have worked out the solution.

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

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

Add GzipEncoder and Zip Library to src

In GzipBytesEncoder.as of GzipEncoder (com.probertson.utils),

replace

srcBytes.deflate();

with

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

And replace

data.inflate();

with

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