Project

General

Profile

Download (2.79 KB) Statistics
| Branch: | Tag: | Revision:
module ProxyAPI

class Resource
attr_reader :url

def initialize(args)
raise("Must provide a protocol and host when initialising a smart-proxy connection") unless (url =~ /^http/)

# Each request is limited to 60 seconds
@connect_params = {:timeout => 60, :open_timeout => 10, :headers => { :accept => :json },
:user => args[:user], :password => args[:password]}

# We authenticate only if we are using SSL
if url.match(/^https/i)
cert = Setting[:ssl_certificate]
ca_cert = Setting[:ssl_ca_file]
hostprivkey = Setting[:ssl_priv_key]

@connect_params.merge!(
:ssl_client_cert => OpenSSL::X509::Certificate.new(File.read(cert)),
:ssl_client_key => OpenSSL::PKey::RSA.new(File.read(hostprivkey)),
:ssl_ca_file => ca_cert,
:verify_ssl => OpenSSL::SSL::VERIFY_PEER
) unless Rails.env == "test"
end
end

protected

attr_reader :connect_params

def resource
# Required in order to ability to mock the resource
@resource ||= RestClient::Resource.new(url, connect_params)
end

# Sets the credentials in the connection parameters, creates new resource when called
# Since there is now other way to set the credential
def set_credentials(username, password)
@connect_params[:user] = username
@connect_params[:password] = password
@resource = nil
end

def logger; Rails.logger; end

private
# Decodes the JSON response if no HTTP error has been detected
# If an HTTP error is received then the error message is saves into @error
# Returns: Response, if the operation is GET, or true for POST, PUT and DELETE.
# OR: false if a HTTP error is detected
# TODO: add error message handling
def parse response
if response and response.code >= 200 and response.code < 300
return response.body.present? ? JSON.parse(response.body) : true
else
false
end
rescue => e
logger.warn "Failed to parse response: #{response} -> #{e}"
false
end

# Perform GET operation on the supplied path
def get path = nil, payload = {}
# This ensures that an extra "/" is not generated
if path
resource[URI.escape(path)].get payload
else
resource.get payload
end
end

# Perform POST operation with the supplied payload on the supplied path
def post payload, path = ""
resource[path].post payload
end

# Perform PUT operation with the supplied payload on the supplied path
def put payload, path = ""
resource[path].put payload
end

# Perform DELETE operation on the supplied path
def delete path
resource[path].delete
end
end

end
(7-7/8)