public
Rubygem
Description: Makes http fun! Also, makes consuming restful web services dead easy.
Homepage:
Clone URL: git://github.com/jnunemaker/httparty.git
Click here to lend your support to: httparty and make a donation at www.pledgie.com !
First pass of refactoring the actual performing of the request into smaller 
methods.
jnunemaker (author)
Tue Nov 11 16:25:48 -0800 2008
commit  b6340ed9d853d602fad27d0118cd61233d3ca563
tree    521d456f5b22c592515d948fbd0e3366a0a361cf
parent  67cb57256ff8ee1d3703fbe9fb8b8a1adf39a473
...
74
75
76
77
 
78
79
80
81
82
 
83
84
85
86
87
 
88
89
90
91
92
93
94
95
 
96
97
98
...
74
75
76
 
77
78
79
80
81
 
82
83
84
85
86
 
87
88
89
90
91
92
 
93
 
94
95
96
97
0
@@ -74,25 +74,24 @@ module HTTParty
0
       perform_request Net::HTTP::Get, path, options
0
     end
0
 
0
-    # TODO: spec out this    
0
+    # TODO: spec out this
0
     def post(path, options={})
0
       perform_request Net::HTTP::Post, path, options
0
     end
0
 
0
-    # TODO: spec out this    
0
+    # TODO: spec out this
0
     def put(path, options={})
0
       perform_request Net::HTTP::Put, path, options
0
     end
0
 
0
-    # TODO: spec out this    
0
+    # TODO: spec out this
0
     def delete(path, options={})
0
       perform_request Net::HTTP::Delete, path, options
0
     end
0
 
0
     private
0
-
0
       def perform_request(http_method, path, options)
0
-        Request.perform_request(http_method, path, default_options.merge(options))
0
+        Request.new(http_method, path, default_options.merge(options)).perform
0
       end
0
     
0
       # Makes it so uri is sure to parse stuff like google.com with the http
...
2
3
4
5
6
7
8
9
10
11
...
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
...
79
80
81
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
82
83
84
...
96
97
98
 
 
 
 
 
 
 
99
100
...
2
3
4
 
 
 
 
5
6
7
...
16
17
18
 
 
 
 
 
 
 
 
 
 
 
 
 
 
19
20
21
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
22
23
24
25
26
27
28
29
30
31
 
32
33
34
...
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
...
93
94
95
96
97
98
99
100
101
102
103
104
0
@@ -2,10 +2,6 @@ module HTTParty
0
   class Request
0
     SupportedHTTPMethods = [Net::HTTP::Get, Net::HTTP::Post, Net::HTTP::Put, Net::HTTP::Delete]
0
 
0
-    def self.perform_request(http_method, path, options={})
0
-      new(http_method, path, options).perform
0
-    end
0
-
0
     attr_accessor :http_method, :path, :options
0
     
0
     def initialize(http_method, path, options={})
0
@@ -20,58 +16,19 @@ module HTTParty
0
     def path=(uri)
0
       @path = URI.parse(uri)
0
     end
0
-
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
-    def perform #: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)
0
-      
0
+    
0
+    def uri
0
       uri = path.relative? ? URI.parse("#{options[:base_uri]}#{path}") : path
0
-      
0
-      query_string_parts = []
0
-      query_string_parts << uri.query unless uri.query.blank?
0
-      
0
-      if options[:query].is_a?(Hash)
0
-        query_string_parts << options[:default_params].merge(options[:query]).to_query
0
-      else
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
-      end
0
-      
0
-      uri.query = query_string_parts.join('&') if query_string_parts.size > 0
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
-      
0
-      options[:format] ||= format_from_mimetype(response['content-type'])
0
-      
0
-      case response
0
-      when Net::HTTPSuccess
0
-        parse_response(response.body)
0
-      when Net::HTTPRedirection
0
-        options[:limit] -= 1
0
-        self.path = response['location']
0
-        perform
0
-      else
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
-      end
0
+      uri.query = query_string(uri)
0
+      uri
0
+    end
0
+    
0
+    def perform
0
+      validate!
0
+      handle_response!(get_response(uri))
0
     end
0
 
0
     private
0
-
0
       def http(uri) #:nodoc:
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
         http
0
       end
0
       
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
+        response
0
+      end
0
+      
0
+      def query_string(uri) #:nodoc:
0
+        query_string_parts = []
0
+        query_string_parts << uri.query unless uri.query.blank?
0
+
0
+        if options[:query].is_a?(Hash)
0
+          query_string_parts << options[:default_params].merge(options[:query]).to_query
0
+        else
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
+        end
0
+        
0
+        query_string_parts.size > 0 ? query_string_parts.join('&') : nil
0
+      end
0
+      
0
+      # Raises exception Net::XXX (http error code) if an http error occured
0
+      def handle_response!(response) #:nodoc:
0
+        case response
0
+        when Net::HTTPSuccess
0
+          parse_response(response.body)
0
+        when Net::HTTPRedirection
0
+          options[:limit] -= 1
0
+          self.path = response['location']
0
+          perform
0
+        else
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
+        end
0
+      end
0
+      
0
       def parse_response(body) #:nodoc:
0
         return nil if body.nil? or body.empty?
0
         case options[:format]
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
       end
0
+      
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)
0
+      end
0
   end
0
 end

Comments