connection.rb 1.7 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 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