remove most uri.parse calls, explicitly pass host/path

This commit is contained in:
Wesley Beary 2009-06-24 20:48:51 -07:00
parent fec6fccae0
commit b7a7f07e6c
4 changed files with 37 additions and 42 deletions

View File

@ -27,8 +27,6 @@ Benchmark.bmbm(25) do |bench|
raws.create_bucket('rawsbench') raws.create_bucket('rawsbench')
end end
print '-' * 64 << "\n"
bench.report('fog.put_object') do bench.report('fog.put_object') do
TIMES.times do |x| TIMES.times do |x|
file = File.open(File.dirname(__FILE__) + '/../spec/lorem.txt', 'r') file = File.open(File.dirname(__FILE__) + '/../spec/lorem.txt', 'r')
@ -42,8 +40,6 @@ Benchmark.bmbm(25) do |bench|
end end
end end
print '-' * 64 << "\n"
bench.report('fog.delete_object') do bench.report('fog.delete_object') do
TIMES.times do |x| TIMES.times do |x|
fog.delete_object('fogbench', "lorem_#{x}") fog.delete_object('fogbench', "lorem_#{x}")
@ -55,8 +51,6 @@ Benchmark.bmbm(25) do |bench|
end end
end end
print '-' * 64 << "\n"
bench.report('fog.delete_bucket') do bench.report('fog.delete_bucket') do
fog.delete_bucket('fogbench') fog.delete_bucket('fogbench')
end end

View File

@ -23,20 +23,12 @@ module Fog
end end
def request(params) def request(params)
uri = URI.parse(params[:url]) unless params[:path] && params[:path][0] == '/'
path = "#{uri.path}" params[:path] = '/' << params[:path].to_s
if uri.query
path << "?#{uri.query}"
end end
host = "#{uri.host}" request = "#{params[:method]} #{params[:path]} HTTP/1.1\r\n"
if (uri.scheme == "http" && uri.port != 80) ||
(uri.scheme == 'https' && uri.port != 443)
host << ":#{uri.port}"
end
request = "#{params[:method]} #{path} HTTP/1.1\r\n"
params[:headers] ||= {} params[:headers] ||= {}
params[:headers]['Host'] = uri.host params[:headers]['Host'] = params[:host]
if params[:body] if params[:body]
params[:headers]['Content-Length'] = params[:body].length params[:headers]['Content-Length'] = params[:body].length
end end

View File

