simplehttp 0.1.1 → 0.1.3

Sign up to get free protection for your applications and to get access to all the features.
data/AUTHORS CHANGED
@@ -1,2 +1,3 @@
1
1
  Tim Becker (tim@kuriositaet.de)
2
2
  Minero Aoki (setup.rb)
3
+ Clint Pachl <pachl@ecentryx.com>
data/CHANGELOG CHANGED
@@ -1,3 +1,7 @@
1
+ = Wed Sep 26 16:25:55 2007
2
+ implemented +head+, +options+ and +trace+,
3
+ made filenames easier. 'simple_http' -> 'simplehttp'
4
+
1
5
  = Fri Feb 9 12:23:20 CET 2007
2
6
  * easier access to response headers
3
7
  * pass through headers during redirects
data/README CHANGED
@@ -7,7 +7,7 @@ INSTALLATION
7
7
 
8
8
  * Using +gem+
9
9
 
10
- gem install simple_http
10
+ gem install simplehttp
11
11
 
12
12
  * Using +setup.rb+
13
13
 
@@ -23,7 +23,7 @@ FEATURES / USAGE
23
23
 
24
24
  * Require the lib:
25
25
 
26
- require 'simple_http'
26
+ require 'simplehttp'
27
27
 
28
28
  * No fuss one line GET and POST requests:
29
29
 
data/TODO CHANGED
@@ -1,3 +1,5 @@
1
+ * Provide tests and documentation for +head+, +options+ and +trace+
2
+
1
3
  * There seems to be a bug in webrick that it doesn't recognize the
2
4
  Content-Length header if using basic authentication. The POST test
3
5
  cases lead to a:
