class RoyalMailApi::RequestHandler

Public Class Methods

request(request, attrs={}) click to toggle source
# File lib/royal_mail_api/request_handler.rb, line 4
def request(request, attrs={})
  begin
    xml = build_xml(attrs)
    config.logger.info("CREATE SHIPMENT REQUEST: #{xml}")
    savon.call(request, xml: xml)
  rescue Savon::SOAPFault => e
    config.logger.error("CREATE SHIPMENT ERROR #{e.http.code}")
    config.logger.error("ERROR XML: #{e.xml}")
    raise RoyalMailApi::SoapError.new({
      xml: e.xml,
      error_code: e.http.code
    })
  end
end

Private Class Methods

build_xml(attrs={}) click to toggle source
# File lib/royal_mail_api/request_handler.rb, line 21
def build_xml(attrs={})
  XmlBuilder.new(:create_shipment, attrs.merge(security_attrs)).build
end
config() click to toggle source
# File lib/royal_mail_api/request_handler.rb, line 59
def config
  Client.config
end
savon() click to toggle source
# File lib/royal_mail_api/request_handler.rb, line 45
def savon
  Savon.client(
    adapter: config.adapter,
    wsdl: config.wsdl,
    endpoint: config.endpoint,
    namespace: config.endpoint,
    ssl_ca_cert_file: config.ssl_ca_cert_file,
    ssl_cert_file: config.ssl_cert_file,
    ssl_cert_key_file: config.ssl_cert_key_file,
    open_timeout: 600,
    read_timeout: 600
  )
end
security_attrs() click to toggle source
# File lib/royal_mail_api/request_handler.rb, line 25
def security_attrs
  # TODO move into own value object

  password = config.password
  creation_date =  Time.now.utc.strftime('%Y-%m-%dT%H:%M:%S')
  nonce =  rand(999999).to_s

  hashedpassword = Digest::SHA1.base64digest(password)

  {
    username: config.username,
    application_id: config.application_id,
    creation_date: creation_date,
    encoded_nonce: Base64.encode64(nonce),
    password_digest: Digest::SHA1.base64digest(
      nonce + creation_date + hashedpassword
    )
  }
end