@ -4,7 +4,6 @@ require 'cgi'
require 'digest/md5' require 'digest/md5'
require 'hmac-sha1' require 'hmac-sha1'
require 'mime/types' require 'mime/types'
require 'uri'
require File.dirname(__FILE__) + '/s3/parsers' require File.dirname(__FILE__) + '/s3/parsers'
@ -45,7 +44,7 @@ module Fog
:headers => {}, :headers => {},
:method => 'GET', :method => 'GET',
:parser => Fog::Parsers::AWS::S3::GetServiceParser.new, :parser => Fog::Parsers::AWS::S3::GetServiceParser.new,
:url => url :url => @host
}) })
end end
@ -68,9 +67,9 @@ module Fog
request({ request({
:body => data, :body => data,
:headers => {}, :headers => {},
:host => "#{bucket_name}.#{@host}",
:method => 'PUT', :method => 'PUT',
:parser => Fog::Parsers::AWS::S3::BasicParser.new, :parser => Fog::Parsers::AWS::S3::BasicParser.new
:url => url(bucket_name)
}) })
end end
@ -88,9 +87,9 @@ module Fog
request({ request({
:body => data, :body => data,
:headers => {}, :headers => {},
:host => "#{bucket_name}.#{@host}",
:method => 'PUT', :method => 'PUT',
:parser => Fog::Parsers::AWS::S3::BasicParser.new, :parser => Fog::Parsers::AWS::S3::BasicParser.new
:url => url(bucket_name)
}) })
end end
@ -114,9 +113,10 @@ module Fog
query.chop! query.chop!
request({ request({
:headers => {}, :headers => {},
:host => "#{bucket_name}.#{@host}",
:method => 'GET', :method => 'GET',
:parser => Fog::Parsers::AWS::S3::GetBucketParser.new, :parser => Fog::Parsers::AWS::S3::GetBucketParser.new,
:url => url(bucket_name, query) :path => query
}) })
end end
@ -124,9 +124,10 @@ module Fog
def get_request_payment(bucket_name) def get_request_payment(bucket_name)
request({ request({
:headers => {}, :headers => {},
:host => "#{bucket_name}.#{@host}",
:method => 'GET', :method => 'GET',
:parser => Fog::Parsers::AWS::S3::GetRequestPayment.new, :parser => Fog::Parsers::AWS::S3::GetRequestPayment.new,
:url => url(bucket_name, '?requestpayment') :path => '?requestpayment'
}) })
end end
@ -134,9 +135,10 @@ module Fog
def get_location(bucket_name) def get_location(bucket_name)
request({ request({
:headers => {}, :headers => {},
:host => "#{bucket_name}.#{@host}",
:method => 'GET', :method => 'GET',
:parser => Fog::Parsers::AWS::S3::GetRequestPayment.new, :parser => Fog::Parsers::AWS::S3::GetRequestPayment.new,
:url => url(bucket_name, '?location') :path => '?location'
}) })
end end
@ -147,9 +149,9 @@ module Fog
def delete_bucket(bucket_name) def delete_bucket(bucket_name)
request({ request({
:headers => {}, :headers => {},
:host => "#{bucket_name}.#{@host}",
:method => 'DELETE', :method => 'DELETE',
:parser => Fog::Parsers::AWS::S3::BasicParser.new, :parser => Fog::Parsers::AWS::S3::BasicParser.new
:url => url(bucket_name)
}) })
end end
@ -159,9 +161,10 @@ module Fog
request({ request({
:body => file[:body], :body => file[:body],
:headers => options.merge!(file[:headers]), :headers => options.merge!(file[:headers]),
:host => "#{bucket_name}.#{@host}",
:method => 'PUT', :method => 'PUT',
:parser => Fog::Parsers::AWS::S3::BasicParser.new, :parser => Fog::Parsers::AWS::S3::BasicParser.new,
:url => url(bucket_name, object_name) :path => object_name
}) })
end end
@ -169,9 +172,10 @@ module Fog
def copy_object(source_bucket_name, source_object_name, destination_bucket_name, destination_object_name) def copy_object(source_bucket_name, source_object_name, destination_bucket_name, destination_object_name)
request({ request({
:headers => { 'x-amz-copy-source' => "/#{source_bucket_name}/#{source_object_name}" }, :headers => { 'x-amz-copy-source' => "/#{source_bucket_name}/#{source_object_name}" },
:host => "#{destination_bucket_name}.#{@host}",
:method => 'PUT', :method => 'PUT',
:parser => Fog::Parsers::AWS::S3::BasicParser.new, :parser => Fog::Parsers::AWS::S3::BasicParser.new,
:url => url(destination_bucket_name, destination_object_name) :path => destination_object_name
}) })
end end
@ -179,8 +183,9 @@ module Fog
def get_object(bucket_name, object_name) def get_object(bucket_name, object_name)
request({ request({
:headers => {}, :headers => {},
:host => "#{bucket_name}.#{@host}",
:method => 'GET', :method => 'GET',
:url => url(bucket_name, object_name) :path => object_name
}) })
end end
@ -188,9 +193,10 @@ module Fog
def head_object(bucket_name, object_name) def head_object(bucket_name, object_name)
request({ request({
:headers => {}, :headers => {},
:host => "#{bucket_name}.#{@host}",
:method => 'HEAD', :method => 'HEAD',
:parser => Fog::Parsers::AWS::S3::BasicParser.new, :parser => Fog::Parsers::AWS::S3::BasicParser.new,
:url => url(bucket_name, object_name) :path => object_name
}) })
end end
@ -198,9 +204,10 @@ module Fog
def delete_object(bucket_name, object_name) def delete_object(bucket_name, object_name)
request({ request({
:headers => {}, :headers => {},
:host => "#{bucket_name}.#{@host}",
:method => 'DELETE', :method => 'DELETE',
:parser => Fog::Parsers::AWS::S3::BasicParser.new, :parser => Fog::Parsers::AWS::S3::BasicParser.new,
:url => url(bucket_name, object_name) :path => object_name
}) })
end end
@ -231,8 +238,8 @@ module Fog
end end
def sign(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[:headers]['Date'] = Time.now.utc.strftime("%a, %d %b %Y %H:%M:%S +0000")
params[:path] ||= ''
string_to_sign = string_to_sign =
<<-DATA <<-DATA
@ -258,14 +265,14 @@ DATA
canonical_resource = "/" canonical_resource = "/"
# [0..-18] is anything prior to .s3.amazonaws.com # [0..-18] is anything prior to .s3.amazonaws.com
subdomain = uri.host[0..-18] subdomain = params[:host][0..-18]
unless subdomain.empty? unless subdomain.empty?
canonical_resource << "#{subdomain}/" canonical_resource << "#{subdomain}/"
end end
canonical_resource << "#{uri.path[1..-1]}" canonical_resource << "#{params[:path]}"
# canonical_resource << "?acl" if uri.to_s.include?('?acl') # canonical_resource << "?acl" if params[:path].include?('?acl')
# canonical_resource << "?location" if uri.to_s.include?('?location') # canonical_resource << "?location" if params[:path].include?('?location')
# canonical_resource << "?torrent" if uri.to_s.include?('?torrent') # canonical_resource << "?torrent" if params[:path].include?('?torrent')
string_to_sign << "#{canonical_resource}" string_to_sign << "#{canonical_resource}"
hmac = @hmac.update(string_to_sign) hmac = @hmac.update(string_to_sign)
@ -280,8 +287,9 @@ DATA
response = @connection.request({ response = @connection.request({
:body => params[:body], :body => params[:body],
:headers => params[:headers], :headers => params[:headers],
:host => params[:host],
:method => params[:method], :method => params[:method],
:url => params[:url] :path => params[:path]
}) })
if params[:parser] && !response.body.empty? if params[:parser] && !response.body.empty?

View File

@ -301,8 +301,9 @@ module Fog
query << "Signature=#{CGI.escape(Base64.encode64(hmac.digest).chomp!).gsub(/\+/, '%20')}" query << "Signature=#{CGI.escape(Base64.encode64(hmac.digest).chomp!).gsub(/\+/, '%20')}"
response = @connection.request({ response = @connection.request({
:host => @host,
:method => method, :method => method,
:url => "#{@scheme}://#{@host}:#{@port}/#{method == 'GET' ? "?#{query}" : ""}" :path => method == 'GET' ? "?#{query}" : ""
}) })
if parser && !response.body.empty? if parser && !response.body.empty?