@@ -1,372 +1,7 @@
1
- require 'net/http'
2
- require 'net/https'
3
- require 'uri'
4
- require 'cgi'
5
- require 'base64'
6
-
7
-
8
- # Wrapper around ruby's standard net/http classes. Currently, only GET
9
- # and POST https methods are supported. `SimpleHttp` provides class
10
- # methods `get` and `post` to handle basic functionality. In case more
11
- # complicated requests need to be made or default settings need to be
12
- # overriden, it's possible to instantiate `SimpleHttp` and use instance
13
- # methods `get` and `put`.
14
- #
15
- #
16
- # Features:
17
- #
18
- # * Handles Redirects automatically
19
- # * Proxy used transparently if http_proxy environment variable is
20
- # set.
21
- # * SSL handled automatically
22
- # * fault tolerant uri, e.g. all of these would work:
23
- # "www.example.com", "www.example.com/", "http://www.example.com"
24
- #
25
- # Some usage examples:
26
- # # plain GET (using class methods)
27
- # SimpleHttp.get "www.example.com"
28
- #
29
- # # POST using the instance methods
30
- # uri = URI.parse "https://www.example.com/index.html"
31
- # sh = SimpleHttp uri
32
- # sh.set_proxy "my.proxy", "8080"
33
- # sh.post {"query" => "query_data"}
34
- #
35
- # # POST using class methods.
36
- # binaryData = getImage
37
- # SimpleData.post binaryData, "image/png"
38
- #
39
- # # GET requst with a custom request_header
40
- # sh = SimpleHttp.new "http://www.example.com"
41
- # sh.request_headers= {'X-Special-Http-Header'=>'my-value'}
42
- # sh.get
43
- class SimpleHttp
44
-
45
- VERSION='0.1.1'
46
-
47
- attr_accessor :proxy_host, :proxy_port, :proxy_user, :proxy_pwd, :uri, :request_headers, :response_headers, :response_handlers, :follow_num_redirects
48
-
49
- RESPONSE_HANDLERS = {
50
- Net::HTTPResponse => lambda { |request, response, http|
51
- response.each_header {|key, value|
52
- http.response_headers[key]=value
53
- }
54
- raise response.to_s
55
- },
56
- Net::HTTPSuccess => lambda { |request, response, http|
57
- response.each_header {|key, value|
58
- http.response_headers[key]=value
59
- }
60
- return response.body
61
- },
62
- Net::HTTPRedirection => lambda { |request, response, http|
63
- raise "too many redirects!" unless http.follow_num_redirects > 0
64
-
65
- # create a new SimpleHttp for the location
66
- # refered to decreasing the remaining redirects
67
- # by one.
68
- sh = SimpleHttp.new response['location']
69
- sh.follow_num_redirects = http.follow_num_redirects-1
70
-
71
- # copy the response handlers used in the current
72
- # request in case they were non standard.
73
- sh.response_handlers = http.response_handlers
74
-
75
- # copy the request headers
76
- sh.request_headers=http.request_headers
77
- sh.response_headers=http.response_headers
78
-
79
- # http doesn't permit redirects for methods
80
- # other than GET of HEAD, so we complain in case
81
- # we get them in response to a POST request. (Or
82
- # anything other than GET, for that matter.)
83
-
84
- if request.class == Net::HTTP::Get
85
- return sh.get
86
- else
87
- raise "Not a valid HTTP method for redirection: #{request.class}"
88
-
89
- end
90
- }
91
-
92
- }
93
-
94
- # SimpleHttp can either be used directly through the +get+ and
95
- # +post+ class methods or be instantiated, in case you need to
96
- # to add custom behaviour to the requests.
97
- #
98
- # @param may be a URI or a String.
99
- #
100
- # Example:
101
- # http = SimpleHttp.new(URI.parse("http://www.example.com"))
102
- # http = SimpleHttp.new "www.example.com"
103
- # http = SimpleHttp.new "http://usr:pwd@www.example.com:1234"
104
- def initialize uri
105
- set_proxy ENV['http_proxy'] if ENV['http_proxy']
106
-
107
- if uri.class == String
108
-
109
- unless uri =~ /^https?:\/\//
110
- uri = "http://#{uri}"
111
- end
112
-
113
- uri = URI.parse uri
114
-
115
- end
116
- @uri = uri
117
- if !@uri.path || "" == @uri.path.strip
118
- @uri.path="/"
119
- end
120
-
121
-
122
- @request_headers={}
123
- @response_headers={}
124
- @response_handlers=RESPONSE_HANDLERS.clone
125
- @follow_num_redirects=3
126
-
127
- if @uri.user
128
- basic_authentication @uri.user, @uri.password
129
- end
130
-
131
- end
132
-
133
- #
134
- # Provides facilities to perform http basic authentication. You
135
- # don't need to provide +usr+ and +pwd+ if they are already included
136
- # in the uri, i.e. http://user:password@www.example.com/
137
- #
138
-
139
- def basic_authentication usr, pwd
140
- str = Base64.encode64("#{usr}:#{pwd}")
141
- str = "Basic #{str}"
142
- @request_headers["Authorization"]=str
143
- end
144
-
145
- #
146
- # this method can be used to register response handlers for specific
147
- # http responses in case you need to override the default behaviour.
148
- # Defaults are:
149
- #
150
- # HTTPSuccess : return the body of the response
151
- # HTTPRedirection : follow the redirection until success
152
- # Others : raise an exception
153
- #
154
- # `clazz` is the subclass of HTTPResponse (or HTTPResponse in case you
155
- # want to define "default" behaviour) that you are registering the
156
- # handler for.
157
- #
158
- # `block` is the handler itself, if a response of the appropriate class
159
- # is received, `block` is called with three parameters: the the
160
- # Net::HTTPRequest, the actual HTTPResponse object that was received
161
- # and a reference to the instance of `SimpleHttp` that is executing the
162
- # call.
163
- #
164
- # example:
165
- #
166
- # # to override the default action of following a HTTP
167
- # # redirect, you could register the folllowing handler:
168
- #
169
- # sh = SimpleHttp "www.example.com"
170
- # sh.register_response_handler Net::HTTPRedirection {|request, response, shttp|
171
- # response['location']
172
- # }
173
- #
174
-
175
- def register_response_handler clazz, &block
176
- c = clazz
177
- while c != Object
178
- # completely unnecessary sanity check to make sure parameter
179
- # `clazz` is in fact a HTTPResponse ...
180
- if c == Net::HTTPResponse
181
- @response_handlers[clazz]=block
182
- return
183
- end
184
- c = c.superclass
185
- end
186
-
187
- raise "Trying to register a response handler for non-response class: #{clazz}"
188
- end
189
-
190
- #
191
- # Set the proxy to use for the http request.
192
- # Note that you don't need to set the proxy in case the
193
- # `http_proxy` environment variable is set. To override
194
- # previous proxy settings and connect directly, call
195
- # `set_proxy nil`
196
- #
197
- # usage:
198
- # http = SimpleHttp.new "www.example.com"
199
- #
200
- # http.set_proxy "http://proxy:8000"
201
- # or:
202
- # http.set_proxy(URI.parse("http://proxy:8000"))
203
- # or:
204
- # http.set_proxy 'proxy', '8000', 'my_user', 'secret'
205
- # or:
206
- # http.set_proxy nil # to override previous proxy
207
- # settings and make the request directly.
208
- #
209
-
210
-
211
- def set_proxy proxy, port=nil, user=nil, pwd=nil
212
-
213
-
214
- if !proxy
215
- @proxy_host=@proxy_port=@proxy_user=@proxy_pwd=nil
216
- return
217
- end
218
-
219
- if proxy.class == String
220
- if !port && !user && !pwd
221
- proxy = URI.parse(proxy)
222
- else
223
- @proxy_host= host
224
- @proxy_port= port
225
- @proxy_user= user
226
- @proxy_pwd = pwd
227
- end
228
- end
229
-
230
- if proxy.class == URI::HTTP
231
- @proxy_host= proxy.host
232
- @proxy_port= proxy.port
233
- @proxy_user= proxy.user
234
- @proxy_pwd = proxy.password
235
- end
236
- end
237
-
238
- # interal
239
- # Takes a HTTPResponse (or subclass) and determines how to
240
- # handle the response. Default behaviour is:
241
- #
242
- # HTTPSuccess : return the body of the response
243
- # HTTPRedirection : follow the redirect until success.
244
- # default : raise the HTTPResponse.
245
- #
246
- # the default behaviour can be overidden by registering a
247
- # response handler using the `register_response_handler` method.
248
- #
249
-
250
- def handle_response http_request, http_response
251
- raise "Not a Net::HTTPResponse" unless http_response.is_a? Net::HTTPResponse
252
-
253
- c = http_response.class
254
- while c!=Object
255
- # the response_handlers hash contains a handler
256
- # for the specific response class.
257
- if @response_handlers[c]
258
- return @response_handlers[c].call(http_request, http_response, self)
259
- end
260
-
261
- c=c.superclass
262
- end
263
-
264
- # if we reached this place, no handler was registered
265
- # for this response. default is to return the response.
266
-
267
- return http_response
268
- end
269
-
270
- # internal
271
- def do_http request
272
- response = nil
273
-
274
- http = Net::HTTP.new(@uri.host, @uri.port, @proxy_host,
275
- @proxy_port, @proxy_user, @proxy_pwd)
276
- http.use_ssl = @uri.scheme == 'https'
277
-
278
- # add custom request headers.
279
-
280
- @request_headers.each {|key,value|
281
- request[key]=value;
282
- }
283
-
284
- handle_response(request, http.request(request));
285
- end
286
-
287
- # internal
288
- def make_query query
289
- return query unless query && query.class == Hash
290
- str = ""
291
- query.collect { |key, value|
292
- str += CGI::escape(key) + "=" + CGI::escape(value)
293
- }
294
- str
295
- end
296
-
297
- # Make a simple GET request to the provided URI.
298
- #
299
- # Example:
300
- # puts(SimpleHttp.get("www.example.com"))
301
- def self.get uri, query=nil
302
- http = SimpleHttp.new uri
303
- http.get query
304
- end
305
-
306
- # Make a POST request to the provided URI.
307
- #
308
- # Example:
309
- # puts(SimpleHttp.post("www.example.com", "query"=>"my_query"))
310
- #
311
- # Alternatively, you can post any sort of data, but will have to
312
- # set the appriate content_type:
313
- #
314
- # SimpleHttp.post("http://www.example.com/", binary_data, "img/png")
315
-
316
- def self.post uri, query=nil, content_type='application/x-www-form-urlencoded'
317
- http = SimpleHttp.new uri
318
- http.post query, content_type
319
- end
320
-
321
- # Call the +get+ method as an instance method if you need to
322
- # modify the default behaviour of the library, or set special
323
- # headers:
324
- #
325
- # http = SimpleHttp.new "www.example.com"
326
- # http.request_headers["X-Special"]="whatever"
327
- # str = http.get
328
- def get query = nil
329
- if (query = make_query query)
330
- @uri.query = @uri.query ? @uri.query+"&"+query : query
331
- end
332
- full_path = @uri.path + (@uri.query ? "?#{@uri.query}" : "")
333
-
334
- req = Net::HTTP::Get.new(full_path)
335
- # puts Net::HTTP::Proxy(@proxy_host, @proxy_port, @proxy_user, @proxy_pwd).get(@uri)
336
- do_http req
337
- end
338
-
339
- #
340
- # Post the query data to the url.
341
- # The body of the request remains empty if query=nil.
342
- # In case `query` is a `Hash`, it's assumed that we are
343
- # sending a form.
344
- # In case `query` is a `String`, it's also assumed that a
345
- # form is being sent, UNLESS the `content_type` parameter
346
- # is set.
347
- #
348
- def post query=nil, content_type='application/x-www-form-urlencoded'
349
- req = Net::HTTP::Post.new(@uri.path)
350
-
351
- req.body= make_query query if query
352
- req.content_type=content_type if query
353
- req.content_length=query ? req.body.length : 0
354
-
355
- do_http req
356
- end
357
-
358
- end
359
-
360
- #ht = SimpleHttp.new "http://www.google.com/aldfksjaldskjfalskjfdlk"
361
- ##ht.register_response_handler(Net::HTTPRedirection) {|req, res, ht| puts res['location']}
362
- #puts ht.get.class
363
- ##puts(ht.get("q"=>"bla"))
364
- #
365
- ##puts (SimpleHttp.get "http://www.google.com")
366
- #
367
- #['http://www.google.com/', 'www.google.com', 'https://www.google.com'].each {|u|
368
- # SimpleHttp.new u
369
- #}
370
- ##puts ht.post
371
-
372
-
1
+ $:.unshift(File.dirname(__FILE__)) unless
2
+ $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
3
+
4
+
5
+ # kept for backwards compatibility
6
+ #
7
+ require 'simplehttp.rb'
@@ -0,0 +1,450 @@
1
+ $:.unshift(File.dirname(__FILE__)) unless
2
+ $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
3
+
4
+
5
+ require 'net/http'
6
+ require 'net/https'
7
+ require 'uri'
8
+ require 'cgi'
9
+ require 'base64'
10
+
11
+
12
+ # Wrapper around ruby's standard net/http classes. Currently, only GET
13
+ # and POST https methods are supported. `SimpleHttp` provides class
14
+ # methods `get` and `post` to handle basic functionality. In case more
15
+ # complicated requests need to be made or default settings need to be
16
+ # overriden, it's possible to instantiate `SimpleHttp` and use instance
17
+ # methods `get` and `put`.
18
+ #
19
+ #
20
+ # Features:
21
+ #
22
+ # * Handles Redirects automatically
23
+ # * Proxy used transparently if http_proxy environment variable is
24
+ # set.
25
+ # * SSL handled automatically
26
+ # * fault tolerant uri, e.g. all of these would work:
27
+ # "www.example.com", "www.example.com/", "http://www.example.com"
28
+ #
29
+ # Some usage examples:
30
+ # # plain GET (using class methods)
31
+ # SimpleHttp.get "www.example.com"
32
+ #
33
+ # # POST using the instance methods
34
+ # uri = URI.parse "https://www.example.com/index.html"
35
+ # sh = SimpleHttp uri
36
+ # sh.set_proxy "my.proxy", "8080"
37
+ # sh.post {"query" => "query_data"}
38
+ #
39
+ # # POST using class methods.
40
+ # binaryData = getImage
41
+ # SimpleData.post binaryData, "image/png"
42
+ #
43
+ # # GET requst with a custom request_header
44
+ # sh = SimpleHttp.new "http://www.example.com"
45
+ # sh.request_headers= {'X-Special-Http-Header'=>'my-value'}
46
+ # sh.get
47
+ class SimpleHttp
48
+
49
+ VERSION='0.1.3'
50
+
51
+ attr_accessor :proxy_host, :proxy_port, :proxy_user, :proxy_pwd, :uri, :request_headers, :response_headers, :response_handlers, :follow_num_redirects
52
+ RESPONSE_HANDLERS = {
53
+ Net::HTTPResponse => lambda { |request, response, http|
54
+ response.each_header {|key, value|
55
+ http.response_headers[key]=value
56
+ }
57
+ raise "#{response.to_s} : #{response.code} : #{http.uri}"
58
+ },
59
+ Net::HTTPSuccess => lambda { |request, response, http|
60
+ response.each_header {|key, value|
61
+ http.response_headers[key]=value
62
+ }
63
+ #http.cookies += response.cookies
64
+ if request.class == Net::HTTP::Head || request.class == Net::HTTP::Options
65
+ return http.response_headers
66
+ end
67
+ return response.body
68
+ },
69
+ Net::HTTPRedirection => lambda { |request, response, http|
70
+ raise "too many redirects!" unless http.follow_num_redirects > 0
71
+ # create a new SimpleHttp for the location
72
+ # refered to decreasing the remaining redirects
73
+ # by one.
74
+
75
+ if (location = response['location']) !~ /^https?:\/\//
76
+ new_location = "#{http.uri.scheme}://#{http.uri.host}"
77
+ if location =~ /^\//
78
+ new_location += location
79
+ else
80
+ new_location += "/#{http.uri.path}/#{location}"
81
+ end
82
+ location = new_location
83
+ end
84
+
85
+ sh = SimpleHttp.new location
86
+ #STDERR.puts location
87
+ sh.follow_num_redirects = http.follow_num_redirects-1
88
+
89
+ # copy the response handlers used in the current
90
+ # request in case they were non standard.
91
+ sh.response_handlers = http.response_handlers
92
+
93
+ # copy the request headers
94
+ sh.request_headers=http.request_headers
95
+ sh.response_headers=http.response_headers
96
+ #sh.cookies+=http.cookies
97
+
98
+ # copy host and port
99
+ sh.uri.host = http.uri.host
100
+ sh.uri.port = http.uri.port
101
+
102
+ # HTTP doesn't permit redirects for methods other than
103
+ # GET or HEAD. The exception is 303 redirects, which
104
+ # should automatically follow the redirect URI using a
105
+ # GET method regardless of the initial method. For
106
+ # other classes of redirection, the client is required
107
+ # to prompt the user before redirection occurs. Because
108
+ # that's not a feasible action for this library, all
109
+ # 3xx redirect URIs are followed using a GET method.
110
+ #
111
+ # http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
112
+
113
+ case request
114
+ when Net::HTTP::Get,
115
+ Net::HTTP::Head,
116
+ Net::HTTP::Options
117
+
118
+ sh.get
119
+ when Net::HTTP::Post
120
+ sh.request_headers['content-length']=nil
121
+ sh.get
122
+ else
123
+ raise "Not a valid HTTP method for redirection: #{request.class}"
124
+ end
125
+
126
+ }
127
+
128
+ }
129
+
130
+ # SimpleHttp can either be used directly through the +get+ and
131
+ # +post+ class methods or be instantiated, in case you need to
132
+ # to add custom behaviour to the requests.
133
+ #
134
+ # @param may be a URI or a String.
135
+ #
136
+ # Example:
137
+ # http = SimpleHttp.new(URI.parse("http://www.example.com"))
138
+ # http = SimpleHttp.new "www.example.com"
139
+ # http = SimpleHttp.new "http://usr:pwd@www.example.com:1234"
140
+ def initialize uri
141
+ set_proxy ENV['http_proxy'] if ENV['http_proxy']
142
+
143
+ if uri.class == String
144
+
145
+ unless uri =~ /^https?:\/\//
146
+ uri = "http://#{uri}"
147
+ end
148
+
149
+ uri = URI.parse uri
150
+
151
+ end
152
+ @uri = uri
153
+ if !@uri.path || "" == @uri.path.strip
154
+ @uri.path="/"
155
+ end
156
+
157
+
158
+ @request_headers={}
159
+ @response_headers={}
160
+ @cookies=[]
161
+ @response_handlers=RESPONSE_HANDLERS.clone
162
+ @follow_num_redirects=5
163
+
164
+ if @uri.user
165
+ basic_authentication @uri.user, @uri.password
166
+ end
167
+
168
+ end
169
+
170
+ #
171
+ # Provides facilities to perform http basic authentication. You
172
+ # don't need to provide +usr+ and +pwd+ if they are already included
173
+ # in the uri, i.e. http://user:password@www.example.com/
174
+ #
175
+
176
+ def basic_authentication usr, pwd
177
+ str = Base64.encode64("#{usr}:#{pwd}")
178
+ str = "Basic #{str}"
179
+ @request_headers["Authorization"]=str
180
+ end
181
+
182
+ #
183
+ # this method can be used to register response handlers for specific
184
+ # http responses in case you need to override the default behaviour.
185
+ # Defaults are:
186
+ #
187
+ # HTTPSuccess : return the body of the response
188
+ # HTTPRedirection : follow the redirection until success
189
+ # Others : raise an exception
190
+ #
191
+ # `clazz` is the subclass of HTTPResponse (or HTTPResponse in case you
192
+ # want to define "default" behaviour) that you are registering the
193
+ # handler for.
194
+ #
195
+ # `block` is the handler itself, if a response of the appropriate class
196
+ # is received, `block` is called with three parameters: the the
197
+ # Net::HTTPRequest, the actual HTTPResponse object that was received
198
+ # and a reference to the instance of `SimpleHttp` that is executing the
199
+ # call.
200
+ #
201
+ # example:
202
+ #
203
+ # # to override the default action of following a HTTP
204
+ # # redirect, you could register the folllowing handler:
205
+ #
206
+ # sh = SimpleHttp "www.example.com"
207
+ # sh.register_response_handler Net::HTTPRedirection {|request, response, shttp|
208
+ # response['location']
209
+ # }
210
+ #
211
+
212
+ def register_response_handler clazz, &block
213
+ c = clazz
214
+ while c != Object
215
+ # completely unnecessary sanity check to make sure parameter
216
+ # `clazz` is in fact a HTTPResponse ...
217
+ if c == Net::HTTPResponse
218
+ @response_handlers[clazz]=block
219
+ return
220
+ end
221
+ c = c.superclass
222
+ end
223
+
224
+ raise "Trying to register a response handler for non-response class: #{clazz}"
225
+ end
226
+
227
+ #
228
+ # Set the proxy to use for the http request.
229
+ # Note that you don't need to set the proxy in case the
230
+ # `http_proxy` environment variable is set. To override
231
+ # previous proxy settings and connect directly, call
232
+ # `set_proxy nil`
233
+ #
234
+ # usage:
235
+ # http = SimpleHttp.new "www.example.com"
236
+ #
237
+ # http.set_proxy "http://proxy:8000"
238
+ # or:
239
+ # http.set_proxy(URI.parse("http://proxy:8000"))
240
+ # or:
241
+ # http.set_proxy 'proxy', '8000', 'my_user', 'secret'
242
+ # or:
243
+ # http.set_proxy nil # to override previous proxy
244
+ # settings and make the request directly.
245
+ #
246
+
247
+
248
+ def set_proxy proxy, port=nil, user=nil, pwd=nil
249
+
250
+
251
+ if !proxy
252
+ @proxy_host=@proxy_port=@proxy_user=@proxy_pwd=nil
253
+ return
254
+ end
255
+
256
+ if proxy.class == String
257
+ if !port && !user && !pwd
258
+ proxy = URI.parse(proxy)
259
+ else
260
+ @proxy_host= host
261
+ @proxy_port= port
262
+ @proxy_user= user
263
+ @proxy_pwd = pwd
264
+ end
265
+ end
266
+
267
+ if proxy.class == URI::HTTP
268
+ @proxy_host= proxy.host
269
+ @proxy_port= proxy.port
270
+ @proxy_user= proxy.user
271
+ @proxy_pwd = proxy.password
272
+ end
273
+ end
274
+
275
+ # interal
276
+ # Takes a HTTPResponse (or subclass) and determines how to
277
+ # handle the response. Default behaviour is:
278
+ #
279
+ # HTTPSuccess : return the body of the response
280
+ # HTTPRedirection : follow the redirect until success.
281
+ # default : raise the HTTPResponse.
282
+ #
283
+ # the default behaviour can be overidden by registering a
284
+ # response handler using the `register_response_handler` method.
285
+ #
286
+
287
+ def handle_response http_request, http_response
288
+ raise "Not a Net::HTTPResponse" unless http_response.is_a? Net::HTTPResponse
289
+
290
+ c = http_response.class
291
+ while c!=Object
292
+ # the response_handlers hash contains a handler
293
+ # for the specific response class.
294
+ if @response_handlers[c]
295
+ #STDERR.puts "!#{http_response.class}"
296
+ #STDERR.puts "!#{@response_handlers[c]}"
297
+ return @response_handlers[c].call(http_request, http_response, self)
298
+ end
299
+
300
+ c=c.superclass
301
+ end
302
+
303
+ # if we reached this place, no handler was registered
304
+ # for this response. default is to return the response.
305
+
306
+ return http_response
307
+ end
308
+
309
+ # internal
310
+ def do_http request
311
+ response = nil
312
+
313
+ http = Net::HTTP.new(@uri.host, @uri.port, @proxy_host,
314
+ @proxy_port, @proxy_user, @proxy_pwd)
315
+ http.use_ssl = @uri.scheme == 'https'
316
+
317
+ # add custom request headers.
318
+
319
+ @request_headers.each {|key,value|
320
+ request[key]=value;
321
+ }
322
+
323
+ handle_response(request, http.request(request));
324
+ end
325
+
326
+ # internal
327
+ def make_query query
328
+ return query unless query && query.class == Hash
329
+ query.inject([]) do |s, (key, value)|
330
+ s << CGI::escape(key) + "=" + CGI::escape(value)
331
+ end.join('&')
332
+ end
333
+
334
+ # Make a simple GET request to the provided URI.
335
+ #
336
+ # Example:
337
+ # puts(SimpleHttp.get("www.example.com"))
338
+ def self.get uri, query=nil
339
+ http = SimpleHttp.new uri
340
+ http.get query
341
+ end
342
+
343
+ def self.head uri, query=nil
344
+ http = SimpleHttp.new uri
345
+ http.head query
346
+ end
347
+
348
+ def self.options uri
349
+ http = SimpleHttp.new uri
350
+ http.options
351
+ end
352
+
353
+ def self.trace uri
354
+ http = SimpleHttp.new uri
355
+ http.trace
356
+ end
357
+
358
+ # Make a POST request to the provided URI.
359
+ #
360
+ # Example:
361
+ # puts(SimpleHttp.post("www.example.com", "query"=>"my_query"))
362
+ #
363
+ # Alternatively, you can post any sort of data, but will have to
364
+ # set the appriate content_type:
365
+ #
366
+ # SimpleHttp.post("http://www.example.com/", binary_data, "img/png")
367
+
368
+ def self.post uri, query=nil, content_type='application/x-www-form-urlencoded'
369
+ http = SimpleHttp.new uri
370
+ http.post query, content_type
371
+ end
372
+
373
+ # Call the +get+ method as an instance method if you need to
374
+ # modify the default behaviour of the library, or set special
375
+ # headers:
376
+ #
377
+ # http = SimpleHttp.new "www.example.com"
378
+ # http.request_headers["X-Special"]="whatever"
379
+ # str = http.get
380
+ def get query = nil
381
+ if (query = make_query query)
382
+ @uri.query = @uri.query ? @uri.query+"&"+query : query
383
+ end
384
+ full_path = @uri.path + (@uri.query ? "?#{@uri.query}" : "")
385
+
386
+ req = Net::HTTP::Get.new(full_path)
387
+ # puts Net::HTTP::Proxy(@proxy_host, @proxy_port, @proxy_user, @proxy_pwd).get(@uri)
388
+ do_http req
389
+ end
390
+
391
+ # Call the +head+ method as an instance method.
392
+ #
393
+ def head query = nil
394
+ if (query = make_query query)
395
+ @uri.query = @uri.query ? @uri.query+"&"+query : query
396
+ end
397
+ full_path = @uri.path + (@uri.query ? "?#{@uri.query}" : "")
398
+
399
+ req = Net::HTTP::Head.new(full_path)
400
+ # puts Net::HTTP::Proxy(@proxy_host, @proxy_port, @proxy_user, @proxy_pwd).get(@uri)
401
+ do_http req
402
+ end
403
+
404
+ # Call http +options+ method. Returns the response
405
+ def options
406
+ # we don't support sending a payload in options' body.
407
+ req = Net::HTTP::Options.new(@uri.path)
408
+ do_http req
409
+ end
410
+
411
+ def trace
412
+ # payload?
413
+ req = Net::HTTP::Trace.new(@uri.path)
414
+ do_http req
415
+ end
416
+
417
+ #
418
+ # Post the query data to the url.
419
+ # The body of the request remains empty if query=nil.
420
+ # In case `query` is a `Hash`, it's assumed that we are
421
+ # sending a form.
422
+ # In case `query` is a `String`, it's also assumed that a
423
+ # form is being sent, UNLESS the `content_type` parameter
424
+ # is set.
425
+ #
426
+ def post query=nil, content_type='application/x-www-form-urlencoded'
427
+ req = Net::HTTP::Post.new(@uri.path)
428
+
429
+ req.body= make_query query if query
430
+ req.content_type=content_type if query
431
+ req.content_length=query ? req.body.length : 0
432
+
433
+ do_http req
434
+ end
435
+
436
+ end
437
+
438
+ #ht = SimpleHttp.new "http://www.google.com/aldfksjaldskjfalskjfdlk"
439
+ ##ht.register_response_handler(Net::HTTPRedirection) {|req, res, ht| puts res['location']}
440
+ #puts ht.get.class
441
+ ##puts(ht.get("q"=>"bla"))
442
+ #
443
+ ##puts (SimpleHttp.get "http://www.google.com")
444
+ #
445
+ #['http://www.google.com/', 'www.google.com', 'https://www.google.com'].each {|u|
446
+ # SimpleHttp.new u
447
+ #}
448
+ ##puts ht.post
449
+
450
+
@@ -70,6 +70,10 @@ class SimpleHttpTest < Test::Unit::TestCase
70
70
  ret = http.get "query2" => "query_test"
