mirror of
https://github.com/fog/fog.git
synced 2022-11-09 13:51:43 -05:00
more consistency, move sign stuff to its own method
This commit is contained in:
parent
d2ab5aa300
commit
2dea3f3b7f
4 changed files with 67 additions and 49 deletions
27
benchs/stripping.rb
Normal file
27
benchs/stripping.rb
Normal file
|
@ -0,0 +1,27 @@
|
|||
require 'rubygems'
|
||||
require 'benchwarmer'
|
||||
|
||||
COUNT = 1_000_000
|
||||
data = "Content-Length: 100\r\n"
|
||||
Benchmark.bmbm(25) do |bench|
|
||||
bench.report('chomp') do
|
||||
COUNT.times do
|
||||
data.chomp
|
||||
end
|
||||
end
|
||||
bench.report('chop') do
|
||||
COUNT.times do
|
||||
data.chop
|
||||
end
|
||||
end
|
||||
bench.report('strip') do
|
||||
COUNT.times do
|
||||
data.strip
|
||||
end
|
||||
end
|
||||
bench.report('index') do
|
||||
COUNT.times do
|
||||
data[0..-3]
|
||||
end
|
||||
end
|
||||
end
|
|
@ -49,7 +49,7 @@ module Fog
|
|||
response = AWS::Response.new
|
||||
response.status = @connection.readline[9..11].to_i
|
||||
while true
|
||||
data = @connection.readline[0..-3]
|
||||
data = @connection.readline.chomp!
|
||||
if data == ""
|
||||
break
|
||||
end
|
||||
|
|
|
@ -213,38 +213,6 @@ module Fog
|
|||
url
|
||||
end
|
||||
|
||||
def canonicalize_amz_headers(headers)
|
||||
amz_headers, canonical_amz_headers = {}, ''
|
||||
for key, value in amz_headers
|
||||
if key[0..5] == 'x-amz-'
|
||||
amz_headers[key] = value
|
||||
end
|
||||
end
|
||||
amz_headers = amz_headers.sort {|x, y| x[0] <=> y[0]}
|
||||
for pair in amz_headers
|
||||
canonical_amz_headers << "#{pair[0]}: #{pair[1]}\r\n"
|
||||
end
|
||||
if canonical_amz_headers.empty?
|
||||
nil
|
||||
else
|
||||
canonical_amz_headers.chomp!
|
||||
end
|
||||
end
|
||||
|
||||
def canonicalize_resource(uri)
|
||||
resource = "/"
|
||||
# [0..-18] is anything prior to .s3.amazonaws.com
|
||||
subdomain = uri.host[0..-18]
|
||||
unless subdomain.empty?
|
||||
resource << "#{subdomain}/"
|
||||
end
|
||||
resource << "#{uri.path[1..-1]}"
|
||||
# resource << "?acl" if uri.to_s.include?('?acl')
|
||||
# resource << "?location" if uri.to_s.include?('?location')
|
||||
# resource << "?torrent" if uri.to_s.include?('?torrent')
|
||||
resource
|
||||
end
|
||||
|
||||
def parse_file(file)
|
||||
metadata = {
|
||||
:body => nil,
|
||||
|
@ -262,26 +230,49 @@ module Fog
|
|||
metadata
|
||||
end
|
||||
|
||||
def request(params)
|
||||
def sign(params)
|
||||
uri = URI.parse(params[:url])
|
||||
params[:headers]['Date'] = Time.now.utc.strftime("%a, %d %b %Y %H:%M:%S +0000")
|
||||
params_to_sign = [
|
||||
params[:method],
|
||||
content_md5 = params[:headers]['Content-MD5'] || '',
|
||||
content_type = params[:headers]['Content-Type'] || '',
|
||||
params[:headers]['Date'],
|
||||
canonicalized_amz_headers = canonicalize_amz_headers(params[:headers]),
|
||||
canonicalized_resource = canonicalize_resource(uri)
|
||||
]
|
||||
string_to_sign = ''
|
||||
for value in params_to_sign
|
||||
unless value.nil?
|
||||
string_to_sign << "#{value}\n"
|
||||
|
||||
string_to_sign = "#{params[:method]}\n"
|
||||
string_to_sign << "#{params[:headers]['Content-MD5'] || ''}\n"
|
||||
string_to_sign << "#{params[:headers]['Content-Type'] || ''}\n"
|
||||
string_to_sign << "#{params[:headers]['Date']}\n"
|
||||
|
||||
amz_headers, canonical_amz_headers = {}, ''
|
||||
for key, value in amz_headers
|
||||
if key[0..5] == 'x-amz-'
|
||||
amz_headers[key] = value
|
||||
end
|
||||
end
|
||||
hmac = @hmac.update(string_to_sign.chomp!)
|
||||
signature = Base64.encode64(hmac.digest).strip!
|
||||
amz_headers = amz_headers.sort {|x, y| x[0] <=> y[0]}
|
||||
for pair in amz_headers
|
||||
canonical_amz_headers << "#{pair[0]}: #{pair[1]}\r\n"
|
||||
end
|
||||
unless canonical_amz_headers.empty?
|
||||
string_to_sign << "#{canonical_amz_headers}\n"
|
||||
end
|
||||
|
||||
canonical_resource = "/"
|
||||
# [0..-18] is anything prior to .s3.amazonaws.com
|
||||
subdomain = uri.host[0..-18]
|
||||
unless subdomain.empty?
|
||||
canonical_resource << "#{subdomain}/"
|
||||
end
|
||||
canonical_resource << "#{uri.path[1..-1]}"
|
||||
# canonical_resource << "?acl" if uri.to_s.include?('?acl')
|
||||
# canonical_resource << "?location" if uri.to_s.include?('?location')
|
||||
# canonical_resource << "?torrent" if uri.to_s.include?('?torrent')
|
||||
string_to_sign << "#{canonical_resource}"
|
||||
|
||||
hmac = @hmac.update(string_to_sign)
|
||||
signature = Base64.encode64(hmac.digest).chomp!
|
||||
params[:headers]['Authorization'] = "AWS #{@aws_access_key_id}:#{signature}"
|
||||
params
|
||||
end
|
||||
|
||||
def request(params)
|
||||
params = sign(params)
|
||||
|
||||
response = @connection.request({
|
||||
:body => params[:body],
|
||||
|
|
|
@ -298,7 +298,7 @@ module Fog
|
|||
method = 'GET'
|
||||
string_to_sign = "#{method}\n#{@host}\n/\n" << query.chop
|
||||
hmac = @hmac.update(string_to_sign)
|
||||
query << "Signature=#{CGI.escape(Base64.encode64(hmac.digest).strip).gsub(/\+/, '%20')}"
|
||||
query << "Signature=#{CGI.escape(Base64.encode64(hmac.digest).chomp!).gsub(/\+/, '%20')}"
|
||||
|
||||
response = @connection.request({
|
||||
:method => method,
|
||||
|
|
Loading…
Add table
Reference in a new issue