glebtv-httpclient 3.0.0

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 (59) hide show
  1. checksums.yaml +7 -0
  2. data/README.rdoc +108 -0
  3. data/bin/httpclient +65 -0
  4. data/lib/glebtv-httpclient.rb +1 -0
  5. data/lib/hexdump.rb +50 -0
  6. data/lib/http-access2/cookie.rb +1 -0
  7. data/lib/http-access2/http.rb +1 -0
  8. data/lib/http-access2.rb +55 -0
  9. data/lib/httpclient/auth.rb +899 -0
  10. data/lib/httpclient/cacert.p7s +1912 -0
  11. data/lib/httpclient/connection.rb +88 -0
  12. data/lib/httpclient/cookie.rb +438 -0
  13. data/lib/httpclient/http.rb +1050 -0
  14. data/lib/httpclient/include_client.rb +83 -0
  15. data/lib/httpclient/session.rb +1031 -0
  16. data/lib/httpclient/ssl_config.rb +403 -0
  17. data/lib/httpclient/timeout.rb +140 -0
  18. data/lib/httpclient/util.rb +186 -0
  19. data/lib/httpclient/version.rb +3 -0
  20. data/lib/httpclient.rb +1157 -0
  21. data/lib/oauthclient.rb +110 -0
  22. data/sample/async.rb +8 -0
  23. data/sample/auth.rb +11 -0
  24. data/sample/cookie.rb +18 -0
  25. data/sample/dav.rb +103 -0
  26. data/sample/howto.rb +49 -0
  27. data/sample/oauth_buzz.rb +57 -0
  28. data/sample/oauth_friendfeed.rb +59 -0
  29. data/sample/oauth_twitter.rb +61 -0
  30. data/sample/ssl/0cert.pem +22 -0
  31. data/sample/ssl/0key.pem +30 -0
  32. data/sample/ssl/1000cert.pem +19 -0
  33. data/sample/ssl/1000key.pem +18 -0
  34. data/sample/ssl/htdocs/index.html +10 -0
  35. data/sample/ssl/ssl_client.rb +22 -0
  36. data/sample/ssl/webrick_httpsd.rb +29 -0
  37. data/sample/stream.rb +21 -0
  38. data/sample/thread.rb +27 -0
  39. data/sample/wcat.rb +21 -0
  40. data/test/ca-chain.cert +44 -0
  41. data/test/ca.cert +23 -0
  42. data/test/client.cert +19 -0
  43. data/test/client.key +15 -0
  44. data/test/helper.rb +129 -0
  45. data/test/htdigest +1 -0
  46. data/test/htpasswd +2 -0
  47. data/test/runner.rb +2 -0
  48. data/test/server.cert +19 -0
  49. data/test/server.key +15 -0
  50. data/test/sslsvr.rb +65 -0
  51. data/test/subca.cert +21 -0
  52. data/test/test_auth.rb +321 -0
  53. data/test/test_cookie.rb +412 -0
  54. data/test/test_hexdump.rb +14 -0
  55. data/test/test_http-access2.rb +507 -0
  56. data/test/test_httpclient.rb +1801 -0
  57. data/test/test_include_client.rb +52 -0
  58. data/test/test_ssl.rb +235 -0
  59. metadata +102 -0
