0
@@ -8,18 +8,23 @@ require 'active_support'
0
directory = File.dirname(__FILE__)
0
$:.unshift(directory) unless $:.include?(directory) || $:.include?(File.expand_path(directory))
0
+require 'httparty/request'
0
class UnsupportedFormat < StandardError; end
0
class RedirectionTooDeep < StandardError; end
0
+ AllowedFormats = {:xml => 'text/xml', :json => 'application/json'}
0
def self.included(base)
0
base.extend ClassMethods
0
- AllowedFormats = {:xml => 'text/xml', :json => 'application/json'}
0
- SupportedHTTPMethods = [Net::HTTP::Get, Net::HTTP::Post, Net::HTTP::Put, Net::HTTP::Delete]
0
+ @@default_options ||= {}
0
@@ -28,43 +33,42 @@ module HTTParty
0
# http_proxy http://myProxy, 1080
0
def http_proxy(addr=nil, port = nil)
0
- @http_proxyaddr = addr
0
- @http_proxyport = port
0
+ default_options[:http_proxyaddr] = addr
0
+ default_options[:http_proxyport] = port
0
- def base_uri(base_uri=nil)
0
- return @base_uri unless base_uri
0
- @base_uri = normalize_base_uri(base_uri)
0
+ return default_options[:base_uri] unless uri
0
+ default_options[:base_uri] = normalize_base_uri(uri)
0
# Warning: This is not thread safe most likely and
0
# only works if you use one set of credentials. I
0
# leave it because it is convenient on some occasions.
0
-
@auth = {:username => u, :password => p}
0
+
default_options[:basic_auth] = {:username => u, :password => p}
0
# Updates the default query string parameters
0
# that should be appended to each request.
0
def default_params(h={})
0
raise ArgumentError, 'Default params must be a hash' unless h.is_a?(Hash)
0
- @default_params ||= {}
0
- return @default_params if h.blank?
0
- @default_params.merge!(h)
0
+ default_options[:default_params] ||= {}
0
+ default_options[:default_params].merge!(h)
0
raise ArgumentError, 'Headers must be a hash' unless h.is_a?(Hash)
0
- return @headers if h.blank?
0
+ default_options[:headers] ||= {}
0
+ default_options[:headers].merge!(h)
0
raise UnsupportedFormat, "Must be one of: #{AllowedFormats.keys.join(', ')}" unless AllowedFormats.key?(f)
0
+
default_options[:format] = f
0
def get(path, options={})
0
send_request Net::HTTP::Get, path, options
0
@@ -84,72 +88,11 @@ module HTTParty
0
def delete(path, options={})
0
send_request Net::HTTP::Delete, path, options
0
- def http(uri) #:nodoc:
0
- http = Net::HTTP.new(uri.host, uri.port, @http_proxyaddr, @http_proxyport)
0
- http.use_ssl = (uri.port == 443)
0
- http.verify_mode = OpenSSL::SSL::VERIFY_NONE
0
- # FIXME: this method is doing way to much and needs to be split up
0
- # options can be any or all of:
0
- # query => hash of keys/values or a query string (foo=bar&baz=poo)
0
- # body => hash of keys/values or a query string (foo=bar&baz=poo)
0
- # headers => hash of headers to send request with
0
- # basic_auth => :username and :password to use as basic http authentication (overrides @auth class instance variable)
0
- # Raises exception Net::XXX (http error code) if an http error occured
0
- def send_request(klass, path, options={}) #:nodoc:
0
- options = {:limit => 5}.merge(options)
0
- options[:limit] = 0 if options.delete(:no_follow)
0
- raise HTTParty::RedirectionTooDeep, 'HTTP redirects too deep' if options[:limit].to_i <= 0
0
- raise ArgumentError, 'only get, post, put and delete methods are supported' unless SupportedHTTPMethods.include?(klass)
0
- raise ArgumentError, ':headers must be a hash' if options[:headers] && !options[:headers].is_a?(Hash)
0
- raise ArgumentError, ':basic_auth must be a hash' if options[:basic_auth] && !options[:basic_auth].is_a?(Hash)
0
- path = URI.parse(path)
0
- uri = path.relative? ? URI.parse("#{base_uri}#{path}") : path
0
- existing_query = uri.query ? "#{uri.query}&" : ''
0
- uri.query = if options[:query].blank?
0
- existing_query + default_params.to_query
0
- existing_query + (options[:query].is_a?(Hash) ? default_params.merge(options[:query]).to_query : options[:query])
0
- request = klass.new(uri.request_uri)
0
- request.body = options[:body].is_a?(Hash) ? options[:body].to_query : options[:body] unless options[:body].blank?
0
- basic_auth = options.delete(:basic_auth) || @auth
0
- request.initialize_http_header headers.merge(options[:headers] || {})
0
- request.basic_auth(basic_auth[:username], basic_auth[:password]) if basic_auth
0
- response = http(uri).request(request)
0
- @format ||= format_from_mimetype(response['content-type'])
0
- parse_response(response.body)
0
- when Net::HTTPRedirection
0
- send_request(klass, response['location'], options)
0
- response.instance_eval { class << self; attr_accessor :body_parsed; end }
0
- begin; response.body_parsed = parse_response(response.body); rescue; end
0
- response.error! # raises exception corresponding to http error Net::XXX
0
- def parse_response(body) #:nodoc:
0
- return nil if body.nil? or body.empty?
0
- ActiveSupport::JSON.decode(body)
0
+ def send_request(http_method, path, options)
0
+ Request.send_request(http_method, path, default_options.merge(options))
0
# Makes it so uri is sure to parse stuff like google.com with the http
0
@@ -159,11 +102,5 @@ module HTTParty
0
url.gsub!(/^https?:\/\//i, '')
0
"http#{'s' if use_ssl}://#{url}"
0
- # Uses the HTTP Content-Type header to determine the format of the response
0
- # It compares the MIME type returned to the types stored in the AllowedFormats hash
0
- def format_from_mimetype(mimetype) #:nodoc:
0
- AllowedFormats.each { |k, v| return k if mimetype.include?(v) }