Zlib bug or intended behaviour?

Hi,

I recently had to inflate a malformed compressed (RFC1950) string. The
zlib magicbytes as well as the adler32-crc were missing.
I tried different ways to inflate the string. First I prepended the zlib
magic byte "\x78\x01" without success. 2nd I used the Zlib::Inflate
object and pipedin the magicbytes which worked to my surprise.
Can anybody tell me the difference of the internal behaviour of zlib, or
is it a bug?

Here's the code which shows the different ways (tested on Ruby 1.9.3):

require 'zlib'
zipped = Zlib.deflate("Hello World!")
# cut off header and adler32
bad = zipped[2..-5]

begin
  puts "* unzipping bad string the regular way ..."
  puts Zlib.inflate bad
rescue => bang
  puts " >> Error"
  puts bang
end

puts

begin
  puts "* inflating bad string with prepended zlib header ..."
  prepended = "\x78\x01"
  prepended << bad
  puts Zlib.inflate prepended
rescue => bang
  puts bang
end

puts

begin
  puts "* inflating bad string the other way ..."
  header ="\x78\x01"
  zs = Zlib::Inflate.new
  zs << header
  puts zs.inflate bad
rescue => bang
  puts bang
  exit
end
puts

puts "Why did this work?"

···

--
Posted via http://www.ruby-forum.com/.