em-http-request icon indicating copy to clipboard operation
em-http-request copied to clipboard

EventMachine::HttpDecoders::GzipHeader is unnecessary, Zlib::Inflate can do this for you

Open drbrain opened this issue 8 years ago • 4 comments
trafficstars

Zlib provides automatic gzip detection for you so you don't need to skip over it by hand. From inflateInit2 in the zlib manual (also reflected in the Zlib::Inflate.new documentation):

Add 32 to windowBits to enable zlib and gzip decoding with automatic header detection, or add 16 to decode only the gzip format.

So you can replace L228 of EventMachine::HttpDecoders::Gzip with:

# zlib with automatic gzip detection
@zstream ||= Zlib::Inflate.new(32 + Zlib::MAX_WBITS)

And delete the code in GzipHeader to prevent bugs like #284/#301

drbrain avatar Jul 07 '17 02:07 drbrain

Note, this is what Net::HTTP uses for all zlib-based content encodings

drbrain avatar Jul 07 '17 03:07 drbrain

/cc @martoche @eriwen @boxofrad, who've contributed most of the gzip streaming logic.

@drbrain thanks for the heads up. It's not clear to me yet if this will break any of the underlying (streaming) use cases.. shouldn't, right? Also, is there a particular reason you raised this issue now -- are you experiencing some trouble with existing code?

igrigorik avatar Jul 09 '17 19:07 igrigorik

I'm not using it but was inspired to look at the code due to a blog post I read that used this gem instead of using Zlib::Inflate directly. I struggled with the same problem as the GzipHeader skipping code this gem uses for Net::HTTP and noticed the special flag in the zlib documentation.

drbrain avatar Jul 11 '17 06:07 drbrain

Gotcha, thanks Eric. We'll investigate..

igrigorik avatar Jul 11 '17 15:07 igrigorik