71
71
  assert_equal("query_test", ret, "basic GET (query) 3 test failed.")
72
72
 
73
+ http = SimpleHttp.new(URI.parse("http://127.0.0.1:12345/query_test2?bla=true"))
74
+ ret = http.get "something"=>"or the other", "query2" => "query_test"
75
+ assert_equal("query_test", ret, "basic GET (query) 4 test failed.")
76
+
73
77
  # GET request with a custom request_header
74
78
  http = SimpleHttp.new "http://127.0.0.1:12345/header_test"
75
79
  http.request_headers= {'x-special-http-header'=>'my-value'}
@@ -196,11 +200,11 @@ class SimpleHttpTest < Test::Unit::TestCase
196
200
  ret = http.get
197
201
  }
198
202
 
203
+
199
204
  ret = SimpleHttp.get "http://test:pwd@127.0.0.1:12345/redirect"
200
205
  assert_equal(ret, TestServer::SUCCESS_TEXT_0, "redirect test 2");
201
-
202
-
203
206
  end
207
+
204
208
 
205
209
 
206
210
  end
@@ -1,4 +1,5 @@
1
1
  require 'webrick'
2
+ #require 'constants'
2
3
 
3
4
  include WEBrick
4
5
  class TestServer
metadata CHANGED
@@ -1,35 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
- rubygems_version: 0.9.0
3
- specification_version: 1
4
2
  name: simplehttp
