# File lib/fog/aws/storage.rb, line 647 def initialize(body, signature, signer, date) self.body = body self.date = date self.signature = signature self.initial_signature = signature self.signer = signer if body.respond_to?(:binmode) body.binmode end if body.respond_to?(:pos=) body.pos = 0 end end
# File lib/fog/aws/storage.rb, line 671 def call if finished '' else next_chunk end end
# File lib/fog/aws/storage.rb, line 679 def next_chunk data = body.read(0x10000) if data.nil? self.finished = true data = '' end self.signature = sign_chunk(data, signature) "#{data.length.to_s(16)};chunk-signature=#{signature}\r\n#{data}\r\n" end
called if excon wants to retry the request. As well as rewinding the body we must also reset the signature
# File lib/fog/aws/storage.rb, line 665 def rewind self.signature = initial_signature self.finished = false body.rewind end
# File lib/fog/aws/storage.rb, line 690 def sign_chunk(data, previous_signature) string_to_sign = <<-DATA AWS4-HMAC-SHA256-PAYLOAD #{date.to_iso8601_basic} #{signer.credential_scope(date)} #{previous_signature} #{OpenSSL::Digest::SHA256.hexdigest('')} #{OpenSSL::Digest::SHA256.hexdigest(data)} DATA hmac = signer.derived_hmac(date) hmac.sign(string_to_sign.strip).unpack('H*').first end