socket_common: limit IO#write garbage workaround to <= 2.4
[ruby-mogilefs-client.git] / lib / mogilefs / chunker.rb
blob7d914526ca05e9206337fd4c8064d625be56a803
1 # -*- encoding: binary -*-
2 class MogileFS::Chunker
3   attr_reader :io
5   def initialize(io, md5, expect_md5)
6     @io = io
7     @md5 = md5
8     @expect_md5 = expect_md5
9   end
11   def write(buf)
12     rv = buf.bytesize
13     @io.write("#{rv.to_s(16)}\r\n")
14     @io.write(buf)
15     @md5.update(buf) if @md5
16     @io.write("\r\n".freeze)
17     rv
18   end
20   def flush
21     if @md5
22       content_md5 = [ @md5.digest ].pack('m').rstrip!
23       if @expect_md5.respond_to?(:call)
24         expect = @expect_md5.call.strip
25         if expect != content_md5
26           raise MogileFS::ChecksumMismatchError,
27             "expected: #{expect.inspect} actual: #{content_md5.inspect}"
28         end
29       end
30       @io.write("0\r\nContent-MD5: #{content_md5}\r\n\r\n")
31     else
32       @io.write("0\r\n\r\n".freeze)
33     end
34   end
35 end