Class: Toolbox::Http

Inherits:
Object
  • Object
show all
Defined in:
lib/toolbox/http.rb

Overview

A simple testing client based on the Perl version found in:

https://github.com/gradeawarrior/QA-Perl-Lib/blob/master/QA/Test/WebService.pm

An example usage would be the following:

require 'toolbox/http'

response = Toolbox::Http.request(:method => 'GET', :url => 'http://www.google.com')
if response.code == 200.to_s
  puts "Yay! It worked!"
else
  puts "Boo! Something broke!" unless response.code == 200.to_s
end

Class Method Summary collapse

Class Method Details

.generate_curl_request(uri, request) ⇒ Object

Generate and display curl request

== Parameters uri : The URI you are performing the request on request : The Net::HTTP Request object

== Returns curl_request : String representing the curl request



43
44
45
46
47
48
49
50
51
52
53
54
55
# File 'lib/toolbox/http.rb', line 43

def self.generate_curl_request(uri, request)
  curl_request_str = "curl -v -X #{request.method} \"#{uri.scheme}://#{uri.host}:#{uri.port}#{request.path}\""

  # Generate headers
  request.each_header do |name, value|
    curl_request_str += " -H '#{name}: #{value}'" if (name !~ /user-agent/i && name !~ /accept/i)
  end

  curl_request_str += " -k" if (uri.scheme.to_s == "https")
  curl_request_str += " -d 'YOUR_REQUEST_BODY'" if state.nil? && state.get(:curl_file).nil?
  curl_request_str += " -d @#{state.get(:curl_file)}" if !state.nil? && !state.get(:curl_file).nil?
  curl_request_str
end

.request(*args) ⇒ Object

A simple testing client based on the Perl version found in:

https://github.com/gradeawarrior/QA-Perl-Lib/blob/master/QA/Test/WebService.pm

== Parameters :method => (Required) Sets the request method to perform. The valid methods are GET, POST, PUT, & DELETE :url => (Required) This should be set to the exact service API (e.g. 'http://www.google.com'). Port, path, and query parameters should also be specified. NOTE: If you specified the :request option, then the URI path and query parameters will be configured there. :request => (Optional) Default: nil - You can optionally setup your Net::HTTP::[Get|Post|Put|Delete] operation here. Other request could also be specified here if not supported via :method parameter. :timeout => (Optional) Default: 60 - This is the default request timeout :basic_auth => (Optional) Default: nil - This should be a hash containing 'user' and 'password' keys :headers => (Optional) Default: {} - A Hash containing all the Request headers that need to be set :request_body => (Optional) Default: nil - The request body for PUT and POST requests :content_type => (Optional) Default: nil - Sets the 'Content-Type' header :debug => (Optional) Default: false - Enables debug output :disable_print_body => (Optional) Default: false - This will hide the request/response body output

== Returns

A Net::HTTPResponse object is returned. This is the standard object returned from Net::HTTP

== Throws (Exceptions)

Any of the standard Net::HTTP::Exceptions could be returned if there is an error connecting to the downstream server.

Additionally, The method could return:

  • ArgumentError
  • URI parse error

Raises:

  • (ArgumentError)


144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
# File 'lib/toolbox/http.rb', line 144

def self.request(*args)

  args = args.nil? || args.empty? ? {} : args.pop
  args = {} unless args.is_a?(::Hash)
  raise ArgumentError, 'method is required!' if args[:method].nil? && args[:request].nil?
  raise ArgumentError, 'url is required!' if args[:url].nil?

  ## Options and defaults
  request = args[:request]
  args[:method] = request.method if request
  args[:timeout] = args[:timeout] ? args[:timeout] : 60
  args[:headers] = args[:headers] ? args[:headers] : {}
  args[:headers]['Content-Type'] = args[:content_type] if args[:content_type]
  args[:debug] = args[:debug].nil? ? false : args[:debug].to_bool
  args[:disable_print_body] = args[:disable_print_body].nil? ? false : args[:disable_print_body].to_bool

  puts "Requesting: #{args[:method]} #{uri.to_s}" if args[:debug]

  ## Set the request based on the URL
  if args[:url]
    uri = args[:url].is_a?(::URI) ? args[:url] : URI(args[:url])
    request_path = "#{uri.path}#{uri.query || ''}"
    request_path = request_path.empty? ? '/' : request_path

    if args[:method]
      request = case args[:method]
                  when 'GET'
                    Net::HTTP::Get.new(request_path, args[:headers])
                  when 'POST'
                    req = Net::HTTP::Post.new(request_path, args[:headers])
                    req.body = args[:request_body] if args[:request_body]
                    req
                  when 'PUT'
                    req = Net::HTTP::Put.new(request_path, args[:headers])
                    req.body = args[:request_body] if args[:request_body]
                    req
                  when 'DELETE'
                    Net::HTTP::Delete.new(request_path, args[:headers])
                  else
                    raise ArgumentError, "Invalid method #{args[:method]}!"
                end
    end
  end

  ## Set Auth
  req.basic_auth(args[:basic_auth]['user'], args[:basic_auth]['password']) if args[:basic_auth]

  http = Net::HTTP.new(uri.host, uri.port)
  http.read_timeout = args[:timeout]

  if uri.scheme == 'https'
    raise RuntimeError, 'SSL required but not available!' unless $SSL_AVAILABLE
    http.use_ssl = true
    http.verify_mode = OpenSSL::SSL::VERIFY_NONE
  end

  show_req(uri, request, state) if args[:debug]
  response = http.request(request)
  show_response(response) if args[:debug]
  response

end

.show_req(uri, request, disable_print_body = false) ⇒ Object

Show details about request

== Parameters uri : The URI you are performing the request on request : The Net::HTTP Request object disable_print_body : Disables printing body



65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
# File 'lib/toolbox/http.rb', line 65

def self.show_req(uri, request, disable_print_body=false)

  ## Print verbose output from RESTest
  puts "$ #{generate_curl_request(uri, request)}"
  puts '---[ Request ]----------------------------------------------------'
  puts "URI: #{uri.scheme}://#{uri.host}:#{uri.port}"
  puts "#{request.method} #{request.path}"

  request.each_header { |name, value| puts "#{name}: #{value}" }
  if disable_print_body
    puts "\n<!-- Disabled print body for Content-Type: #{request.content_type}-->\n"
  else
    puts "\n#{request.body}\n"
  end
  puts '------------------------------------------------------------------'

end

.show_response(response, disable_print_body = false) ⇒ Object

Show details about response received

== Parameters response : The Net::HTTPResponse object disable_print_body : Disables printing body



90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
# File 'lib/toolbox/http.rb', line 90

def self.show_response(response, disable_print_body=false)

  puts '---[ Response ]---------------------------------------------------'
  if response
    puts "#{response.code} #{response.message}"
    if (response.code.to_i > 0)
      response.each_header { |name, value| puts "#{name}: #{value}" }
    end
    if disable_print_body
      puts "\n<!-- Disabled print body for Content-Type: #{request.content_type}-->\n"
    else
      puts "\n#{response.body}\n"
    end
  else
    puts 'response object is nil!'
  end
  puts '------------------------------------------------------------------'

end