class Rets::HttpClient

Attributes

http[R]
logger[R]
login_url[R]
options[R]

Public Class Methods

from_options(options, logger) click to toggle source
# File lib/rets/http_client.rb, line 16
def self.from_options(options, logger)
  if options[:http_proxy]
    http = HTTPClient.new(options.fetch(:http_proxy))

    if options[:proxy_username]
      http.set_proxy_auth(options.fetch(:proxy_username), options.fetch(:proxy_password))
    end
  else
    http = HTTPClient.new
  end

  if options[:receive_timeout]
    http.receive_timeout = options[:receive_timeout]
  end

  if options[:cookie_store]
    ensure_cookie_store_exists! options[:cookie_store]
    http.set_cookie_store(options[:cookie_store])
  end

  http_client = new(http, options, logger, options[:login_url])

  if options[:http_timing_stats_collector]
    http_client = Rets::MeasuringHttpClient.new(http_client, options.fetch(:http_timing_stats_collector), options.fetch(:http_timing_stats_prefix))
  end

  if options[:lock_around_http_requests]
    http_client = Rets::LockingHttpClient.new(http_client, options.fetch(:locker), options.fetch(:lock_name), options.fetch(:lock_options))
  end

  http_client
end
new(http, options, logger, login_url) click to toggle source
# File lib/rets/http_client.rb, line 8
def initialize(http, options, logger, login_url)
  @http = http
  @options = options
  @logger = logger
  @login_url = login_url
  @options.fetch(:ca_certs, []).each {|c| @http.ssl_config.add_trust_ca(c) }
end

Public Instance Methods

http_get(url, params=nil, extra_headers={}) click to toggle source
# File lib/rets/http_client.rb, line 55
def http_get(url, params=nil, extra_headers={})
  http.set_auth(url, options[:username], options[:password])
  headers = extra_headers.merge(rets_extra_headers)
  res = nil
  log_http_traffic("GET", url, params, headers) do
    res = http.get(url, params, headers)
  end
  Parser::ErrorChecker.check(res)
  res
end
http_post(url, params, extra_headers = {}) click to toggle source
# File lib/rets/http_client.rb, line 66
def http_post(url, params, extra_headers = {})
  http.set_auth(url, options[:username], options[:password])
  headers = extra_headers.merge(rets_extra_headers)
  res = nil
  log_http_traffic("POST", url, params, headers) do
    res = http.post(url, params, headers)
  end
  Parser::ErrorChecker.check(res)
  res
end
log_http_traffic(method, url, params, headers, &block) click to toggle source
# File lib/rets/http_client.rb, line 77
def log_http_traffic(method, url, params, headers, &block)
  # optimization, we don't want to compute log params
  # if logging is off
  if logger.debug?
    logger.debug "Rets::Client >> #{method} #{url}"
    logger.debug "Rets::Client >> params = #{params.inspect}"
    logger.debug "Rets::Client >> headers = #{headers.inspect}"
  end

  res = block.call

  # optimization, we don't want to compute log params
  # if logging is off, especially when there is a loop just
  # for logging
  if logger.debug?
    logger.debug "Rets::Client << Status #{res.status_code}"
    res.headers.each { |k, v| logger.debug "Rets::Client << #{k}: #{v}" }
  end
end
rets_extra_headers() click to toggle source
# File lib/rets/http_client.rb, line 104
def rets_extra_headers
  user_agent = options[:agent] || "Client/1.0"
  rets_version = options[:version] || "RETS/1.7.2"

  headers = {
    "User-Agent"   => user_agent,
    "RETS-Version" => rets_version
  }

  if options[:ua_password]
    up = Digest::MD5.hexdigest "#{user_agent}:#{options[:ua_password]}"
    session_id = http_cookie('RETS-Session-ID') || ''
    digest = Digest::MD5.hexdigest "#{up}::#{session_id}:#{rets_version}"
    headers.merge!("RETS-UA-Authorization" => "Digest #{digest}")
  end

  headers
end