require 'net/https' require 'date' require 'time' require 'uri' module ActiveResource class ConnectionError < StandardError attr_reader :response def initialize(response, message = nil) @response = response @message = message end def to_s "Failed with #{response.code}" end end class ClientError < ConnectionError end class ServerError < ConnectionError end class ResourceNotFound < ClientError end class Connection attr_accessor :site class << self def requests @@requests ||= [] end def default_header class << self ; attr_reader :default_header end @default_header = { 'Content-Type' => 'application/xml' } end end def initialize(site) @site = site end def get(path) Hash.create_from_xml(request(:get, path).body) end def delete(path) request(:delete, path, self.class.default_header) end def put(path, body = '') request(:put, path, body, self.class.default_header) end def post(path, body = '') request(:post, path, body, self.class.default_header) end private def request(method, *arguments) handle_response(http.send(method, *arguments)) end def handle_response(response) case response.code.to_i when 200...400 response when 404 raise(ResourceNotFound.new(response)) when 400...500 raise(ClientError.new(response)) when 500...600 raise(ServerError.new(response)) else raise(ConnectionError.new(response, "Unknown response code: #{response.code}")) end end def http unless @http @http = Net::HTTP.new(@site.host, @site.port) @http.use_ssl = @site.is_a?(URI::HTTPS) @http.verify_mode = OpenSSL::SSL::VERIFY_NONE if @http.use_ssl end @http end end end