class SalesforceChunker::Connection

Constants

MAX_TRIES
RESCUED_EXCEPTIONS
SLEEP_DURATION

Public Class Methods

new(username: "", password: "", security_token: "", domain: "login", salesforce_version: "42.0", **options) click to toggle source
# File lib/salesforce_chunker/connection.rb, line 6
def initialize(username: "", password: "", security_token: "", domain: "login", salesforce_version: "42.0", **options)
  @log = options[:logger] || Logger.new(options[:log_output])
  @log.progname = "salesforce_chunker"

  response = HTTParty.post(
    "https://#{domain}.salesforce.com/services/Soap/u/#{salesforce_version}",
    headers: { "SOAPAction": "login", "Content-Type": "text/xml; charset=UTF-8" },
    body: self.class.login_soap_request_body(username, password, security_token)
  ).parsed_response

  result = response["Envelope"]["Body"]["loginResponse"]["result"]

  instance = self.class.get_instance(result["serverUrl"])

  @base_url = "https://#{instance}.salesforce.com/services/async/#{salesforce_version}/"
  @default_headers = {
    "Content-Type": "application/json",
    "X-SFDC-Session": result["sessionId"],
  }
rescue NoMethodError
  raise ConnectionError, response["Envelope"]["Body"]["Fault"]["faultstring"]
end

Private Class Methods

check_response_error(response) click to toggle source
# File lib/salesforce_chunker/connection.rb, line 78
def self.check_response_error(response)
  if response.is_a?(Hash) && response.key?("exceptionCode")
    raise ResponseError, "#{response["exceptionCode"]}: #{response["exceptionMessage"]}"
  else
    response
  end
end
get_instance(server_url) click to toggle source
# File lib/salesforce_chunker/connection.rb, line 74
def self.get_instance(server_url)
  /https:\/\/(.*).salesforce.com/.match(server_url)[1]
end
login_soap_request_body(username, password, security_token) click to toggle source
# File lib/salesforce_chunker/connection.rb, line 58
def self.login_soap_request_body(username, password, security_token)
  "<?xml version=\"1.0\" encoding=\"utf-8\" ?>
  <env:Envelope
          xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"
          xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"
          xmlns:env=\"http://schemas.xmlsoap.org/soap/envelope/\"
          xmlns:urn=\"urn:partner.soap.sforce.com\">
      <env:Body>
          <n1:login xmlns:n1=\"urn:partner.soap.sforce.com\">
              <n1:username>#{username.encode(xml: :text)}</n1:username>
              <n1:password>#{password.encode(xml: :text)}#{security_token.encode(xml: :text)}</n1:password>
          </n1:login>
      </env:Body>
  </env:Envelope>"
end
retry_block(log: Logger.new(nil), tries: MAX_TRIES, sleep_duration: SLEEP_DURATION, rescues: RESCUED_EXCEPTIONS, &block) click to toggle source
# File lib/salesforce_chunker/connection.rb, line 90
def self.retry_block(log: Logger.new(nil), tries: MAX_TRIES, sleep_duration: SLEEP_DURATION, rescues: RESCUED_EXCEPTIONS, &block)
  attempt_number = 1

  begin
    return block.call
  rescue *rescues => e
    log.warn "Retry block attempt #{attempt_number} rescued exception: #{e}"
    if attempt_number >= tries
      log.error "Maximum number of tries (#{tries}) was reached in retry_block. Raising exception."
      raise e
    else
      attempt_number += 1
      sleep sleep_duration
      retry
    end
  end
end

Public Instance Methods

get(url, headers={}) click to toggle source
# File lib/salesforce_chunker/connection.rb, line 49
def get(url, headers={})
  @log.info "GET: #{url}"
  self.class.retry_block(log: @log) do
    HTTParty.get(@base_url + url, headers: @default_headers.merge(headers)).body
  end
end
get_json(url, headers={}) click to toggle source
# File lib/salesforce_chunker/connection.rb, line 41
def get_json(url, headers={})
  @log.info "GET: #{url}"
  response = self.class.retry_block(log: @log) do
    HTTParty.get(@base_url + url, headers: @default_headers.merge(headers))
  end
  self.class.check_response_error(response.parsed_response)
end
post(url, body, headers={}) click to toggle source
# File lib/salesforce_chunker/connection.rb, line 33
def post(url, body, headers={})
  @log.info "POST: #{url}"
  response = self.class.retry_block(log: @log) do
    HTTParty.post(@base_url + url, headers: @default_headers.merge(headers), body: body)
  end
  self.class.check_response_error(response.parsed_response)
end
post_json(url, body, headers={}) click to toggle source
# File lib/salesforce_chunker/connection.rb, line 29
def post_json(url, body, headers={})
  post(url, body.to_json, headers)
end