lib/gdk/http_helper.rb (62 lines of code) (raw):

# frozen_string_literal: true require 'net/http' module GDK class HTTPHelper attr_reader :last_response_reason HTTP_SUCCESS_CODES = %w[200 301 302].freeze def initialize(uri, read_timeout: 5, open_timeout: 5, cache_response: true) raise 'uri needs to be an instance of URI' unless uri.is_a?(URI) @uri = uri @read_timeout = read_timeout @open_timeout = open_timeout @cache_response = cache_response end def up?(codes_to_consider_up: HTTP_SUCCESS_CODES) get_up?(codes_to_consider_up: codes_to_consider_up) end def head_up?(codes_to_consider_up: HTTP_SUCCESS_CODES) response_to_process = cache_response ? cached_http_head_response : http_head_response return false unless response_to_process codes_to_consider_up.include?(response_to_process.code) end def get_up?(codes_to_consider_up: HTTP_SUCCESS_CODES) response_to_process = cache_response ? cached_http_get_response : http_get_response return false unless response_to_process codes_to_consider_up.include?(response_to_process.code) end private attr_reader :uri, :read_timeout, :open_timeout, :cache_response def cached_http_get_response @cached_http_get_response ||= http_get_response end def cached_http_head_response @cached_http_head_response ||= http_head_response end def http_get_response response { |http| http.get(path) } end def http_head_response response { |http| http.head(path) } end def path @path ||= uri.path.empty? ? '/' : uri.path end def response(&blk) resp = http_client.start(&blk) @last_response_reason = "#{resp.code} #{resp.message}" resp rescue Errno::ECONNREFUSED @last_response_reason = 'Connection refused' false rescue Net::ReadTimeout @last_response_reason = 'Request timed out' false end def http_client Net::HTTP.new(uri.host, uri.port).tap do |client| client.read_timeout = read_timeout client.open_timeout = open_timeout client.use_ssl = uri.scheme == 'https' end end end end