0
@@ -2,10 +2,6 @@ module HTTParty
0
SupportedHTTPMethods = [Net::HTTP::Get, Net::HTTP::Post, Net::HTTP::Put, Net::HTTP::Delete]
0
- def self.perform_request(http_method, path, options={})
0
- new(http_method, path, options).perform
0
attr_accessor :http_method, :path, :options
0
def initialize(http_method, path, options={})
0
@@ -20,58 +16,19 @@ module HTTParty
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 basic_auth setting)
0
- # Raises exception Net::XXX (http error code) if an http error occured
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?(http_method)
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
uri = path.relative? ? URI.parse("#{options[:base_uri]}#{path}") : path
0
- query_string_parts = []
0
- query_string_parts << uri.query unless uri.query.blank?
0
- if options[:query].is_a?(Hash)
0
- query_string_parts << options[:default_params].merge(options[:query]).to_query
0
- query_string_parts << options[:default_params].to_query unless options[:default_params].blank?
0
- query_string_parts << options[:query] unless options[:query].blank?
0
- uri.query = query_string_parts.join('&') if query_string_parts.size > 0
0
- request = http_method.new(uri.request_uri)
0
- request.body = options[:body].is_a?(Hash) ? options[:body].to_query : options[:body] unless options[:body].blank?
0
- request.initialize_http_header options[:headers]
0
- request.basic_auth(options[:basic_auth][:username], options[:basic_auth][:password]) if options[:basic_auth]
0
- response = http(uri).request(request)
0
- options[:format] ||= format_from_mimetype(response['content-type'])
0
- parse_response(response.body)
0
- when Net::HTTPRedirection
0
- self.path = response['location']
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
+ uri.query = query_string(uri)
0
+ handle_response!(get_response(uri))
0
http = Net::HTTP.new(uri.host, uri.port, options[:http_proxyaddr], options[:http_proxyport])
0
http.use_ssl = (uri.port == 443)
0
@@ -79,6 +36,46 @@ module HTTParty
0
+ def get_response(uri) #:nodoc:
0
+ request = http_method.new(uri.request_uri)
0
+ request.body = options[:body].is_a?(Hash) ? options[:body].to_query : options[:body] unless options[:body].blank?
0
+ request.initialize_http_header options[:headers]
0
+ request.basic_auth(options[:basic_auth][:username], options[:basic_auth][:password]) if options[:basic_auth]
0
+ response = http(uri).request(request)
0
+ options[:format] ||= format_from_mimetype(response['content-type'])
0
+ def query_string(uri) #:nodoc:
0
+ query_string_parts = []
0
+ query_string_parts << uri.query unless uri.query.blank?
0
+ if options[:query].is_a?(Hash)
0
+ query_string_parts << options[:default_params].merge(options[:query]).to_query
0
+ query_string_parts << options[:default_params].to_query unless options[:default_params].blank?
0
+ query_string_parts << options[:query] unless options[:query].blank?
0
+ query_string_parts.size > 0 ? query_string_parts.join('&') : nil
0
+ # Raises exception Net::XXX (http error code) if an http error occured
0
+ def handle_response!(response) #:nodoc:
0
+ parse_response(response.body)
0
+ when Net::HTTPRedirection
0
+ self.path = response['location']
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
@@ -96,5 +93,12 @@ module HTTParty
0
def format_from_mimetype(mimetype) #:nodoc:
0
AllowedFormats.each { |k, v| return k if mimetype.include?(v) }
0
+ def validate! #:nodoc:
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?(http_method)
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)