diff options
Diffstat (limited to 'activeresource/lib/active_resource/connection.rb')
-rw-r--r-- | activeresource/lib/active_resource/connection.rb | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/activeresource/lib/active_resource/connection.rb b/activeresource/lib/active_resource/connection.rb new file mode 100644 index 0000000000..7318e7256f --- /dev/null +++ b/activeresource/lib/active_resource/connection.rb @@ -0,0 +1,86 @@ +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 :uri + + class << self + def requests + @@requests ||= [] + 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) + end + + def put(path, body) + request(:put, path, body) + end + + def post(path, body) + request(:post, path, body) + end + + private + def request(method, *arguments) + response = http.send(method, *arguments) + + case response.code.to_i + when 200...300 + 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
\ No newline at end of file |