1 # -*- encoding: binary -*-
5 # Filter class to wrap IO objects and uncompress DEFLATE'd files
7 # This is used for reading "bigfile" objects generated by the
8 # (deprecated) mogtool(1)
9 class MogileFS::Bigfile::Filter
10 GZIP_HEADER = "\x1f\x8b"
11 INFLATABLE_TYPES = { "file" => true }
12 attr_reader :flushed_bytes
14 def initialize(io, info, opts)
17 @md5 = opts[:verify] ? Digest::MD5.new : nil
22 def md5_check!(expect)
24 current = @md5.hexdigest
26 raise MogileFS::ChecksumMismatchError, "#{current} != #{expect}"
31 @flushed_bytes = @io.write(@zi.finish) if @zi
37 if @info[:compressed] &&
38 INFLATABLE_TYPES.include?(@info[:type]) &&
40 buf[0,2] != GZIP_HEADER
42 @zi = Zlib::Inflate.new
44 # mogtool(1) seems to have a bug that causes it to generate bogus
45 # MD5s if zlib deflate is used. Don't trust those MD5s for now...
52 buf = @zi.inflate(buf)
54 @md5.update(buf) if @md5