5
3
  version: !ruby/object:Gem::Version
6
- version: 0.1.1
7
- date: 2007-02-09 00:00:00 +01:00
8
- summary: "simple_http: Simple Http client lib."
9
- require_paths:
10
- - lib
11
- email:
12
- homepage:
13
- rubyforge_project:
14
- description: Wrapper around net/http to provide quick and dirty http access.
15
- autorequire:
16
- default_executable:
17
- bindir: bin
18
- has_rdoc: false
19
- required_ruby_version: !ruby/object:Gem::Version::Requirement
20
- requirements:
21
- - - ">"
22
- - !ruby/object:Gem::Version
23
- version: 0.0.0
24
- version:
4
+ version: 0.1.3
25
5
  platform: ruby
26
- signing_key:
27
- cert_chain:
28
- post_install_message:
29
6
  authors: []
30
7
 
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2008-09-21 00:00:00 +02:00
13
+ default_executable:
14
+ dependencies: []
15
+
16
+ description: Wrapper around net/http to provide quick and dirty http access.
17
+ email:
18
+ executables: []
19
+
20
+ extensions: []
21
+
22
+ extra_rdoc_files: []
23
+
31
24
  files:
32
25
  - lib/simple_http.rb
26
+ - lib/simplehttp.rb
33
27
  - AUTHORS
34
28
  - CHANGELOG
35
29
  - LICENSE
@@ -38,17 +32,31 @@ files:
38
32
  - TODO
39
33
  - test/http_test.rb
40
34
  - test/http_test_server.rb
41
- test_files: []
42
-
35
+ has_rdoc: false
36
+ homepage:
37
+ post_install_message:
43
38
  rdoc_options: []
44
39
 
45
- extra_rdoc_files: []
46
-
47
- executables: []
48
-
49
- extensions: []
50
-
40
+ require_paths:
41
+ - lib
42
+ required_ruby_version: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: "0"
47
+ version:
48
+ required_rubygems_version: !ruby/object:Gem::Requirement
49
+ requirements:
50
+ - - ">="
51
+ - !ruby/object:Gem::Version
52
+ version: "0"
53
+ version:
51
54
  requirements:
52
55
  - none
53
- dependencies: []
56
+ rubyforge_project:
57
+ rubygems_version: 1.0.1
58
+ signing_key:
59
+ specification_version: 2
60
+ summary: "simple_http: Simple Http client lib."
61
+ test_files: []
54
62