class RETS::Client

Constants

URL_KEYS

Public Class Methods

login(args) click to toggle source

Attempts to login to a RETS server. @param [Hash] args @option args [String] :url Login URL for the RETS server @option args [String] :username Username to authenticate with @option args [String] :password Password to authenticate with @option args [Symbol, Optional] :auth_mode When set to :basic will automatically use HTTP Basic authentication, skips a discovery request when initially connecting @option args [Hash, Optional] :useragent Only necessary for User Agent authentication

* :name [String, Optional] - Name to set the User-Agent to
* :password [String, Optional] - Password to use for RETS-UA-Authorization

@option args [String, Optional] :rets_version Forces RETS-UA-Authorization on the first request if this and useragent name/password are set. Can be auto detected, but usually lets you bypass 1 - 2 additional authentication requests initially. @option args [Hash, Optional] :http Additional configuration for the HTTP requests

* :verify_mode [Integer, Optional] How to verify the SSL certificate when connecting through HTTPS, either OpenSSL::SSL::VERIFY_PEER or OpenSSL::SSL::VERIFY_NONE, defaults to OpenSSL::SSL::VERIFY_NONE
* :ca_file [String, Optional] Path to the CA certification file in PEM format
* :ca_path [String, Optional] Path to the directory containing CA certifications in PEM format

@raise [ArgumentError] @raise [RETS::APIError] @raise [RETS::HTTPError] @raise [RETS::Unauthorized] @raise [RETS::ResponseError]

@return [RETS::Base::Core]

# File lib/rets/client.rb, line 30
def self.login(args)
  raise ArgumentError, "No URL passed" unless args[:url]

  urls = {:login => URI.parse(args[:url])}
  raise ArgumentError, "Invalid URL passed" unless urls[:login].is_a?(URI::HTTP)

  base_url = urls[:login].to_s
  base_url.gsub!(urls[:login].path, "") if urls[:login].path

  http = RETS::HTTP.new(args)
  http.request(:url => urls[:login], :check_response => true) do |response|
    rets_attr = Nokogiri::XML(response.body).xpath("//RETS")
    if rets_attr.empty?
      raise RETS::ResponseError, "Does not seem to be a RETS server."
    end

    rets_attr.first.content.split("\n").each do |row|
      key, value = row.split("=", 2)
      next unless key and value

      key, value = key.downcase.strip.to_sym, value.strip

      if URL_KEYS[key]
        # In case it's a relative path and doesn't include the domain
        if value =~ /(http|www)/
          urls[key] = URI.parse(value)
        else
          key_url = URI.parse(urls[:login].to_s)
          key_url.path = value
          urls[key] = key_url
        end
      end
    end
  end

  http.login_uri = urls[:login]

  RETS::Base::Core.new(http, urls)
end