http_request.rb 1.0.2 → 1.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/Changelog +5 -0
- data/README.rdoc +13 -3
- data/lib/http_request.rb +78 -24
- metadata +2 -2
data/Changelog
CHANGED
@@ -1,3 +1,8 @@
|
|
1
|
+
v1.0.3
|
2
|
+
* add some dynamic methods such as code_1xx?, code_200?, code_403? etc. for check the http status
|
3
|
+
* decompressing gzipped body automatically, the 'Accept-Encoding: gzip,deflate' has been added into the header for sending request automatically.
|
4
|
+
* fixed retrieve cookies problem which is if a cookie name is a keyword of the cookie's info such as path, expire etc. then it doesn't work.
|
5
|
+
|
1
6
|
v1.0.2
|
2
7
|
* Proc.call (block) style supported and some small changes
|
3
8
|
* improve ftp protocol and add a new method get_as_string for the ftp calls
|
data/README.rdoc
CHANGED
@@ -189,18 +189,28 @@ download multiple files from a directory
|
|
189
189
|
http.cookies.each {|k, v| puts "#{k} => #{v}" }
|
190
190
|
}
|
191
191
|
|
192
|
-
HttpRequest.ftp(:get, {"ftp://user:pass@localhost", :to => }) {|ftp|
|
192
|
+
HttpRequest.ftp(:get, {"ftp://user:pass@localhost/soft.zip", :to => '/path/to/soft.zip'}) {|ftp|
|
193
193
|
puts ftp.ls
|
194
194
|
ftp.chdir('soft')
|
195
195
|
ftp.getbinaryfile('ruby.exe', '/path/to/local/ruby.exe');
|
196
196
|
}
|
197
197
|
|
198
|
+
== check the http status (since v1.0.3)
|
199
|
+
|
200
|
+
HttpRequest.get('http://www.example.com/it_doesnot_exists.page').code_4xx? # true
|
201
|
+
HttpRequest.get('http://www.example.com/it_doesnot_exists.page').code_404? # true
|
202
|
+
HttpRequest.get('http://www.rubyonrails.com/').code_404? # false
|
203
|
+
HttpRequest.head('http://www.rubyonrails.com/').code_2xx? # true
|
204
|
+
HttpRequest.head('http://www.ruby-lang.org/').code_200? # true
|
205
|
+
|
206
|
+
supported methods: code_1xx? code_2xx? code_3xx? code_4xx? code_5xx? code_101? code_200? ...
|
207
|
+
|
198
208
|
== TODO
|
199
209
|
|
200
|
-
|
210
|
+
bug fixing, testing and testing...
|
201
211
|
|
202
212
|
== LATEST VERSION
|
203
|
-
1.0.
|
213
|
+
1.0.3
|
204
214
|
|
205
215
|
== Author
|
206
216
|
|
data/lib/http_request.rb
CHANGED
@@ -11,9 +11,9 @@
|
|
11
11
|
#
|
12
12
|
# == Version
|
13
13
|
#
|
14
|
-
# v1.0.
|
14
|
+
# v1.0.3
|
15
15
|
#
|
16
|
-
# Last Change:
|
16
|
+
# Last Change: 27 May, 2009
|
17
17
|
#
|
18
18
|
# == Author
|
19
19
|
#
|
@@ -21,16 +21,19 @@
|
|
21
21
|
# homepage: http://my.cnzxh.net
|
22
22
|
#
|
23
23
|
#
|
24
|
+
require 'cgi'
|
24
25
|
require 'net/http'
|
25
26
|
require 'net/https'
|
26
|
-
require '
|
27
|
+
require 'net/ftp'
|
27
28
|
require 'singleton'
|
29
|
+
require 'md5'
|
30
|
+
require 'stringio'
|
28
31
|
|
29
32
|
class HttpRequest
|
30
33
|
include Singleton
|
31
34
|
|
32
35
|
# version
|
33
|
-
VERSION = '1.0.
|
36
|
+
VERSION = '1.0.3'.freeze
|
34
37
|
def self.version;VERSION;end
|
35
38
|
|
36
39
|
# avaiabled http methods
|
@@ -43,6 +46,18 @@ class HttpRequest
|
|
43
46
|
block_given? ? block.call(response) : response
|
44
47
|
end
|
45
48
|
|
49
|
+
# check the http resource whether or not available
|
50
|
+
def self.available?(url, timeout = 5)
|
51
|
+
timeout(timeout) {
|
52
|
+
u = URI(url)
|
53
|
+
s = TCPSocket.new(u.host, u.port)
|
54
|
+
s.close
|
55
|
+
}
|
56
|
+
return true
|
57
|
+
rescue Exception => e
|
58
|
+
return false
|
59
|
+
end
|
60
|
+
|
46
61
|
# send request by some given parameters
|
47
62
|
def request(method, opt, &block)
|
48
63
|
init_args(method, opt)
|
@@ -115,7 +130,6 @@ class HttpRequest
|
|
115
130
|
|
116
131
|
# for ftp
|
117
132
|
def self.ftp(method, options, &block)
|
118
|
-
require 'net/ftp'
|
119
133
|
options = {:url => options} if options.is_a? String
|
120
134
|
options = {:close => true}.merge(options)
|
121
135
|
options[:url] = "ftp://#{options[:url]}" unless options[:url] =~ /^ftp:\/\//
|
@@ -177,9 +191,10 @@ class HttpRequest
|
|
177
191
|
@uri = URI(@options[:url])
|
178
192
|
@uri.path = '/' if @uri.path.empty?
|
179
193
|
@headers = {
|
180
|
-
'Host'
|
181
|
-
'
|
182
|
-
'
|
194
|
+
'Host' => @uri.host,
|
195
|
+
'Accept-Encoding' => 'gzip,deflate',
|
196
|
+
'Referer' => @options[:url],
|
197
|
+
'User-Agent' => 'HttpRequest.rb ' + VERSION
|
183
198
|
}
|
184
199
|
|
185
200
|
# Basic Authenication
|
@@ -207,7 +222,6 @@ class HttpRequest
|
|
207
222
|
|
208
223
|
# for upload files by post method
|
209
224
|
def build_multipart
|
210
|
-
require 'md5'
|
211
225
|
boundary = MD5.md5(rand.to_s).to_s[0..5]
|
212
226
|
@headers['Content-type'] = "multipart/form-data, boundary=#{boundary}"
|
213
227
|
multipart = []
|
@@ -264,20 +278,60 @@ class HttpRequest
|
|
264
278
|
|
265
279
|
end
|
266
280
|
|
267
|
-
|
268
|
-
class
|
269
|
-
|
270
|
-
cookies
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
cookies
|
279
|
-
|
280
|
-
|
281
|
+
module Net
|
282
|
+
class HTTPResponse
|
283
|
+
|
284
|
+
# get cookies as a hash
|
285
|
+
def cookies
|
286
|
+
cookies = {}
|
287
|
+
return cookies unless @header['set-cookie']
|
288
|
+
@header['set-cookie'].each {|k|
|
289
|
+
k, v = k.split(';')[0].split('=')
|
290
|
+
cookies[k] = v
|
291
|
+
}
|
292
|
+
cookies
|
293
|
+
end
|
294
|
+
|
295
|
+
# for gzipped body
|
296
|
+
def body
|
297
|
+
bd = read_body()
|
298
|
+
return bd unless bd
|
299
|
+
unless self['content-encoding'].eql? 'gzip'
|
300
|
+
bd
|
301
|
+
else
|
302
|
+
::Zlib::GzipReader.new(StringIO.new(bd)).read
|
303
|
+
end
|
304
|
+
end
|
305
|
+
|
306
|
+
# body
|
307
|
+
def raw_body
|
308
|
+
read_body()
|
309
|
+
end
|
310
|
+
|
311
|
+
# detect the response code
|
312
|
+
#
|
313
|
+
# Example:
|
314
|
+
# puts HttpRequest.get('http://www.example.com').code_200?
|
315
|
+
# puts HttpRequest.get('http://www.example.com').code_2xx?
|
316
|
+
# HttpRequest.get('http://www.example.com/404.html') {|http|
|
317
|
+
# puts "IS 4xx" if http.code_4xx?
|
318
|
+
# puts "IS 404" if http.code_404?
|
319
|
+
# }
|
320
|
+
#
|
321
|
+
# supported methods
|
322
|
+
# code_1xx? code_2xx? code_3xx? code_4xx? code_5xx?
|
323
|
+
# code_100? code_101? code_200? code_201? ... code_505?
|
324
|
+
def method_missing(method_name)
|
325
|
+
case method_name.to_s
|
326
|
+
when /^code_([0-9])xx\?$/
|
327
|
+
is_a? CODE_CLASS_TO_OBJ[$1]
|
328
|
+
when /^code_([0-9]+)\?$/
|
329
|
+
is_a? CODE_TO_OBJ[$1]
|
330
|
+
else
|
331
|
+
raise NoHttpMethodException, 'Unknown method of response code!'
|
332
|
+
end
|
333
|
+
end
|
334
|
+
|
281
335
|
end
|
282
336
|
end
|
283
337
|
|
@@ -309,7 +363,7 @@ if __FILE__.eql? $0
|
|
309
363
|
"{:url => '#{url}', :parameters => '" + params + "'}"
|
310
364
|
else
|
311
365
|
"'#{url}'"
|
312
|
-
|
366
|
+
end
|
313
367
|
|
314
368
|
if HttpRequest.http_methods.include?(method) && url
|
315
369
|
http = eval("HttpRequest.#{method}(#{params})")
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: http_request.rb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- xianhua.zhou
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-05-
|
12
|
+
date: 2009-05-27 00:00:00 +08:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|