class AWS::Core::RESTRequestBuilder

Given a hash of request options, a REST::RequestHandler can populate a Core::Http::Request object.

Public Class Methods

new(namespace, operation) click to toggle source

@private

# File lib/aws/core/rest_request_builder.rb, line 24
def initialize namespace, operation

  @http = operation[:http]

  @rules = operation[:inputs]

  @validator = Options::Validator.new(@rules)

  @xml_serializer = Options::XMLSerializer.new(
    namespace, operation[:name], @rules)

end

Public Instance Methods

populate_request(request, request_options) click to toggle source

Populates an http request object with params in the uri, headers, and body. @param [Http::Request] request @param [Hash] request_options A hash of options to send with

the request.

@raise [ArgumentError] Raises ArgumentError when any of the

request options are invalid (wrong type, missing, unknown, etc).

@return [Http::Request]

# File lib/aws/core/rest_request_builder.rb, line 45
def populate_request request, request_options

  params = @validator.validate!(request_options)

  request.http_method = @http[:verb]
  request.uri = extract_uri(params)
  extract_headers(params).each_pair do |header_name, header_value|
    request.headers[header_name] = header_value
  end
  request.body = build_body(params)
  request

end

Protected Instance Methods

build_body(params) click to toggle source

@param [Hash] params @return [String,nil]

# File lib/aws/core/rest_request_builder.rb, line 106
def build_body params
  if params.empty?
    nil
  else
    if
      payload = @http[:request_payload] and
      @rules[payload][:type] != :hash
    then
      params[payload]
    else
      @xml_serializer.serialize(params)
    end
  end
end
extract_headers(params) click to toggle source

@param [Hash] params @return [Hash]

# File lib/aws/core/rest_request_builder.rb, line 94
def extract_headers params
  headers = {}
  (@http[:request_headers] || {}).each_pair do |param_name,header_name|
    if param_value = params.delete(param_name)
      headers[header_name] = param_value
    end
  end
  headers
end
extract_uri(params) click to toggle source

@param [Hash] params @return [String]

# File lib/aws/core/rest_request_builder.rb, line 63
def extract_uri params

  path, querystring = @http[:uri].split(%r\?/)

  uri = path.gsub(%r:\w+/) do |param_name|
    unless param = params.delete(param_name[1..-1].to_sym)
      msg = "missing required uri argument :#{param_name[1..-1]}"
      raise ArgumentError, msg
    end
    UriEscape.escape(param)
  end

  querystring_parts = []
  querystring.to_s.split(%r&/).each do |part|
    param_name = part.match(%r:(\w+)/)[1]
    if param = params.delete(param_name.to_sym)
      param = UriEscape.escape(param)
      querystring_parts << part.sub(%r:#{param_name}/, param)
    end
  end

  unless querystring_parts.empty?
    uri << "?#{querystring_parts.join('&')}"
  end

  uri

end