httpclient 2.1.5 → 2.8.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.
Files changed (71) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +85 -0
  3. data/bin/httpclient +77 -0
  4. data/bin/jsonclient +85 -0
  5. data/lib/hexdump.rb +50 -0
  6. data/lib/http-access2.rb +6 -4
  7. data/lib/httpclient/auth.rb +575 -173
  8. data/lib/httpclient/cacert.pem +3952 -0
  9. data/lib/httpclient/cacert1024.pem +3866 -0
  10. data/lib/httpclient/connection.rb +6 -2
  11. data/lib/httpclient/cookie.rb +162 -504
  12. data/lib/httpclient/http.rb +334 -119
  13. data/lib/httpclient/include_client.rb +85 -0
  14. data/lib/httpclient/jruby_ssl_socket.rb +588 -0
  15. data/lib/httpclient/session.rb +385 -288
  16. data/lib/httpclient/ssl_config.rb +195 -155
  17. data/lib/httpclient/ssl_socket.rb +150 -0
  18. data/lib/httpclient/timeout.rb +14 -10
  19. data/lib/httpclient/util.rb +142 -6
  20. data/lib/httpclient/version.rb +3 -0
  21. data/lib/httpclient/webagent-cookie.rb +459 -0
  22. data/lib/httpclient.rb +509 -202
  23. data/lib/jsonclient.rb +63 -0
  24. data/lib/oauthclient.rb +111 -0
  25. data/sample/async.rb +8 -0
  26. data/sample/auth.rb +11 -0
  27. data/sample/cookie.rb +18 -0
  28. data/sample/dav.rb +103 -0
  29. data/sample/howto.rb +49 -0
  30. data/sample/jsonclient.rb +67 -0
  31. data/sample/oauth_buzz.rb +57 -0
  32. data/sample/oauth_friendfeed.rb +59 -0
  33. data/sample/oauth_twitter.rb +61 -0
  34. data/sample/ssl/0cert.pem +22 -0
  35. data/sample/ssl/0key.pem +30 -0
  36. data/sample/ssl/1000cert.pem +19 -0
  37. data/sample/ssl/1000key.pem +18 -0
  38. data/sample/ssl/htdocs/index.html +10 -0
  39. data/sample/ssl/ssl_client.rb +22 -0
  40. data/sample/ssl/webrick_httpsd.rb +29 -0
  41. data/sample/stream.rb +21 -0
  42. data/sample/thread.rb +27 -0
  43. data/sample/wcat.rb +21 -0
  44. data/test/ca-chain.pem +44 -0
  45. data/test/ca.cert +23 -0
  46. data/test/client-pass.key +18 -0
  47. data/test/client.cert +19 -0
  48. data/test/client.key +15 -0
  49. data/test/helper.rb +131 -0
  50. data/test/htdigest +1 -0
  51. data/test/htpasswd +2 -0
  52. data/test/jruby_ssl_socket/test_pemutils.rb +32 -0
  53. data/test/runner.rb +2 -0
  54. data/test/server.cert +19 -0
  55. data/test/server.key +15 -0
  56. data/test/sslsvr.rb +65 -0
  57. data/test/subca.cert +21 -0
  58. data/test/test_auth.rb +492 -0
  59. data/test/test_cookie.rb +309 -0
  60. data/test/test_hexdump.rb +14 -0
  61. data/test/test_http-access2.rb +508 -0
  62. data/test/test_httpclient.rb +2145 -0
  63. data/test/test_include_client.rb +52 -0
  64. data/test/test_jsonclient.rb +80 -0
  65. data/test/test_ssl.rb +559 -0
  66. data/test/test_webagent-cookie.rb +465 -0
  67. metadata +85 -44
  68. data/lib/httpclient/auth.rb.orig +0 -513
  69. data/lib/httpclient/cacert.p7s +0 -1579
  70. data/lib/httpclient.rb.orig +0 -1020
  71. data/lib/tags +0 -908
