class PactBroker::Client::Hal::HttpClient

Constants

RETRYABLE_ERRORS

Attributes

password[RW]
token[RW]
username[RW]
verbose[RW]

Public Class Methods

new(options) click to toggle source
# File lib/pact_broker/client/hal/http_client.rb, line 14
def initialize options
  @username = options[:username]
  @password = options[:password]
  @verbose = options[:verbose]
  @token = options[:token]
end

Public Instance Methods

build_nested_query(value, prefix = nil) click to toggle source

From Rack lib/rack/utils.rb

# File lib/pact_broker/client/hal/http_client.rb, line 154
def build_nested_query(value, prefix = nil)
  case value
  when Array
    value.map { |v|
      build_nested_query(v, "#{prefix}[]")
    }.join("&")
  when Hash
    value.map { |k, v|
      build_nested_query(v, prefix ? "#{prefix}[#{escape(k)}]" : escape(k))
    }.delete_if(&:empty?).join('&')
  when nil
    prefix
  else
    raise ArgumentError, "value must be a Hash" if prefix.nil?
    "#{prefix}=#{escape(value)}"
  end
end
create_request(uri, http_method, body = nil, headers = {}) click to toggle source
# File lib/pact_broker/client/hal/http_client.rb, line 48
def create_request uri, http_method, body = nil, headers = {}
  request = Net::HTTP.const_get(http_method).new(uri.request_uri)
  request['Content-Type'] ||= "application/json" if ['Post', 'Put'].include?(http_method)
  request['Content-Type'] ||= "application/merge-patch+json" if ['Patch'].include?(http_method)
  request['Accept'] = "application/hal+json"
  request['Accept-Encoding'] = nil if verbose?
  headers.each do | key, value |
    request[key] = value
  end

  request.body = body if body
  request.basic_auth username, password if username
  request['Authorization'] = "Bearer #{token}" if token
  request
end
default_max_tries() click to toggle source
# File lib/pact_broker/client/hal/http_client.rb, line 120
def default_max_tries
  5
end
delete(href, body = nil, headers = {}) click to toggle source
# File lib/pact_broker/client/hal/http_client.rb, line 43
def delete href, body = nil, headers = {}
  uri = URI(href)
  perform_request(create_request(uri, 'Delete', body, headers), uri)
end
disable_ssl_verification?() click to toggle source
# File lib/pact_broker/client/hal/http_client.rb, line 149
def disable_ssl_verification?
  ENV['PACT_DISABLE_SSL_VERIFICATION'] == 'true' || ENV['PACT_BROKER_DISABLE_SSL_VERIFICATION'] == 'true'
end
escape(s) click to toggle source
# File lib/pact_broker/client/hal/http_client.rb, line 172
def escape(s)
  URI.encode_www_form_component(s)
end
get(href, params = {}) click to toggle source
# File lib/pact_broker/client/hal/http_client.rb, line 21
def get href, params = {}, headers = {}
  query = build_nested_query(params)
  uri = URI(href)
  uri.query = query
  perform_request(create_request(uri, 'Get', nil, headers), uri)
end
output_stream() click to toggle source
# File lib/pact_broker/client/hal/http_client.rb, line 128
def output_stream
  AuthorizationHeaderRedactor.new($stdout)
end
patch(href, body = nil, headers = {}) click to toggle source
# File lib/pact_broker/client/hal/http_client.rb, line 38
def patch href, body = nil, headers = {}
  uri = URI(href)
  perform_request(create_request(uri, 'Patch', body, headers), uri)
end
perform_request(request, uri) click to toggle source
# File lib/pact_broker/client/hal/http_client.rb, line 64
def perform_request request, uri
  response = until_truthy_or_max_times(condition: ->(resp) { resp.code.to_i < 500 }) do
    http = Net::HTTP.new(uri.host, uri.port, :ENV)
    http.set_debug_output(output_stream) if verbose?
    http.use_ssl = (uri.scheme == 'https')
    # Need to manually set the ca_file and ca_path for the pact-ruby-standalone.
    # The env vars seem to be picked up automatically in later Ruby versions.
    # See https://github.com/pact-foundation/pact-ruby-standalone/issues/57
    http.ca_file = ENV['SSL_CERT_FILE'] if ENV['SSL_CERT_FILE'] && ENV['SSL_CERT_FILE'] != ''
    http.ca_path = ENV['SSL_CERT_DIR'] if ENV['SSL_CERT_DIR'] && ENV['SSL_CERT_DIR'] != ''

    if x509_certificate?
      http.cert = OpenSSL::X509::Certificate.new(x509_client_cert_file)
      http.key = OpenSSL::PKey::RSA.new(x509_client_key_file)
    end

    if disable_ssl_verification?
      if verbose?
        $stdout.puts("SSL verification is disabled")
      end
      http.verify_mode = OpenSSL::SSL::VERIFY_NONE
    end
    http.start do |http|
      http.request request
    end
  end
  Response.new(response)
end
post(href, body = nil, headers = {}) click to toggle source
# File lib/pact_broker/client/hal/http_client.rb, line 33
def post href, body = nil, headers = {}
  uri = URI(href)
  perform_request(create_request(uri, 'Post', body, headers), uri)
end
put(href, body = nil, headers = {}) click to toggle source
# File lib/pact_broker/client/hal/http_client.rb, line 28
def put href, body = nil, headers = {}
  uri = URI(href)
  perform_request(create_request(uri, 'Put', body, headers), uri)
end
sleep(seconds) click to toggle source
# File lib/pact_broker/client/hal/http_client.rb, line 124
def sleep seconds
  Kernel.sleep seconds
end
until_truthy_or_max_times(options = {}) { || ... } click to toggle source
# File lib/pact_broker/client/hal/http_client.rb, line 93
def until_truthy_or_max_times options = {}
  max_tries = options.fetch(:times, default_max_tries)
  tries = 0
  sleep_interval = options.fetch(:sleep, 5)
  sleep(sleep_interval) if options[:sleep_first]
  while true
    begin
      result = yield
      return result if max_tries < 2
      if options[:condition]
        condition_result = options[:condition].call(result)
        return result if condition_result
      else
        return result if result
      end
      tries += 1
      return result if max_tries == tries
      sleep sleep_interval
    rescue *RETRYABLE_ERRORS => e
      tries += 1
      $stderr.puts "ERROR: Error making request - #{e.class} #{e.message} #{e.backtrace.find{|l| l.include?('pact_broker-client')}}, attempt #{tries} of #{max_tries}"
      raise e if max_tries == tries
      sleep sleep_interval
    end
  end
end
verbose?() click to toggle source
# File lib/pact_broker/client/hal/http_client.rb, line 132
def verbose?
  verbose || ENV["VERBOSE"] == "true"
end
x509_certificate?() click to toggle source
# File lib/pact_broker/client/hal/http_client.rb, line 136
def x509_certificate?
  ENV['X509_CLIENT_CERT_FILE'] && ENV['X509_CLIENT_CERT_FILE'] != '' &&
    ENV['X509_CLIENT_KEY_FILE'] && ENV['X509_CLIENT_KEY_FILE'] != ''
end
x509_client_cert_file() click to toggle source
# File lib/pact_broker/client/hal/http_client.rb, line 141
def x509_client_cert_file
  File.read(ENV['X509_CLIENT_CERT_FILE'])
end
x509_client_key_file() click to toggle source
# File lib/pact_broker/client/hal/http_client.rb, line 145
def x509_client_key_file
  File.read(ENV['X509_CLIENT_KEY_FILE'])
end