Class: Soaspec::RestRequest

Inherits:
Object
  • Object
show all
Defined in:
lib/soaspec/exchange_handlers/request/rest_request.rb

Overview

Models a request made to a REST API

Constant Summary collapse

MAX_SOCKET_RETRIES =

Returns Maximum number of times to retry for a socket error.

Returns:

  • (Integer)

    Maximum number of times to retry for a socket error

3

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(overall, options, rest_handler) ⇒ RestRequest

Returns a new instance of RestRequest.

Parameters:

  • overall (Hash)

    Overall parameters used in Request

  • options (Hash)

    Headers and basic auth options

  • < (< Soaspec::RestHandler] rest_handler RestHandler handling creation of this request)

    Soaspec::RestHandler] rest_handler RestHandler handling creation of this request



72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
# File 'lib/soaspec/exchange_handlers/request/rest_request.rb', line 72

def initialize(overall, options, rest_handler)
  self.socket_tries = 0
  self.rest_handler = rest_handler
  overall_params = interpret_parameters(overall)
  @overall_params = overall_params.dup
  self.method = overall_params.delete(:method)
  self.body = post_data
  overall_params.delete(:body)
  overall_params.delete(:payload)
  self.suburl = overall_params.delete(:suburl)
  self.test_name = overall_params.delete(:name)
  self.other_params = overall_params
  self.basic_auth_user = options[:user]
  self.basic_auth_password = options[:password]
  self.headers = options[:headers] # TODO: Use this in request
end

Instance Attribute Details

#basic_auth_passwordString

Returns Password used in basic auth.

Returns:

  • (String)

    Password used in basic auth



25
26
27
# File 'lib/soaspec/exchange_handlers/request/rest_request.rb', line 25

def basic_auth_password
  @basic_auth_password
end

#basic_auth_userString

Returns User used in basic auth.

Returns:

  • (String)

    User used in basic auth



23
24
25
# File 'lib/soaspec/exchange_handlers/request/rest_request.rb', line 23

def basic_auth_user
  @basic_auth_user
end

#bodyString

This will be the actual payload sent. This could be set in Exchange through the payload explicitly, the ‘body’ param which will convert a Hash to JSON or a template

Examples:

JSON body

{"test":5}

Returns:

  • (String)

    Body of request sent. Payload that will be sent in request



15
16
17
# File 'lib/soaspec/exchange_handlers/request/rest_request.rb', line 15

def body
  @body
end

#body_paramsHash

These can be used to verify components of a request are as expected or other operations that are useful with a Hash

Returns:

  • (Hash)

    Parameters that will be used to form request string



19
20
21
# File 'lib/soaspec/exchange_handlers/request/rest_request.rb', line 19

def body_params
  @body_params
end

#headersHash

