class MSS::Core::RESTRequestBuilder

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

Public Class Methods

new(operation, options = {}) click to toggle source

@api private

# File lib/mss/core/rest_request_builder.rb, line 21
def initialize operation, options = {}

  @http = operation[:http]
  @rules = operation[:inputs]

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

  @serializer =
    case options[:format]
    when :xml
      namespace = options[:xmlnamespace]
      name = operation[:name]
      Options::XMLSerializer.new(namespace, name, operation)
    when :json
      Options::JSONSerializer.new(@rules, @http[:request_payload])
    else
      raise ArgumentError, "unhandled format: #{options[:format]}"
    end

end

Public Instance Methods

populate_request(request, params) click to toggle source

Populates a Http::Request with the following:

* HTTP method
* URI
* headers
* body

@param [Http::Request] request

@param [Hash] params The hash of request options provided

to the client request method.  This will be used to populate
the headers, uri and body.

@raise [ArgumentError] Raises ArgumentError when any of the

request options are invalid (wrong type, missing, unknown, etc).
# File lib/mss/core/rest_request_builder.rb, line 58
def populate_request request, params
  params = @validator.validate!(params)
  populate_method(request)
  populate_uri(request, params)
  populate_headers(request, params)
  populate_body(request, params)
end

Private Instance Methods

extract_headers(params) click to toggle source

@param [Hash] params @return [Hash]

# File lib/mss/core/rest_request_builder.rb, line 115
def extract_headers params
  headers = {}
  (@http[:request_headers] || {}).each_pair do |param,header|
    headers[header] = params[param] if params.key?(param)
  end
  headers
end
extract_uri(params) click to toggle source

@param [Hash] params @return [String]

# File lib/mss/core/rest_request_builder.rb, line 84
def extract_uri params

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

  uri = path.gsub(/:\w+/) do |param_name|
    if param = params.delete(param_name.sub(/^:/, '').to_sym)
      UriEscape.escape(param)
    else
      raise ArgumentError, "missing required option #{param_name}"
    end
  end

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

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

  uri

end
populate_body(request, params) click to toggle source

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

# File lib/mss/core/rest_request_builder.rb, line 125
def populate_body request, params
  if params.empty?
    request.body = nil
  elsif payload = streaming_param # streaming request
    request.body_stream = params[payload]
    request.headers['Content-Length'] = size(params[payload])
  else
    request.body = @serializer.serialize(params)
  end
end
populate_headers(request, params) click to toggle source
# File lib/mss/core/rest_request_builder.rb, line 76
def populate_headers request, params
  extract_headers(params).each_pair do |header_name, header_value|
    request.headers[header_name] = header_value
  end
end
populate_method(request) click to toggle source
# File lib/mss/core/rest_request_builder.rb, line 68
def populate_method request
  request.http_method = @http[:verb]
end
populate_uri(request, params) click to toggle source
# File lib/mss/core/rest_request_builder.rb, line 72
def populate_uri request, params
  request.uri = extract_uri(params)
end
size(payload) click to toggle source
# File lib/mss/core/rest_request_builder.rb, line 136
def size(payload)
  if payload.respond_to?(:path) && payload.path
    File.size(payload.path)
  else
    payload.size
  end
end
streaming_param() click to toggle source
# File lib/mss/core/rest_request_builder.rb, line 144
def streaming_param
  if payload = @http[:request_payload]
    @rules[payload][:type] == :blob ? payload : nil
  end
end