1
0
Fork 0
mirror of https://github.com/rest-client/rest-client.git synced 2022-11-09 13:49:40 -05:00
rest-client--rest-client/lib/rest_client.rb
2008-03-08 14:34:31 -08:00

74 lines
1.4 KiB
Ruby

require 'uri'
require 'net/http'
require 'rexml/document'
module RestClient
def self.get(url)
do_request :get, url
end
def self.post(url, payload=nil)
do_request :post, url, payload
end
def self.put(url, payload=nil)
do_request :put, url, payload
end
def self.delete(url)
do_request :delete, url
end
####
def self.do_request(method, url, payload=nil)
uri = parse_url(url)
transmit uri, net_http_class(method).new(uri.path, headers), payload
end
def self.net_http_class(method)
Object.module_eval "Net::HTTP::#{method.to_s.capitalize}"
end
def self.parse_url(url)
url = "http://#{url}" unless url.match(/^http/)
URI.parse(url)
end
def self.transmit(uri, req, payload=nil)
Net::HTTP.start(uri.host, uri.port) do |http|
process_result http.request(req, payload)
end
end
class RequestFailed < Exception; end
class Unauthorized < Exception; end
def self.process_result(res)
if %w(200 201 202).include? res.code
res.body
elsif res.code == "401"
raise Unauthorized
else
raise RequestFailed, error_message(res)
end
end
def self.parse_error_xml(body)
xml(body).elements.to_a("//errors/error").map { |a| a.text }.join(" / ")
rescue
"unknown error"
end
def self.error_message(res)
"HTTP code #{res.code}: #{parse_error_xml(res.body)}"
end
def self.headers
{ 'Accept' => 'application/xml' }
end
def self.xml(raw)
REXML::Document.new(raw)
end
end