Class: Puppet::Util::HttpClient

Inherits:
Object
  • Object
show all
Defined in:
lib/puppet/util/http_client.rb

Overview

Http client

Constant Summary collapse

FATAL_RESPONSE_CODES =
Set.new(%w(400 401 402 403 405 406 407 409 410 411 412 413 414
415 416 417 422 423 424 426 428 431 501 502 505 507 511)).freeze
VERB_MAP =
{
  get: Net::HTTP::Get,
  post: Net::HTTP::Post,
  put: Net::HTTP::Put,
  delete: Net::HTTP::Delete
}.freeze

Class Method Summary collapse

Class Method Details

.attempt_http_request(uri, parameters) ⇒ Object



17
18
19
20
# File 'lib/puppet/util/http_client.rb', line 17

def self.attempt_http_request(uri, parameters)
  request = create_request(uri, parameters)
  perform_http_request(uri, request)
end

.create_request(uri, parameters) ⇒ Object



22
23
24
25
26
27
28
29
30
# File 'lib/puppet/util/http_client.rb', line 22

def self.create_request(uri, parameters)
  method = resolve_method(parameters)
  uri.query = URI.encode_www_form(parameters[:params]) if parameters.key?(:params)
  request = VERB_MAP[method].new(uri.request_uri)

  prepare_request(request, parameters)
  log_request(uri, request)
  request
end

.log_request(uri, request) ⇒ Object



46
47
48
49
50
51
52
53
# File 'lib/puppet/util/http_client.rb', line 46

def self.log_request(uri, request)
  Puppet.debug('Final request:')
  Puppet.debug("Uri: #{uri}")
  Puppet.debug("Method: #{request.method}")
  Puppet.debug('Headers: ')
  request.each_header { |key, value| Puppet.debug("#{key} = #{value}") }
  Puppet.debug("Body: #{request.body}") unless request.body.nil?
end

.perform_http_request(uri, request) ⇒ Object



63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
# File 'lib/puppet/util/http_client.rb', line 63

def self.perform_http_request(uri, request)
  http = Net::HTTP.new(uri.host, uri.port)
  http.open_timeout = 60 # in seconds
  http.read_timeout = 60 # in seconds

  begin
    response = http.request(request)
  rescue StandardError => e
    Puppet.debug "Request failed: #{e}"
    return nil
  end

  if FATAL_RESPONSE_CODES.include?(response.code)
    err_message = "Unrecoverable response recieved: [#{response.code}]"
    err_message += " with body: [#{response.body}]" unless response.body.nil?
    raise Puppet::Error, err_message
  end

  Puppet.debug('Recieved response:')
  Puppet.debug("Code: #{response.code}")
  Puppet.debug("Body: #{response.body}") unless response.body.nil?

  response
end

.prepare_request(request, parameters) ⇒ Object



32
33
34
35
36
37
38
39
# File 'lib/puppet/util/http_client.rb', line 32

def self.prepare_request(request, parameters)
  request.body = parameters[:body_data] if parameters.key?(:body_data)
  request.set_form_data(parameters[:body_params]) if parameters.key?(:body_params)
  request.content_type = parameters[:content_type] if parameters.key?(:content_type)
  request['Accept'] = parameters[:accept_type] if parameters.key?(:accept_type)

  set_auth(request, parameters) if parameters.key?(:auth)
end

.resolve_method(parameters) ⇒ Object

Raises:

  • (ArgumentError)


41
42
43
44
# File 'lib/puppet/util/http_client.rb', line 41

def self.resolve_method(parameters)
  raise ArgumentError, 'You must pass method in parameters' unless parameters.key?(:method)
  parameters[:method]
end

.set_auth(request, parameters) ⇒ Object

Raises:

  • (ArgumentError)


55
56
57
58
59
60
61
# File 'lib/puppet/util/http_client.rb', line 55

def self.set_auth(request, parameters)
  auth = parameters[:auth]
  raise ArgumentError, 'You must pass user with auth parameter' unless auth.key?(:user)
  raise ArgumentError, 'You must pass password with auth parameter' unless auth.key?(:password)

  request.basic_auth(auth[:user], auth[:password])
end