Sha256: c05ce50bc87586e1e315dafc0718efb2adadc882fa0eab25bdbe5b870adb351f

Contents?: true

Size: 1.81 KB

Versions: 2

Compression:

Stored size: 1.81 KB

Contents

module CloudQuery
  class Request
    attr_accessor :method, :headers, :scheme, :host, :port, :path, :params, :body

    def initialize(options={})
      @method = options[:method] || 'POST'
      @headers = options[:headers] || {}
      @scheme = options[:scheme] || SCHEME
      @host = options[:host] || HOST
      @port = options[:port] || (@scheme == 'https' ? URI::HTTPS::DEFAULT_PORT : URI::HTTP::DEFAULT_PORT)
      @path = options[:path] || PATH
      @params = options[:params] || {}
      if ['PUT', 'DELETE'].include?(@method)
        @params['_method'] = @method
        @method = 'POST'
      end
      @body = options[:body]
      
      @account = options[:account]
      @secret = options[:secret]
    end

    def request_uri(account=@account, secret=@secret)
      query = query_str(signature_params(account))
      uri = if query.empty?
        @path.dup
      else
        "#{@path}?#{query}"
      end
      uri = append_signature(uri, secret) if secret
      uri
    end

    def url(account=@account, secret=@secret)
      base_uri.merge(request_uri(account, secret)).to_s
    end

    private
    def append_signature(uri, secret)
      sig = Crypto::URLSafeSHA1.sign(secret, uri)
      x_sig = Rack::Utils.build_query("x_sig" => sig)
      "#{uri}&#{x_sig}"
    end

    def signature_params(account=@account)
      return {} unless account
      {
        'x_name' => account,
        'x_time' => Time.now.to_i_milliseconds,
        'x_nonce' => CloudQuery::Crypto::Random.nonce,
        'x_method' => SIGNING_METHOD,
      }
    end

    def query_str(additional_params={})
      Rack::Utils.build_query(@params.dup.merge(additional_params))
    end

    def base_uri
      uri_class = (@scheme == 'https' ? URI::HTTPS : URI::HTTP)
      uri_class.build(:scheme => @scheme, :host => @host, :port => @port)
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
xoopit-cloud_query-0.2.0 lib/cloud_query/request.rb
xoopit-cloud_query-0.2.1 lib/cloud_query/request.rb