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



19
20
21
22
# File 'lib/puppet/util/http_client.rb', line 19

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

.create_request(uri, parameters) ⇒ Object



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

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



49
50
51
52
53
54
55
56
# File 'lib/puppet/util/http_client.rb', line 49

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



66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
# File 'lib/puppet/util/http_client.rb', line 66

def self.perform_http_request(uri, request)
  http = Net::HTTP.new(uri.host, uri.port)
  if uri.scheme == 'https'
    http.use_ssl = (uri.scheme == 'https')
    http.verify_mode = OpenSSL::SSL::VERIFY_NONE
  end
  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 received: [#{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



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

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)


43
44
45
46
47
# File 'lib/puppet/util/http_client.rb', line 43

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)


58
59
60
61
62
63
64
# File 'lib/puppet/util/http_client.rb', line 58

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