mirror of
				https://github.com/fog/fog.git
				synced 2022-11-09 13:51:43 -05:00 
			
		
		
		
	remove most uri.parse calls, explicitly pass host/path
This commit is contained in:
		
							parent
							
								
									fec6fccae0
								
							
						
					
					
						commit
						b7a7f07e6c
					
				
					 4 changed files with 37 additions and 42 deletions
				
			
		| 
						 | 
				
			
			@ -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
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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?
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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?
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue