in reply to Re^4: uncompress gzip data in a callback (Updated)
in thread uncompress gzip data in a callback

It can accept lots of little bits of compressed data because that is what I designed Compress::Raw::Inflate to do. In the code I posted the $gun object that the mkGunz closure creates will maintain the context of the overall compressed data stream - that is the key part that allows it to be fed small snippets of compressed data a bit at a time.

The code worked fine when I tried it before posting. How did you compress the data used in your origin server?

  • Comment on Re^5: uncompress gzip data in a callback

Replies are listed 'Best First'.
Re^6: uncompress gzip data in a callback(Updated)
by BrowserUk (Patriarch) on May 04, 2010 at 17:12 UTC

    Update: Added WindowBits(see below) and it now works fine! (Why is that not the default?)

    Dodging all the issues of LWP configuration, Accept-Encodings etc. I tried this which is equivalent:

    C:\test>gzip junk.htm C:\test>type junk38.pl #! perl -slw use strict; use Compress::Raw::Zlib; my $o = new Compress::Raw::Zlib::Inflate( ######### I forgot this. With it, it works perfectly.################# +####### WindowBits => WANT_GZIP_OR_ZLIB, ); binmode STDIN; while( read( STDIN, my $in, int( rand 1024 ) ) ) { my $st = $o->inflate( $in, my $out ); die "$st" unless $st == Z_OK; print $out; } C:\test>perl junk38.pl < junk.htm.gz data error at junk38.pl line 12.

    And I always get 'data error'?


    Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
    "Science is about questioning the status quo. Questioning authority".
    In the absence of evidence, opinion is indistinguishable from prejudice.
      You've missed the WindowsBits option in the constructor and you should also test for Z_STREAM_END in the main loop.

      This is how I would write the loop.

      #! perl -slw use strict; use Compress::Raw::Zlib; my $o = new Compress::Raw::Zlib::Inflate( WindowBits => WANT_GZIP ); binmode STDIN; my $status; while( read( STDIN, my $in, int( rand 1024 ) ) ) { $status = $o->inflate($in, my $out) ; print $out if $status == Z_OK or $status == Z_STREAM_END ; last if $status != Z_OK ; } die "inflation failed\n" unless $status == Z_STREAM_END ;