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

View File

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

View File

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