@@ -0,0 +1,309 @@
1
+ require 'test/unit'
2
+ require 'uri'
3
+ require 'tempfile'
4
+
5
+ require 'httpclient/util'
6
+ require 'httpclient/cookie'
7
+
8
+ class TestCookie < Test::Unit::TestCase
9
+ include HTTPClient::Util
10
+
11
+ def setup()
12
+ @c = WebAgent::Cookie.new('hoge', 'funi')
13
+ end
14
+
15
+ def test_s_new()
16
+ assert_instance_of(WebAgent::Cookie, @c)
17
+ end
18
+ end
19
+
20
+ class TestCookieManager < Test::Unit::TestCase
21
+ include HTTPClient::Util
22
+
23
+ def setup()
24
+ @cm = WebAgent::CookieManager.new()
25
+ end
26
+
27
+ def teardown()
28
+ end
29
+
30
+ def test_parse()
31
+ str = "inkid=n92b0ADOgACIgUb9lsjHqAAAHu2a; expires=Wed, 01-Dec-2999 00:00:00 GMT; path=/"
32
+ @cm.parse(str, urify('http://www.test.jp'))
33
+ cookie = @cm.cookies[0]
34
+ assert_instance_of(WebAgent::Cookie, cookie)
35
+ assert_equal("inkid", cookie.name)
36
+ assert_equal("n92b0ADOgACIgUb9lsjHqAAAHu2a", cookie.value)
37
+ assert_equal(Time.gm(2999, 12, 1, 0,0,0), cookie.expires)
38
+ assert_equal("/", cookie.path)
39
+ end
40
+
41
+ def test_parse2()
42
+ str = "xmen=off,0,0,1; path=/; domain=.excite.co.jp; expires=Wednesday, 31-Dec-2037 12:00:00 GMT"
43
+ @cm.parse(str, urify('http://www.excite.co.jp'))
44
+ cookie = @cm.cookies[0]
45
+ assert_instance_of(WebAgent::Cookie, cookie)
46
+ assert_equal("xmen", cookie.name)
47
+ assert_equal("off,0,0,1", cookie.value)
48
+ assert_equal("/", cookie.path)
49
+ assert_equal("excite.co.jp", cookie.domain)
50
+ assert_equal(".excite.co.jp", cookie.dot_domain)
51
+ assert_equal(Time.gm(2037,12,31,12,0,0), cookie.expires)
52
+ end
53
+
54
+ def test_parse3()
55
+ str = "xmen=off,0,0,1; path=/; domain=.excite.co.jp; expires=Wednesday, 31-Dec-2037 12:00:00 GMT;Secure;HTTPOnly"
56
+ @cm.parse(str, urify('http://www.excite.co.jp'))
57
+ cookie = @cm.cookies[0]
58
+ assert_instance_of(WebAgent::Cookie, cookie)
59
+ assert_equal("xmen", cookie.name)
60
+ assert_equal("off,0,0,1", cookie.value)
61
+ assert_equal("/", cookie.path)
62
+ assert_equal("excite.co.jp", cookie.domain)
63
+ assert_equal(".excite.co.jp", cookie.dot_domain)
64
+ assert_equal(Time.gm(2037,12,31,12,0,0), cookie.expires)
65
+ assert_equal(true, cookie.secure?)
66
+ assert_equal(true, cookie.http_only?)
67
+ end
68
+
69
+ def test_parse_double_semicolon()
70
+ str = "xmen=off,0,0,1;; path=\"/;;\"; domain=.excite.co.jp; expires=Wednesday, 31-Dec-2037 12:00:00 GMT"
71
+ @cm.parse(str, urify('http://www.excite.co.jp'))
72
+ cookie = @cm.cookies[0]
73
+ assert_instance_of(WebAgent::Cookie, cookie)
74
+ assert_equal("xmen", cookie.name)
75
+ assert_equal("off,0,0,1", cookie.value)
76
+ assert_equal("/;;", cookie.path)
77
+ assert_equal("excite.co.jp", cookie.domain)
78
+ assert_equal(".excite.co.jp", cookie.dot_domain)
79
+ assert_equal(Time.gm(2037,12,31,12,0,0), cookie.expires)
80
+ end
81
+
82
+ # def test_make_portlist()
83
+ # assert_equal([80,8080], @cm.instance_eval{make_portlist("80,8080")})
84
+ # assert_equal([80], @cm.instance_eval{make_portlist("80")})
85
+ # assert_equal([80,8080,10080], @cm.instance_eval{make_portlist(" 80, 8080, 10080 \n")})
86
+ # end
87
+
88
+ def test_check_expired_cookies()
89
+ format = "%a, %d-%b-%Y %H:%M:%S GMT"
90
+ c1 = WebAgent::Cookie.new('hoge1', 'funi', :domain => 'http://www.example.com/', :path => '/')
91
+ c2 = WebAgent::Cookie.new('hoge2', 'funi', :domain => 'http://www.example.com/', :path => '/')
92
+ c3 = WebAgent::Cookie.new('hoge3', 'funi', :domain => 'http://www.example.com/', :path => '/')
93
+ c4 = WebAgent::Cookie.new('hoge4', 'funi', :domain => 'http://www.example.com/', :path => '/')
94
+ c1.expires = (Time.now - 100).gmtime.strftime(format)
95
+ c2.expires = (Time.now + 100).gmtime.strftime(format)
96
+ c3.expires = (Time.now - 10).gmtime.strftime(format)
97
+ c4.expires = nil
98
+ cookies = [c1,c2,c3,c4]
99
+ @cm.cookies = cookies
100
+ assert_equal(c2.name, @cm.cookies[0].name)
101
+ assert_equal(c2.expires, @cm.cookies[0].expires)
102
+ assert_equal(c4.name, @cm.cookies[1].name)
103
+ assert_equal(c4.expires, @cm.cookies[1].expires)
104
+ end
105
+
106
+ def test_parse_expires
107
+ str = "inkid=n92b0ADOgACIgUb9lsjHqAAAHu2a; expires=; path=/"
108
+ @cm.parse(str, urify('http://www.test.jp'))
109
+ cookie = @cm.cookies[0]
110
+ assert_equal("inkid", cookie.name)
111
+ assert_equal("n92b0ADOgACIgUb9lsjHqAAAHu2a", cookie.value)
112
+ assert_equal(nil, cookie.expires)
113
+ assert_equal("/", cookie.path)
114
+ #
115
+ str = "inkid=n92b0ADOgACIgUb9lsjHqAAAHu2a; path=/; expires="
116
+ @cm.parse(str, urify('http://www.test.jp'))
117
+ cookie = @cm.cookies[0]
118
+ assert_equal("inkid", cookie.name)
119
+ assert_equal("n92b0ADOgACIgUb9lsjHqAAAHu2a", cookie.value)
120
+ assert_equal(nil, cookie.expires)
121
+ assert_equal("/", cookie.path)
122
+ #
123
+ str = "inkid=n92b0ADOgACIgUb9lsjHqAAAHu2a; path=/; expires=\"\""
124
+ @cm.parse(str, urify('http://www.test.jp'))
125
+ cookie = @cm.cookies[0]
126
+ assert_equal("inkid", cookie.name)
127
+ assert_equal("n92b0ADOgACIgUb9lsjHqAAAHu2a", cookie.value)
128
+ assert_equal(nil, cookie.expires)
129
+ assert_equal("/", cookie.path)
130
+ end
131
+
132
+ def test_parse_after_expiration
133
+ str = "inkid=n92b0ADOgACIgUb9lsjHqAAAHu2a; expires=Wed, 01-Dec-2999 00:00:00 GMT; path=/"
134
+ @cm.parse(str, urify('http://www.test.jp'))
135
+ cookie = @cm.cookies[0]
136
+ assert_instance_of(WebAgent::Cookie, cookie)
137
+ assert_equal("inkid", cookie.name)
138
+ assert_equal("n92b0ADOgACIgUb9lsjHqAAAHu2a", cookie.value)
139
+ assert_equal(Time.gm(2999, 12, 1, 0,0,0), cookie.expires)
140
+ assert_equal("/", cookie.path)
141
+
142
+ time = Time.at(Time.now.to_i + 60).utc
143
+ expires = time.strftime("%a, %d-%b-%Y %H:%M:%S GMT")
144
+ str = "inkid=n92b0ADOgACIgUb9lsjHqAAAHu2a; expires=#{expires}; path=/"
145
+ @cm.parse(str, urify('http://www.test.jp'))
146
+ cookie = @cm.cookies[0]
147
+ assert_equal("inkid", cookie.name)
148
+ assert_equal("n92b0ADOgACIgUb9lsjHqAAAHu2a", cookie.value)
149
+ assert_equal(time, cookie.expires)
150
+ assert_equal("/", cookie.path)
151
+ end
152
+
153
+ def test_find_cookie()
154
+ str = "xmen=off,0,0,1; path=/; domain=.excite2.co.jp; expires=Wednesday, 31-Dec-2037 12:00:00 GMT"
155
+ @cm.parse(str, urify("http://www.excite2.co.jp/"))
156
+
157
+ str = "xmen=off,0,0,2; path=/; domain=.excite.co.jp; expires=Wednesday, 31-Dec-2037 12:00:00 GMT"
158
+ @cm.parse(str, urify("http://www.excite.co.jp/"))
159
+
160
+ url = urify('http://www.excite.co.jp/hoge/funi/')
161
+ cookie_str = @cm.find(url)
162
+ assert_equal("xmen=\"off,0,0,2\"", cookie_str)
163
+ end
164
+
165
+ def test_load_cookies()
166
+ cookiefile = Tempfile.new('test_cookie')
167
+ File.open(cookiefile.path, 'w') do |f|
168
+ f.write <<EOF
169
+ http://www.zdnet.co.jp/news/0106/08/e_gibson.html NGUserID d29b8f49-10875-992421294-1 2145801600 www.zdnet.co.jp / 9 0
170
+ http://www.zdnet.co.jp/news/0106/08/e_gibson.html PACK zd3-992421294-7436 2293839999 .zdnet.co.jp / 13 0
171
+ http://example.org/ key value 0 .example.org / 13 0
172
+ http://example.org/ key value .example.org / 13 0
173
+ EOF
174
+ end
175
+
176
+ @cm.cookies_file = cookiefile.path
177
+ @cm.load_cookies()
178
+ c0, c1, c2 = @cm.cookies
179
+ assert_equal('http://www.zdnet.co.jp/news/0106/08/e_gibson.html', c0.url.to_s)
180
+ assert_equal('NGUserID', c0.name)
181
+ assert_equal('d29b8f49-10875-992421294-1', c0.value)
182
+ assert_equal(Time.at(2145801600), c0.expires)
183
+ assert_equal('www.zdnet.co.jp', c0.domain)
184
+ assert_equal('/', c0.path)
185
+ assert_equal(9, c0.flag)
186
+ #
187
+ assert_equal('http://www.zdnet.co.jp/news/0106/08/e_gibson.html', c1.url.to_s)
188
+ assert_equal('PACK', c1.name)
189
+ assert_equal('zd3-992421294-7436', c1.value)
190
+ assert_equal(Time.at(2293839999), c1.expires)
191
+ assert_equal('zdnet.co.jp', c1.domain)
192
+ assert_equal('.zdnet.co.jp', c1.dot_domain)
193
+ assert_equal('/', c1.path)
194
+ assert_equal(13, c1.flag)
195
+ #
196
+ assert_equal(nil, c2.expires)
197
+ end
198
+
199
+ def test_save_cookie()
200
+ str = <<EOF
201
+ http://www.zdnet.co.jp/news/0106/08/e_gibson.html NGUserID d29b8f49-10875-992421294-1 2145801600 www.zdnet.co.jp / 9
202
+ http://www.zdnet.co.jp/news/0106/08/e_gibson.html PACK zd3-992421294-7436 2145801600 .zdnet.co.jp / 13
203
+ EOF
204
+ cookiefile = Tempfile.new('test_cookie')
205
+ cookiefile2 = Tempfile.new('test_cookie2')
206
+ File.open(cookiefile.path, 'w') do |f|
207
+ f.write str
208
+ end
209
+
210
+ @cm.cookies_file = cookiefile.path
211
+ @cm.load_cookies()
212
+ @cm.instance_eval{@is_saved = false}
213
+ @cm.cookies_file = cookiefile2.path
214
+ @cm.save_cookies()
215
+ str2 = ''
216
+ File.open(cookiefile2.path, 'r') do |f|
217
+ str2 = f.read
218
+ end
219
+ assert_equal(str.split.sort, str2.split.sort)
220
+ assert(File.exist?(cookiefile2.path))
221
+ File.unlink(cookiefile2.path)
222
+ @cm.save_cookies()
223
+ assert(File.exist?(cookiefile2.path))
224
+ end
225
+
226
+ def test_not_saved_expired_cookies
227
+ cookiefile = Tempfile.new('test_cookie')
228
+ @cm.cookies_file = cookiefile.path
229
+ uri = urify('http://www.example.org')
230
+ @cm.parse("foo=1; path=/", uri)
231
+ @cm.parse("bar=2; path=/; expires=", uri)
232
+ @cm.parse("baz=3; path=/; expires=\"\"", uri)
233
+ @cm.parse("qux=4; path=/; expires=#{(Time.now.gmtime + 10).asctime}", uri)
234
+ @cm.parse("quxx=5; path=/; expires=#{(Time.now.gmtime - 10).asctime}", uri)
235
+ @cm.save_cookies
236
+ @cm.load_cookies
237
+ assert_equal(1, @cm.cookies.size) # +10 cookies only
238
+ end
239
+
240
+ def test_add()
241
+ c = WebAgent::Cookie.new('hoge', 'funi')
242
+ c.url = urify("http://www.inac.co.jp/hoge")
243
+ @cm.add(c)
244
+ c = @cm.cookies[0]
245
+ assert_equal('hoge', c.name)
246
+ assert_equal('funi', c.value)
247
+ assert_equal(nil, c.expires)
248
+ end
249
+
250
+ def test_add2()
251
+ c = WebAgent::Cookie.new('hoge', 'funi')
252
+ c.path = ''
253
+ c.url = urify("http://www.inac.co.jp/hoge/hoge2/hoge3")
254
+ @cm.add(c)
255
+ #
256
+ c = WebAgent::Cookie.new('hoge', 'funi')
257
+ #c.path = '' NO path given -> same as URL
258
+ c.url = urify("http://www.inac.co.jp/hoge/hoge2/hoge3")
259
+ @cm.add(c)
260
+ #
261
+ c1, c2 = @cm.cookies
262
+ assert_equal('/hoge/hoge2/', c1.path)
263
+ assert_equal('/', c2.path)
264
+ end
265
+
266
+ def test_keep_escaped
267
+ uri = urify('http://www.example.org')
268
+
269
+ @cm.parse("bar=2; path=/", uri)
270
+ c = @cm.cookies.first
271
+ assert_equal('2', c.value)
272
+ assert_equal('bar=2', @cm.find(uri))
273
+
274
+ @cm.parse("bar=\"2\"; path=/", uri)
275
+ c = @cm.cookies.first
276
+ assert_equal('2', c.value)
277
+ assert_equal('bar=2', @cm.find(uri))
278
+
279
+ @cm.parse("bar=; path=/", uri)
280
+ c = @cm.cookies.first
281
+ assert_equal('', c.value)
282
+ assert_equal('bar=', @cm.find(uri))
283
+
284
+ @cm.parse("bar=\"\"; path=/", uri)
285
+ c = @cm.cookies.first
286
+ assert_equal('', c.value)
287
+ assert_equal('bar=', @cm.find(uri))
288
+ end
289
+
290
+ def test_load_cookies_escaped
291
+ uri = urify('http://example.org/')
292
+ f = Tempfile.new('test_cookie')
293
+ File.open(f.path, 'w') do |out|
294
+ out.write <<EOF
295
+ http://example.org/ key1 "value" 0 .example.org / 13 0
296
+ http://example.org/ key2 "" 0 .example.org / 13 0
297
+ http://example.org/ key3 0 .example.org / 13 0
298
+ EOF
299
+ end
300
+ @cm.cookies_file = f.path
301
+ @cm.load_cookies
302
+ c0, c1, c2 = @cm.cookies
303
+ assert_equal('"value"', c0.value)
304
+ assert_equal('""', c1.value)
305
+ assert_equal('', c2.value)
306
+ assert_equal('key1="\\"value\\""; key2="\\"\\""; key3=', @cm.find(uri))
307
+ end
308
+
309
+ end
@@ -0,0 +1,14 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require File.expand_path('helper', File.dirname(__FILE__))
3
+ require 'hexdump'
4
+
5
+
6
+ class TestHexDump < Test::Unit::TestCase
7
+ def test_encode
8
+ str = "\032l\277\370\2429\216\236\351[{\{\262\350\274\376"
9
+ str.force_encoding('BINARY') if str.respond_to?(:force_encoding)
10
+ assert_equal(["00000000 1a6cbff8 a2398e9e e95b7b7b b2e8bcfe .l...9...[{{...."], HexDump.encode(str))
11
+ end
12
+ end if defined?(RUBY_ENGINE) && RUBY_ENGINE != "rbx" && RUBY_VERSION >= "1.9.0"
13
+ # Rubinius 1.8 mode does not support Regexp.quote(raw, 'n') I don't want put
14
+ # a pressure on supporting it because 1.9 mode works fine.