class GdsApi::JsonClient

def do_request(method, url, params = nil, additional_headers = {})

def do_request(method, url, params = nil, additional_headers = {})
  loggable = { request_uri: url, start_time: Time.now.to_f }
  start_logging = loggable.merge(action: 'start')
  logger.debug start_logging.to_json
  method_params = {
    method: method,
    url: url,
  }
  method_params[:payload] = params
  method_params = with_timeout(method_params)
  method_params = with_headers(method_params, self.class.default_request_headers, additional_headers)
  method_params = with_auth_options(method_params)
  if URI.parse(url).is_a? URI::HTTPS
    method_params = with_ssl_options(method_params)
  end
  return ::RestClient::Request.execute(method_params)
rescue Errno::ECONNREFUSED => e
  logger.error loggable.merge(status: 'refused', error_message: e.message, error_class: e.class.name, end_time: Time.now.to_f).to_json
  raise GdsApi::EndpointNotFound.new("Could not connect to #{url}")
rescue RestClient::Exceptions::Timeout => e
  logger.error loggable.merge(status: 'timeout', error_message: e.message, error_class: e.class.name, end_time: Time.now.to_f).to_json
  raise GdsApi::TimedOutException.new
rescue URI::InvalidURIError => e
  logger.error loggable.merge(status: 'invalid_uri', error_message: e.message, error_class: e.class.name, end_time: Time.now.to_f).to_json
  raise GdsApi::InvalidUrl
rescue RestClient::Exception => e
  # Log the error here, since we have access to loggable, but raise the
  # exception up to the calling method to deal with
  loggable.merge!(status: e.http_code, end_time: Time.now.to_f, body: e.http_body)
  logger.warn loggable.to_json
  raise
rescue Errno::ECONNRESET => e
  logger.error loggable.merge(status: 'connection_reset', error_message: e.message, error_class: e.class.name, end_time: Time.now.to_f).to_json
  raise GdsApi::TimedOutException.new
rescue SocketError => e
  logger.error loggable.merge(status: 'socket_error', error_message: e.message, error_class: e.class.name, end_time: Time.now.to_f).to_json
  raise GdsApi::SocketErrorException.new
end