@@ -0,0 +1,52 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require File.expand_path('helper', File.dirname(__FILE__))
3
+
4
+ require 'httpclient/include_client'
5
+ class TestIncludeClient < Test::Unit::TestCase
6
+ class Widget
7
+ extend HTTPClient::IncludeClient
8
+
9
+ include_http_client("http://example.com") do |client|
10
+ client.cookie_manager = nil
11
+ client.agent_name = "iMonkey 4k"
12
+ end
13
+ end
14
+
15
+ class OtherWidget
16
+ extend HTTPClient::IncludeClient
17
+
18
+ include_http_client
19
+ include_http_client(:method_name => :other_http_client)
20
+ end
21
+
22
+ class UnrelatedBlankClass ; end
23
+
24
+ def test_client_class_level_singleton
25
+ assert_equal Widget.http_client.object_id, Widget.http_client.object_id
26
+
27
+ assert_equal Widget.http_client.object_id, Widget.new.http_client.object_id
28
+
29
+ assert_not_equal Widget.http_client.object_id, OtherWidget.http_client.object_id
30
+ end
31
+
32
+ def test_configured
33
+ assert_equal Widget.http_client.agent_name, "iMonkey 4k"
34
+ assert_nil Widget.http_client.cookie_manager
35
+ assert_equal Widget.http_client.proxy.to_s, "http://example.com"
36
+ end
37
+
38
+ def test_two_includes
39
+ assert_not_equal OtherWidget.http_client.object_id, OtherWidget.other_http_client.object_id
40
+
41
+ assert_equal OtherWidget.other_http_client.object_id, OtherWidget.new.other_http_client.object_id
42
+ end
43
+
44
+ # meta-programming gone wrong sometimes accidentally
45
+ # adds the class method to _everyone_, a mistake we've made before.
46
+ def test_not_infected_class_hieararchy
47
+ assert ! Class.respond_to?(:http_client)
48
+ assert ! UnrelatedBlankClass.respond_to?(:http_client)
49
+ end
50
+
51
+
52
+ end
data/test/test_ssl.rb ADDED
@@ -0,0 +1,235 @@
1
+ require File.expand_path('helper', File.dirname(__FILE__))
2
+ require 'webrick/https'
3
+
4
+
5
+ class TestSSL < Test::Unit::TestCase
6
+ include Helper
7
+ DIR = File.dirname(File.expand_path(__FILE__))
8
+
9
+ def setup
10
+ super
11
+ @serverpid = @client = nil
12
+ @verify_callback_called = false
13
+ @verbose, $VERBOSE = $VERBOSE, nil
14
+ setup_server
15
+ setup_client
16
+ @url = "https://localhost:#{serverport}/hello"
17
+ end
18
+
19
+ def teardown
20
+ super
21
+ $VERBOSE = @verbose
22
+ end
23
+
24
+ def path(filename)
25
+ File.expand_path(filename, DIR)
26
+ end
27
+
28
+ def test_options
29
+ cfg = @client.ssl_config
30
+ assert_nil(cfg.client_cert)
31
+ assert_nil(cfg.client_key)
32
+ assert_nil(cfg.client_ca)
33
+ assert_equal(OpenSSL::SSL::VERIFY_PEER | OpenSSL::SSL::VERIFY_FAIL_IF_NO_PEER_CERT, cfg.verify_mode)
34
+ assert_nil(cfg.verify_callback)
35
+ assert_nil(cfg.timeout)
36
+ assert_equal(OpenSSL::SSL::OP_ALL | OpenSSL::SSL::OP_NO_SSLv2, cfg.options)
37
+ assert_equal("ALL:!aNULL:!eNULL:!SSLv2", cfg.ciphers)
38
+ assert_instance_of(OpenSSL::X509::Store, cfg.cert_store)
39
+ end
40
+
41
+ def test_sync
42
+ cfg = @client.ssl_config
43
+ cfg.set_client_cert_file(path('client.cert'), path('client.key'))
44
+ cfg.add_trust_ca(path('ca.cert'))
45
+ cfg.add_trust_ca(path('subca.cert'))
46
+ assert_equal("hello", @client.get_content(@url))
47
+
48
+ @client.socket_sync = false
49
+ @client.reset_all
50
+ assert_equal("hello", @client.get_content(@url))
51
+ end
52
+
53
+ def test_debug_dev
54
+ str = @client.debug_dev = ''
55
+ cfg = @client.ssl_config
56
+ cfg.client_cert = cert("client.cert")
57
+ cfg.client_key = key("client.key")
58
+ cfg.add_trust_ca(path('ca.cert'))
59
+ cfg.add_trust_ca(path('subca.cert'))
60
+ assert_equal("hello", @client.get_content(@url))
61
+ assert(str.scan(/^hello$/)[0])
62
+ end
63
+
64
+ def test_verification
65
+ cfg = @client.ssl_config
66
+ cfg.verify_callback = method(:verify_callback).to_proc
67
+ begin
68
+ @verify_callback_called = false
69
+ @client.get(@url)
70
+ assert(false)
71
+ rescue OpenSSL::SSL::SSLError => ssle
72
+ assert_match(/certificate verify failed/, ssle.message)
73
+ assert(@verify_callback_called)
74
+ end
75
+ #
76
+ cfg.client_cert = cert("client.cert")
77
+ cfg.client_key = key("client.key")
78
+ @verify_callback_called = false
79
+ begin
80
+ @client.get(@url)
81
+ assert(false)
82
+ rescue OpenSSL::SSL::SSLError => ssle
83
+ assert_match(/certificate verify failed/, ssle.message)
84
+ assert(@verify_callback_called)
85
+ end
86
+ #
87
+ cfg.add_trust_ca(path('ca.cert'))
88
+ @verify_callback_called = false
89
+ begin
90
+ @client.get(@url)
91
+ assert(false)
92
+ rescue OpenSSL::SSL::SSLError => ssle
93
+ assert_match(/certificate verify failed/, ssle.message)
94
+ assert(@verify_callback_called)
95
+ end
96
+ #
97
+ cfg.add_trust_ca(path('subca.cert'))
98
+ @verify_callback_called = false
99
+ assert_equal("hello", @client.get_content(@url))
100
+ assert(@verify_callback_called)
101
+ #
102
+ unless ENV['TRAVIS']
103
+ # On travis environment, verify_depth seems to not work properly.
104
+ # Ubuntu 10.04 + OpenSSL 0.9.8k issue?
105
+ cfg.verify_depth = 1 # 2 required: root-sub
106
+ @verify_callback_called = false
107
+ begin
108
+ @client.get(@url)
109
+ assert(false, "verify_depth is not supported? #{OpenSSL::OPENSSL_VERSION}")
110
+ rescue OpenSSL::SSL::SSLError => ssle
111
+ assert_match(/certificate verify failed/, ssle.message)
112
+ assert(@verify_callback_called)
113
+ end
114
+ #
115
+ cfg.verify_depth = 2 # 2 required: root-sub
116
+ @verify_callback_called = false
117
+ @client.get(@url)
118
+ assert(@verify_callback_called)
119
+ #
120
+ end
121
+ cfg.verify_depth = nil
122
+ cfg.cert_store = OpenSSL::X509::Store.new
123
+ cfg.verify_mode = OpenSSL::SSL::VERIFY_PEER
124
+ begin
125
+ @client.get_content(@url)
126
+ assert(false)
127
+ rescue OpenSSL::SSL::SSLError => ssle
128
+ assert_match(/certificate verify failed/, ssle.message)
129
+ end
130
+ #
131
+ cfg.verify_mode = nil
132
+ assert_equal("hello", @client.get_content(@url))
133
+ end
134
+
135
+ def test_ciphers
136
+ cfg = @client.ssl_config
137
+ cfg.set_client_cert_file(path('client.cert'), path('client.key'))
138
+ cfg.add_trust_ca(path('ca.cert'))
139
+ cfg.add_trust_ca(path('subca.cert'))
140
+ cfg.timeout = 123
141
+ assert_equal("hello", @client.get_content(@url))
142
+ #
143
+ cfg.ciphers = "!ALL"
144
+ begin
145
+ @client.get(@url)
146
+ assert(false)
147
+ rescue OpenSSL::SSL::SSLError => ssle
148
+ assert_match(/no cipher match/, ssle.message)
149
+ end
150
+ #
151
+ cfg.ciphers = "ALL"
152
+ assert_equal("hello", @client.get_content(@url))
153
+ #
154
+ cfg.ciphers = "DEFAULT"
155
+ assert_equal("hello", @client.get_content(@url))
156
+ end
157
+
158
+ def test_set_default_paths
159
+ assert_raise(OpenSSL::SSL::SSLError) do
160
+ @client.get(@url)
161
+ end
162
+ escape_env do
163
+ ENV['SSL_CERT_FILE'] = File.join(DIR, 'ca-chain.cert')
164
+ @client.ssl_config.set_default_paths
165
+ @client.get(@url)
166
+ end
167
+ end
168
+
169
+ private
170
+
171
+ def cert(filename)
172
+ OpenSSL::X509::Certificate.new(File.read(File.join(DIR, filename)))
173
+ end
174
+
175
+ def key(filename)
176
+ OpenSSL::PKey::RSA.new(File.read(File.join(DIR, filename)))
177
+ end
178
+
179
+ def q(str)
180
+ %Q["#{str}"]
181
+ end
182
+
183
+ def setup_server
184
+ logger = Logger.new(STDERR)
185
+ logger.level = Logger::Severity::FATAL # avoid logging SSLError (ERROR level)
186
+ @server = WEBrick::HTTPServer.new(
187
+ :BindAddress => "localhost",
188
+ :Logger => logger,
189
+ :Port => 0,
190
+ :AccessLog => [],
191
+ :DocumentRoot => DIR,
192
+ :SSLEnable => true,
193
+ :SSLCACertificateFile => File.join(DIR, 'ca.cert'),
194
+ :SSLCertificate => cert('server.cert'),
195
+ :SSLPrivateKey => key('server.key'),
196
+ :SSLVerifyClient => nil, #OpenSSL::SSL::VERIFY_FAIL_IF_NO_PEER_CERT|OpenSSL::SSL::VERIFY_PEER,
197
+ :SSLClientCA => cert('ca.cert'),
198
+ :SSLCertName => nil
199
+ )
200
+ @serverport = @server.config[:Port]
201
+ [:hello].each do |sym|
202
+ @server.mount(
203
+ "/#{sym}",
204
+ WEBrick::HTTPServlet::ProcHandler.new(method("do_#{sym}").to_proc)
205
+ )
206
+ end
207
+ @server_thread = start_server_thread(@server)
208
+ end
209
+
210
+ def do_hello(req, res)
211
+ res['content-type'] = 'text/html'
212
+ res.body = "hello"
213
+ end
214
+
215
+ def start_server_thread(server)
216
+ t = Thread.new {
217
+ Thread.current.abort_on_exception = true
218
+ server.start
219
+ }
220
+ while server.status != :Running
221
+ sleep 0.1
222
+ unless t.alive?
223
+ t.join
224
+ raise
225
+ end
226
+ end
227
+ t
228
+ end
229
+
230
+ def verify_callback(ok, cert)
231
+ @verify_callback_called = true
232
+ p ["client", ok, cert] if $DEBUG
233
+ ok
234
+ end
235
+ end
metadata ADDED
@@ -0,0 +1,102 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: glebtv-httpclient
3
+ version: !ruby/object:Gem::Version
4
+ version: 3.0.0
5
+ platform: ruby
6
+ authors:
7
+ - glebtv
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-05-13 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description:
14
+ email: glebtv@gmail.com
15
+ executables:
16
+ - httpclient
17
+ extensions: []
18
+ extra_rdoc_files: []
19
+ files:
20
+ - bin/httpclient
21
+ - lib/httpclient.rb
22
+ - lib/hexdump.rb
23
+ - lib/glebtv-httpclient.rb
24
+ - lib/httpclient/cacert.p7s
25
+ - lib/httpclient/http.rb
26
+ - lib/httpclient/cookie.rb
27
+ - lib/httpclient/timeout.rb
28
+ - lib/httpclient/version.rb
29
+ - lib/httpclient/include_client.rb
30
+ - lib/httpclient/auth.rb
31
+ - lib/httpclient/connection.rb
32
+ - lib/httpclient/ssl_config.rb
33
+ - lib/httpclient/session.rb
34
+ - lib/httpclient/util.rb
35
+ - lib/oauthclient.rb
36
+ - lib/http-access2.rb
37
+ - lib/http-access2/http.rb
38
+ - lib/http-access2/cookie.rb
39
+ - sample/cookie.rb
40
+ - sample/stream.rb
41
+ - sample/async.rb
42
+ - sample/auth.rb
43
+ - sample/oauth_friendfeed.rb
44
+ - sample/howto.rb
45
+ - sample/oauth_buzz.rb
46
+ - sample/dav.rb
47
+ - sample/oauth_twitter.rb
48
+ - sample/thread.rb
49
+ - sample/ssl/1000key.pem
50
+ - sample/ssl/0key.pem
51
+ - sample/ssl/webrick_httpsd.rb
52
+ - sample/ssl/1000cert.pem
53
+ - sample/ssl/0cert.pem
54
+ - sample/ssl/ssl_client.rb
55
+ - sample/ssl/htdocs/index.html
56
+ - sample/wcat.rb
57
+ - test/test_http-access2.rb
58
+ - test/test_auth.rb
59
+ - test/htpasswd
60
+ - test/helper.rb
61
+ - test/ca-chain.cert
62
+ - test/test_hexdump.rb
63
+ - test/subca.cert
64
+ - test/server.cert
65
+ - test/server.key
66
+ - test/runner.rb
67
+ - test/test_include_client.rb
68
+ - test/test_httpclient.rb
69
+ - test/test_cookie.rb
70
+ - test/sslsvr.rb
71
+ - test/ca.cert
72
+ - test/test_ssl.rb
73
+ - test/htdigest
74
+ - test/client.key
75
+ - test/client.cert
76
+ - README.rdoc
77
+ homepage: http://github.com/glebtv/httpclient
78
+ licenses:
79
+ - ruby
80
+ metadata: {}
81
+ post_install_message:
82
+ rdoc_options: []
83
+ require_paths:
84
+ - lib
85
+ required_ruby_version: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - '>='
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ required_rubygems_version: !ruby/object:Gem::Requirement
91
+ requirements:
92
+ - - '>='
93
+ - !ruby/object:Gem::Version
94
+ version: '0'
95
+ requirements: []
96
+ rubyforge_project:
97
+ rubygems_version: 2.0.3
98
+ signing_key:
99
+ specification_version: 4
100
+ summary: Fork of httpclient with some fixes and patches I needed. Please use original
101
+ gem instead
102
+ test_files: []