def sign_request req, options = {}
datetime = options[:datetime] || Time.now.utc.strftime("%Y%m%dT%H%M%SZ")
key = derive_key(datetime)
token = credentials.session_token
chunk_signing = !!options[:chunk_signing]
content_sha256 = req.headers['x-amz-content-sha256'] || body_digest(req, chunk_signing)
req.headers['host'] = req.host
req.headers['x-amz-date'] = datetime
req.headers['x-amz-security-token'] = token if token
req.headers['x-amz-content-sha256'] = content_sha256
if chunk_signing
orig_size = req.headers['content-length'].to_i
signed_size = ChunkSignedStream.signed_size(orig_size.to_i)
req.headers['content-length'] = signed_size.to_s
req.headers['x-amz-decoded-content-length'] = orig_size.to_s
end
req.headers['authorization'] = authorization(req, key, datetime, content_sha256)
req.body_stream = chunk_signed_stream(req, key) if chunk_signing
req
end