Headers. Keys that are ‘symbols` will be converted from `snake_case` to `Word-Word2`

Returns:

  • (Hash)

    Headers sent as part of request



32
33
34
# File 'lib/soaspec/exchange_handlers/request/rest_request.rb', line 32

def headers
  @headers
end

#methodSymbol

Returns REST method used.

Examples:

GET method

:get

Returns:

  • (Symbol)

    REST method used



9
10
11
# File 'lib/soaspec/exchange_handlers/request/rest_request.rb', line 9

def method
  @method
end

#other_paramsHash

Returns Miscellaneous parameters.

Returns:

  • (Hash)

    Miscellaneous parameters



29
30
31
# File 'lib/soaspec/exchange_handlers/request/rest_request.rb', line 29

def other_params
  @other_params
end

#rest_handlerSoaspec::RestHandler

Returns RestHandler used for this request.

Returns:



34
35
36
# File 'lib/soaspec/exchange_handlers/request/rest_request.rb', line 34

def rest_handler
  @rest_handler
end

#socket_triesInteger

Returns Attempts to try socket.

Returns:

  • (Integer)

    Attempts to try socket



38
39
40
# File 'lib/soaspec/exchange_handlers/request/rest_request.rb', line 38

def socket_tries
  @socket_tries
end

#suburlString

Returns Url appended to base_url.

Returns:

  • (String)

    Url appended to base_url



27
28
29
# File 'lib/soaspec/exchange_handlers/request/rest_request.rb', line 27

def suburl
  @suburl
end

#test_nameString

Returns Name given to test to describe it.

Returns:

  • (String)

    Name given to test to describe it



21
22
23
# File 'lib/soaspec/exchange_handlers/request/rest_request.rb', line 21

def test_name
  @test_name
end

Instance Method Details

#[](value) ⇒ Object

Returns Result of retrieving value.

Parameters:

  • value (String, Symbol)

    Message to send to object retrieving a value

Returns:

  • (Object)

    Result of retrieving value



96
97
98
# File 'lib/soaspec/exchange_handlers/request/rest_request.rb', line 96

def [](value)
  send(value)
end

#call(merged_options) ⇒ Object

Use the request parameters to call the REST api



122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
# File 'lib/soaspec/exchange_handlers/request/rest_request.rb', line 122

def call(merged_options)
  rest_handler.exception = nil # Remove any previously stored exception
  Soaspec::SpecLogger.info("request body: #{body}") if body
  merge_headers = (merged_options[:headers] || {}).merge(other_params)
  params = merged_options.merge(method: method, url: full_url,
                                headers: merge_headers)
  params.merge!(payload: body) if body
  RestClient::Request.execute params
rescue RestClient::Exception => e
  rest_handler.exception = e
  raise e unless e.respond_to? :response

  e.response
rescue SocketError => e
  self.socket_tries += 1
  sleep 0.5
  retry unless socket_tries > MAX_SOCKET_RETRIES
  raise e
end

#descriptionString

Returns Description that could be used in filename.

Returns:

  • (String)

    Description that could be used in filename



111
112
113
114
115
116
117
118
119
# File 'lib/soaspec/exchange_handlers/request/rest_request.rb', line 111

def description
  suburl_desc = suburl.is_a?(Array) ? File.join(suburl) : suburl
  query_desc = ''
  query&.each do |key, value|
    query_desc = File.join(query_desc, "#{key}_#{value}")
  end
  components = [method.to_s, suburl_desc, query_desc, 'response']
  File.join(*components.collect!(&:to_s))
end

#flattenArray

Returns Array containing parameters used in making a request.

Returns:

  • (Array)

    Array containing parameters used in making a request



106
107
108
# File 'lib/soaspec/exchange_handlers/request/rest_request.rb', line 106

def flatten
  [method] + [suburl].flatten + query.flatten
end

#full_urlString

Returns Base url plus sub url.

Returns:

  • (String)

    Base url plus sub url



41
42
43
44
45
# File 'lib/soaspec/exchange_handlers/request/rest_request.rb', line 41

def full_url
  url = rest_handler.base_url_value
  url = concat_urls(url, suburl) if suburl
  @full_url = ERB.new(url).result(binding)
end

#interpret_parameters(request_parameters) ⇒ Hash

Interpret REST parameters given provided parameters and adding defaults, making transformations

Parameters:

  • request_parameters (Hash)

    Parameters used in making a request

Returns:

  • (Hash)

    Request parameters merged with default values



52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# File 'lib/soaspec/exchange_handlers/request/rest_request.rb', line 52

def interpret_parameters(request_parameters)
  request_parameters = request_parameters.dup # Must duplicate hash as deletion occurring
  request_parameters[:params] ||= {}
  request_parameters[:method] ||= :post
  suburl = request_parameters[:suburl]
  if suburl
    request_parameters[:suburl] = if suburl.is_a? Array
                                    suburl.collect(&:to_s).join('/')
                                  else
                                    suburl.to_s
                                  end
  end
  # Use q for query parameters. Nested :params is ugly, long and unclear
  request_parameters[:params] = request_parameters.delete(:q) if request_parameters[:q]
  request_parameters
end

#post_dataString, NilClass

Work out data to send based upon payload, template_name, or body

Returns:

  • (String, NilClass)

    Payload to send in REST request. Nil if nothing is to be sent



144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
# File 'lib/soaspec/exchange_handlers/request/rest_request.rb', line 144

def post_data
  option = rest_handler.request_option
  body = if option == :hash && !@overall_params[:payload]
           self.body_params = rest_handler.hash_used_in_request(@overall_params[:body])
           @overall_params[:payload] = JSON.generate(body_params)
         elsif option == :template
           test_values = @overall_params[:body] ? @overall_params[:body].dup : nil
           self.body_params = test_values || @overall_params
           Soaspec::TemplateReader.new.render_body(rest_handler.template_name, body_params)
         else
           @overall_params[:payload]
         end
  return body if body && body != '{}'

  nil
end

#queryHash

Returns Query parameters for a REST Request.

Returns:

  • (Hash)

    Query parameters for a REST Request



90
91
92
# File 'lib/soaspec/exchange_handlers/request/rest_request.rb', line 90

def query
  other_params[:params]
end

#to_sString

Returns Show inspection of all parameters.

Returns:

  • (String)

    Show inspection of all parameters



101
102
103
# File 'lib/soaspec/exchange_handlers/request/rest_request.rb', line 101

def to_s
  inspect
end