mirror of
https://github.com/github/rails.git
synced 2026-02-01 01:34:57 -05:00
git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@4890 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
94 lines
2.0 KiB
Ruby
94 lines
2.0 KiB
Ruby
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
|