http_session 0.1.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.
- data/.document +5 -0
- data/.rvmrc +1 -0
- data/Gemfile +14 -0
- data/Gemfile.lock +27 -0
- data/LICENSE +19 -0
- data/README.rdoc +72 -0
- data/Rakefile +148 -0
- data/VERSION +1 -0
- data/http_session.gemspec +75 -0
- data/lib/http_session.rb +206 -0
- data/share/ca/cacert.pem +3987 -0
- data/test/helper.rb +84 -0
- data/test/ssl/README.rdoc +32 -0
- data/test/ssl/ca.crt +34 -0
- data/test/ssl/ca.key +54 -0
- data/test/ssl/server.crt +31 -0
- data/test/ssl/server.csr +27 -0
- data/test/ssl/server.key +51 -0
- data/test/test_http_session.rb +292 -0
- metadata +149 -0
data/test/helper.rb
ADDED
@@ -0,0 +1,84 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
|
3
|
+
# require 'bundler'
|
4
|
+
# begin
|
5
|
+
# Bundler.setup(:default, :development)
|
6
|
+
# rescue Bundler::BundlerError => e
|
7
|
+
# $stderr.puts e.message
|
8
|
+
# $stderr.puts "Run `bundle install` to install missing gems"
|
9
|
+
# exit e.status_code
|
10
|
+
# end
|
11
|
+
|
12
|
+
if ENV.has_key?('USE_SIMPLECOV')
|
13
|
+
require 'simplecov'
|
14
|
+
SimpleCov.start do
|
15
|
+
add_group 'Libraries', 'lib'
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
require 'test/unit'
|
20
|
+
begin
|
21
|
+
require 'shoulda'
|
22
|
+
rescue LoadError
|
23
|
+
puts 'WARNING: missing shoulda library, cannot continue run tests'
|
24
|
+
exit
|
25
|
+
end
|
26
|
+
|
27
|
+
require 'webrick'
|
28
|
+
require 'webrick/https'
|
29
|
+
require 'openssl'
|
30
|
+
require 'thread'
|
31
|
+
TEST_SERVER_PORT = 8081
|
32
|
+
|
33
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
34
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
35
|
+
require 'http_session'
|
36
|
+
|
37
|
+
class Test::Unit::TestCase
|
38
|
+
|
39
|
+
# start a simple webrick server that runs the given servlet and other options for testing
|
40
|
+
@wbthread = nil
|
41
|
+
def start_server(use_ssl=false, config={})
|
42
|
+
# always run on this port
|
43
|
+
config.update(:Port => TEST_SERVER_PORT)
|
44
|
+
# for debugging the server itself, log debug output to stderr
|
45
|
+
# config.update(:Logger => ::WEBrick::Log.new($stderr, ::WEBrick::Log::DEBUG))
|
46
|
+
# or squelch all server logging for normal use
|
47
|
+
config.update(:Logger => ::WEBrick::Log.new('/dev/null'))
|
48
|
+
config.update(:AccessLog => [ [ File.open('/dev/null', 'w'), ::WEBrick::AccessLog::COMBINED_LOG_FORMAT ] ])
|
49
|
+
# don't ever process any requests in parallel, always run each test one at a time
|
50
|
+
config.update(:MaxClients => 1)
|
51
|
+
|
52
|
+
if use_ssl
|
53
|
+
# configure server to run with SSL
|
54
|
+
config.update(:SSLEnable => true)
|
55
|
+
config.update(:SSLVerifyClient => ::OpenSSL::SSL::VERIFY_NONE)
|
56
|
+
config.update(:SSLCertificate => ::OpenSSL::X509::Certificate.new(File.open(File.expand_path('../ssl/server.crt', __FILE__)).read))
|
57
|
+
config.update(:SSLPrivateKey => ::OpenSSL::PKey::RSA.new(File.open(File.expand_path('../ssl/server.key', __FILE__)).read))
|
58
|
+
config.update(:SSLCertName => [ [ "CN", 'localhost' ] ])
|
59
|
+
end
|
60
|
+
|
61
|
+
# create the server
|
62
|
+
server = ::WEBrick::HTTPServer.new(config)
|
63
|
+
yield server if block_given?
|
64
|
+
# run the server in its own thread, setting up USR1 signal to tell it to quit
|
65
|
+
@wbthread = Thread.new(server) do |server|
|
66
|
+
trap('USR1') { server.shutdown }
|
67
|
+
server.start
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
# stop the simple webrick server
|
72
|
+
def stop_server
|
73
|
+
if ! @wbthread.nil? && @wbthread.alive?
|
74
|
+
# signal server thread to quit
|
75
|
+
Process.kill('USR1', Process.pid)
|
76
|
+
# wait for it to actually quit
|
77
|
+
# note: Sometimes it appears to hang here at this join, when there's something wrong with the server or client
|
78
|
+
# when that happens just comment out to see more debug info what's wrong
|
79
|
+
# you'll also get some spurrious concurrency errors of course, but at least the problem will show up too
|
80
|
+
@wbthread.join
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
= How to update these files
|
2
|
+
|
3
|
+
These files are only good for so many years, and then they need to be updated... it is set to a very long time because they are only for testing purposes not for actual use of course.
|
4
|
+
|
5
|
+
== Generate your own CA (Certificate Authority):
|
6
|
+
|
7
|
+
openssl genrsa -des3 -out ca.key 4096
|
8
|
+
openssl req -new -x509 -days 3650 -key ca.key -out ca.crt
|
9
|
+
|
10
|
+
password is 1234
|
11
|
+
|
12
|
+
== Generate a server key and request for signing (csr):
|
13
|
+
|
14
|
+
openssl genrsa -des3 -out server.key 4096
|
15
|
+
openssl req -new -key server.key -out server.csr
|
16
|
+
|
17
|
+
CN must match host name or IP i.e. localhost, and must be different from CA's CN
|
18
|
+
|
19
|
+
== Sign the certificate signing request (csr) with the self-created Certificate Authority (CA) that you made earlier:
|
20
|
+
|
21
|
+
openssl x509 -req -days 3650 -in server.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out server.crt
|
22
|
+
|
23
|
+
increment serial each time it's updated
|
24
|
+
|
25
|
+
== Convert server.key into a password-less one:
|
26
|
+
|
27
|
+
openssl rsa -in server.key -out server.key.insecure
|
28
|
+
mv server.key.insecure server.key
|
29
|
+
|
30
|
+
that's it! :)
|
31
|
+
|
32
|
+
reference used: http://www.tc.umn.edu/~brams006/selfsign.html
|
data/test/ssl/ca.crt
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
-----BEGIN CERTIFICATE-----
|
2
|
+
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
|
33
|
+
I4rJ
|
34
|
+
-----END CERTIFICATE-----
|
data/test/ssl/ca.key
ADDED
@@ -0,0 +1,54 @@
|
|
1
|
+
-----BEGIN RSA PRIVATE KEY-----
|
2
|
+
Proc-Type: 4,ENCRYPTED
|
3
|
+
DEK-Info: DES-EDE3-CBC,5083380FBB8F8A0E
|
4
|
+
|
5
|
+
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
|
54
|
+
-----END RSA PRIVATE KEY-----
|
data/test/ssl/server.crt
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
-----BEGIN CERTIFICATE-----
|
2
|
+
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
|
30
|
+
IpLcSuP5rwtQcfwJwlc2TF6BLDc36qitzJO7
|
31
|
+
-----END CERTIFICATE-----
|
data/test/ssl/server.csr
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
-----BEGIN CERTIFICATE REQUEST-----
|
2
|
+
MIIEqjCCApICAQAwZTELMAkGA1UEBhMCVVMxEzARBgNVBAgMCkNhbGlmb3JuaWEx
|
3
|
+
FjAUBgNVBAcMDVNhbiBGcmFuY2lzY28xFTATBgNVBAoMDFRlc3QgQ29tcGFueTES
|
4
|
+
MBAGA1UEAwwJbG9jYWxob3N0MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKC
|
5
|
+
AgEA0mltlnw6nuqoZQz01+vbFc/abWwvAkF3dO4lblPtEv0G7LPEu7y1sTP755ar
|
6
|
+
LewQoqDMxoF6uYEsxWnYTX/x0jsSTa8NRgcaeUrep/19t2dQ+IF01EDJVT+nGhQd
|
7
|
+
FEVdDhjuQ2XZ53jmkBX44TjVBzgstEXdzBCpuuAwKa3wqDMLL94l+Qfjh9GOlRIX
|
8
|
+
O787bSyf3ky5qYrvZI97BKBM4dJDIQvUbMefh3Vhy3llqf2PTS4I6txpS6WnGobP
|
9
|
+
h0GuGELjxQpWBV8cEL2olGtgTLLBbgxCcoUUEFzsAS18iAxt4pOGQacf0HRnhYja
|
10
|
+
saNlVe/6DafIi8vRUR167Y3N9DGus+DWPmxDo4u7ac7aKJAxXPfu53/0p9P7i26J
|
11
|
+
Fo9AaL1EKuHLR9klAuv5zYgz9Suasn2gDsVfC9lNzzV85fp9Y8qLHWg/FIizKRI9
|
12
|
+
Jmep/Jz/TX9qcQfU8xs9kHo1i0Djnj1p0WW/vIjIlObej38fdT1R037vByjhOqyl
|
13
|
+
1ni0YQotOM4HnwvVt8U8uUc2A580oTFydj+l3AaCnjYDEXxxuTwE682wdWuBQRhu
|
14
|
+
nKSkFiJ8ltiKFKeaDDFtFQ0xMKtt3mgauz54aRMN79Mxk7UGhaeGbtNWw10kW7Op
|
15
|
+
qmc4uMzQQMeqBf56fYDvjfQ3kfvvsQZcwdastJOeztX+GskCAwEAAaAAMA0GCSqG
|
16
|
+
SIb3DQEBBQUAA4ICAQAkJp5VaLvvcsC5xo6XN5MYNMSfkT4sv8MynAIpJOd6ScIt
|
17
|
+
iuL9aD4vSQ2OOfa2MLsGFMgdH9pp54JvQ65EoPDWCp42YdxMViFmSrmuqWaQTKlN
|
18
|
+
AyVoLVUGzpTWrmrFD88V/f4ntN8OCHIYcyTLAE2kokzIrKdMRqS47JYZkSOrICnF
|
19
|
+
OKIJIoqD/poJ29MPlPbWjP9Z7pwsRuP39BFRi9FkOQtoHkrUXzswdy88BjKovklR
|
20
|
+
5CvFtaOUxoj/xdwMgf2mMVHThIHsJR5VQm09PBfGakNICZwx0E44Bi0GF2v5nvje
|
21
|
+
F4qKx8/wYFRBJ7G5FyarSWlZsQagtusN8aaDp588oCmHJ9CkISgGFbBR+6iMKxi2
|
22
|
+
60infnxNo2jA4CKu2vZHU0Q7NP7xGX0sgv/RGZdg9bt7v4h9CnORbtlXEi/xZmYa
|
23
|
+
xJFyrIgHq/6MP12WpAHwYVCAqhRl7DUqP8I3wExM8jEGotQ/7t2PNfXmqz6QCDZV
|
24
|
+
g+a+5ztmw0PcG140o3uT7xahYTmAY7df8WryejNIZO/W5NKK/ZSD/ID3ETHT8yF4
|
25
|
+
kNwKdWuAIl+AH047O5XYswwkgok/vHQh2ae0GsjpX5372uDiACjodu+ma2omQZqM
|
26
|
+
G0kE/vg9HJPoYt2AhsnpUiDwzI3ENjCu03AIUSyt4iC50OezK8XKmv+5uKn+NA==
|
27
|
+
-----END CERTIFICATE REQUEST-----
|
data/test/ssl/server.key
ADDED
@@ -0,0 +1,51 @@
|
|
1
|
+
-----BEGIN RSA PRIVATE KEY-----
|
2
|
+
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
|
51
|
+
-----END RSA PRIVATE KEY-----
|
@@ -0,0 +1,292 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
class TestHttpSession < Test::Unit::TestCase
|
4
|
+
context 'simple class methods' do
|
5
|
+
setup { @c = HttpSession }
|
6
|
+
|
7
|
+
context 'key' do
|
8
|
+
should('defaults') { assert_equal 'http://foo:80', @c.key('foo', false, nil) }
|
9
|
+
should('port') { assert_equal 'http://foo:8080', @c.key('foo', false, 8080) }
|
10
|
+
should('ssl') { assert_equal 'https://foo:443', @c.key('foo', true, nil) }
|
11
|
+
should('ssl port') { assert_equal 'https://foo:444', @c.key('foo', true, 444) }
|
12
|
+
end
|
13
|
+
|
14
|
+
context 'port_or_default' do
|
15
|
+
should('defaults') { assert_equal 80, @c.port_or_default(nil, false) }
|
16
|
+
should('port') { assert_equal 8080, @c.port_or_default(8080, false) }
|
17
|
+
should('ssl') { assert_equal 443, @c.port_or_default(nil, true) }
|
18
|
+
should('ssl port') { assert_equal 444, @c.port_or_default(444, true) }
|
19
|
+
end
|
20
|
+
|
21
|
+
context 'get' do
|
22
|
+
setup { @i = @c.use('foo') }
|
23
|
+
should('work') { assert_equal @i, @c.get('foo') }
|
24
|
+
should('fail') { assert_equal nil, @c.get('bar') }
|
25
|
+
should('nossl') { assert_equal @i, @c.get('foo', false) }
|
26
|
+
should('bad ssl') { assert_equal nil, @c.get('foo', true) }
|
27
|
+
should('port') { assert_equal @i, @c.get('foo', false, 80) }
|
28
|
+
should('bad port') { assert_equal nil, @c.get('foo', false, 8080) }
|
29
|
+
end
|
30
|
+
|
31
|
+
context 'exists?' do
|
32
|
+
setup { @i = @c.use('foo') }
|
33
|
+
should('work') { assert_equal true, @c.exists?('foo') }
|
34
|
+
should('fail') { assert_equal false, @c.exists?('bar') }
|
35
|
+
should('nossl') { assert_equal true, @c.exists?('foo', false) }
|
36
|
+
should('bad ssl') { assert_equal false, @c.exists?('foo', true) }
|
37
|
+
should('port') { assert_equal true, @c.exists?('foo', false, 80) }
|
38
|
+
should('bad port') { assert_equal false, @c.exists?('foo', false, 8080) }
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
context 'simple instance methods' do
|
43
|
+
setup { @c = HttpSession.new('foo', false, nil) }
|
44
|
+
|
45
|
+
context 'cookies?' do
|
46
|
+
should 'empty' do
|
47
|
+
assert_equal false, @c.cookies?
|
48
|
+
end
|
49
|
+
should 'set' do
|
50
|
+
@c.cookies['foo'] = 'bar'
|
51
|
+
assert_equal true, @c.cookies?
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
context 'cookie_string' do
|
56
|
+
setup { @c.cookies['foo'] = 'bar' }
|
57
|
+
should 'one' do
|
58
|
+
assert_equal 'foo=bar', @c.cookie_string
|
59
|
+
end
|
60
|
+
should 'two' do
|
61
|
+
@c.cookies['one'] = 'two'
|
62
|
+
assert @c.cookie_string.split(', ').include?('foo=bar')
|
63
|
+
assert @c.cookie_string.split(', ').include?('one=two')
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
end
|
68
|
+
|
69
|
+
context 'bad request type' do
|
70
|
+
should 'fail with message' do
|
71
|
+
begin
|
72
|
+
HttpSession.use('localhost', false, TEST_SERVER_PORT).request('/', {}, :foo)
|
73
|
+
rescue ArgumentError => e
|
74
|
+
assert_equal('bad type: foo', e.message)
|
75
|
+
else
|
76
|
+
fail 'nothing was raised'
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
context 'server' do
|
82
|
+
teardown { stop_server }
|
83
|
+
|
84
|
+
context 'basic' do
|
85
|
+
setup { start_server { |server| server.mount_proc('/ping', Proc.new { |req, resp| resp.body = 'pong' }) } }
|
86
|
+
should('get_request_url') { assert_equal 'pong', HttpSession.get_request_url("http://localhost:#{TEST_SERVER_PORT}/ping").body }
|
87
|
+
should('use/request') { assert_equal 'pong', HttpSession.use('localhost', false, TEST_SERVER_PORT).request('/ping').body }
|
88
|
+
should('post_request_url') { assert_equal 'pong', HttpSession.post_request_url("http://localhost:#{TEST_SERVER_PORT}/ping", {'foo' => 'bar'}).body }
|
89
|
+
should('use/request post') { assert_equal 'pong', HttpSession.use('localhost', false, TEST_SERVER_PORT).request('/ping', {}, :post, {'foo' => 'bar'}).body }
|
90
|
+
|
91
|
+
should 'close' do
|
92
|
+
assert_equal 'pong', HttpSession.get_request_url("http://localhost:#{TEST_SERVER_PORT}/ping").body
|
93
|
+
sesn = HttpSession.get('localhost', false, TEST_SERVER_PORT)
|
94
|
+
assert_not_nil sesn
|
95
|
+
assert_equal true, sesn.handle.started?
|
96
|
+
sesn.close
|
97
|
+
assert_equal false, sesn.handle.started?
|
98
|
+
end
|
99
|
+
should 'delete' do
|
100
|
+
assert_equal 'pong', HttpSession.get_request_url("http://localhost:#{TEST_SERVER_PORT}/ping").body
|
101
|
+
sesn = HttpSession.get('localhost', false, TEST_SERVER_PORT)
|
102
|
+
assert_not_nil sesn
|
103
|
+
sesn.close
|
104
|
+
sesn.delete
|
105
|
+
sesn = HttpSession.get('localhost', false, TEST_SERVER_PORT)
|
106
|
+
assert_equal nil, sesn
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
context 'redirect' do
|
111
|
+
setup do
|
112
|
+
start_server do |server|
|
113
|
+
server.mount_proc('/ping', Proc.new { |req, resp| resp.body = 'pong' })
|
114
|
+
server.mount_proc('/redir', Proc.new { |req, resp| resp.set_redirect(::WEBrick::HTTPStatus::Found, "http://localhost:#{TEST_SERVER_PORT}/ping") })
|
115
|
+
end
|
116
|
+
end
|
117
|
+
should('work') { assert_equal 'pong', HttpSession.get_request_url("http://localhost:#{TEST_SERVER_PORT}/redir").body }
|
118
|
+
end
|
119
|
+
|
120
|
+
# context 'redirect without host' do
|
121
|
+
# setup do
|
122
|
+
# start_server do |server|
|
123
|
+
# server.mount_proc('/ping', Proc.new { |req, resp| resp.body = 'pong' })
|
124
|
+
# # note: webrick is smart and converts this to a properly-formed redirect with http://host:port
|
125
|
+
# # and it does it if I set the headers directly too... so there doesn't seem to be any way to
|
126
|
+
# # exercise our bad-webserver-redirect-handling code using webrick...
|
127
|
+
# server.mount_proc('/redir', Proc.new { |req, resp| resp.set_redirect(::WEBrick::HTTPStatus::Found, "/ping") })
|
128
|
+
# end
|
129
|
+
# end
|
130
|
+
# should('work') { assert_equal 'pong', HttpSession.get_request_url("http://localhost:#{TEST_SERVER_PORT}/redir").body }
|
131
|
+
# end
|
132
|
+
|
133
|
+
context 'redirect 10x' do
|
134
|
+
setup do
|
135
|
+
start_server do |server|
|
136
|
+
redircount = 0
|
137
|
+
server.mount_proc('/ping', Proc.new { |req, resp| resp.body = 'pong' })
|
138
|
+
server.mount_proc('/redir', Proc.new { |req, resp|
|
139
|
+
where = redircount < 9 ? 'redir' : 'ping' # add one for the last redirect to the ping
|
140
|
+
redircount += 1
|
141
|
+
resp.set_redirect(::WEBrick::HTTPStatus::Found, "http://localhost:#{TEST_SERVER_PORT}/#{where}")
|
142
|
+
})
|
143
|
+
end
|
144
|
+
end
|
145
|
+
should('work') { assert_equal 'pong', HttpSession.get_request_url("http://localhost:#{TEST_SERVER_PORT}/redir").body }
|
146
|
+
end
|
147
|
+
|
148
|
+
context 'redirect 11x' do
|
149
|
+
setup do
|
150
|
+
start_server do |server|
|
151
|
+
redircount = 0
|
152
|
+
server.mount_proc('/ping', Proc.new { |req, resp| resp.body = 'pong' })
|
153
|
+
server.mount_proc('/redir', Proc.new { |req, resp|
|
154
|
+
where = ((redircount < 10) ? 'redir' : 'ping')
|
155
|
+
redircount += 1
|
156
|
+
resp.set_redirect(::WEBrick::HTTPStatus::Found, "http://localhost:#{TEST_SERVER_PORT}/#{where}")
|
157
|
+
})
|
158
|
+
end
|
159
|
+
end
|
160
|
+
# should 'fail' do
|
161
|
+
# assert_raise(Net::HTTPError) do
|
162
|
+
# HttpSession.get_request_url("http://localhost:#{TEST_SERVER_PORT}/redir")
|
163
|
+
# end
|
164
|
+
# end
|
165
|
+
# assert_raise can only check instance, not message... so we do this much longer thing instead:
|
166
|
+
should 'fail with message' do
|
167
|
+
begin
|
168
|
+
HttpSession.get_request_url("http://localhost:#{TEST_SERVER_PORT}/redir")
|
169
|
+
rescue Net::HTTPError => e
|
170
|
+
assert_equal('Redirection limit exceeded', e.message)
|
171
|
+
else
|
172
|
+
fail 'nothing was raised'
|
173
|
+
end
|
174
|
+
end
|
175
|
+
end
|
176
|
+
|
177
|
+
context 'sent cookie' do
|
178
|
+
setup do
|
179
|
+
start_server do |server|
|
180
|
+
server.mount_proc('/ping', Proc.new { |req, resp|
|
181
|
+
resp.cookies << ::WEBrick::Cookie.new('foo', 'bar')
|
182
|
+
resp.body = 'pong'
|
183
|
+
})
|
184
|
+
end
|
185
|
+
end
|
186
|
+
should 'be received' do
|
187
|
+
assert_equal 'pong', HttpSession.get_request_url("http://localhost:#{TEST_SERVER_PORT}/ping").body
|
188
|
+
assert_equal 'bar', HttpSession.get('localhost', false, TEST_SERVER_PORT).cookies['foo']
|
189
|
+
end
|
190
|
+
end
|
191
|
+
|
192
|
+
context 'sent/expected cookie' do
|
193
|
+
setup do
|
194
|
+
start_server do |server|
|
195
|
+
# set a cookie when you go to /get
|
196
|
+
server.mount_proc('/get', Proc.new { |req, resp|
|
197
|
+
resp.cookies << ::WEBrick::Cookie.new('foo', 'bar')
|
198
|
+
resp.body = 'hereyago'
|
199
|
+
})
|
200
|
+
# check if the cookie was sent back when you go to /check, and return 'set' or 'BAD' in the body indicating
|
201
|
+
server.mount_proc('/check', Proc.new { |req, resp|
|
202
|
+
resp.body = req.cookies[0].name == 'foo' && req.cookies[0].value == 'bar' ? 'set' : 'BAD'
|
203
|
+
})
|
204
|
+
end
|
205
|
+
end
|
206
|
+
should 'be received and sent back' do
|
207
|
+
assert_equal 'hereyago', HttpSession.get_request_url("http://localhost:#{TEST_SERVER_PORT}/get").body
|
208
|
+
assert_equal 'set', HttpSession.get_request_url("http://localhost:#{TEST_SERVER_PORT}/check").body
|
209
|
+
end
|
210
|
+
end
|
211
|
+
|
212
|
+
context 'ssl with self signed cert' do
|
213
|
+
teardown do
|
214
|
+
# make sure everything's forgotten about these, since we keep changing important ssl connection stuff here...
|
215
|
+
sesn = HttpSession.get('localhost', true, TEST_SERVER_PORT)
|
216
|
+
sesn.close
|
217
|
+
sesn.delete
|
218
|
+
end
|
219
|
+
|
220
|
+
context 'with verification disabled' do
|
221
|
+
setup do
|
222
|
+
HttpSession.ssl_verify_mode = OpenSSL::SSL::VERIFY_NONE
|
223
|
+
start_server(true) { |server| server.mount_proc('/ping', Proc.new { |req, resp| resp.body = 'pong' }) }
|
224
|
+
end
|
225
|
+
should('work') { assert_equal 'pong', HttpSession.get_request_url("https://localhost:#{TEST_SERVER_PORT}/ping").body }
|
226
|
+
end
|
227
|
+
|
228
|
+
context 'with verifying ca set' do
|
229
|
+
setup do
|
230
|
+
HttpSession.ssl_ca_file = File.expand_path('../ssl/ca.crt', __FILE__)
|
231
|
+
start_server(true) { |server| server.mount_proc('/ping', Proc.new { |req, resp| resp.body = 'pong' }) }
|
232
|
+
end
|
233
|
+
should('work') { assert_equal 'pong', HttpSession.get_request_url("https://localhost:#{TEST_SERVER_PORT}/ping").body }
|
234
|
+
end
|
235
|
+
|
236
|
+
context 'with default ca bundle' do
|
237
|
+
setup { start_server(true) { |server| server.mount_proc('/ping', Proc.new { |req, resp| resp.body = 'pong' }) } }
|
238
|
+
should 'fail verification' do
|
239
|
+
begin
|
240
|
+
HttpSession.get_request_url("https://localhost:#{TEST_SERVER_PORT}/ping")
|
241
|
+
rescue OpenSSL::SSL::SSLError => e
|
242
|
+
assert_match(/certificate verify failed/, e.message)
|
243
|
+
else
|
244
|
+
fail 'nothing was raised'
|
245
|
+
end
|
246
|
+
end
|
247
|
+
end
|
248
|
+
|
249
|
+
end
|
250
|
+
|
251
|
+
context 'when monitoring socket accepts' do
|
252
|
+
setup do
|
253
|
+
# start a server that counts each time it accepts a socket connection
|
254
|
+
@acpt_count = 0
|
255
|
+
start_server(false, {:AcceptCallback => Proc.new { |sock| @acpt_count += 1 }}) do |server|
|
256
|
+
server.mount_proc('/ping', Proc.new { |req, resp| resp.body = 'pong' })
|
257
|
+
end
|
258
|
+
# make sure client connection is fresh
|
259
|
+
@sesn = HttpSession.use('localhost', false, TEST_SERVER_PORT)
|
260
|
+
@sesn.close if @sesn.handle.started?
|
261
|
+
end
|
262
|
+
teardown do
|
263
|
+
@sesn.close
|
264
|
+
end
|
265
|
+
|
266
|
+
should 'still have an open handle and reuse it via keepalives' do
|
267
|
+
assert_equal false, @sesn.handle.started?
|
268
|
+
assert_equal 0, @acpt_count
|
269
|
+
assert_equal 'pong', @sesn.request('/ping').body
|
270
|
+
assert_equal true, @sesn.handle.started?
|
271
|
+
assert_equal 1, @acpt_count
|
272
|
+
assert_equal 'pong', @sesn.request('/ping').body
|
273
|
+
assert_equal true, @sesn.handle.started?
|
274
|
+
assert_equal 1, @acpt_count
|
275
|
+
end
|
276
|
+
|
277
|
+
should 'disable keepalive with connection close' do
|
278
|
+
assert_equal false, @sesn.handle.started?
|
279
|
+
assert_equal 0, @acpt_count
|
280
|
+
assert_equal 'pong', @sesn.request('/ping', {'connection' => 'close'}).body
|
281
|
+
assert_equal true, @sesn.handle.started?
|
282
|
+
assert_equal 1, @acpt_count
|
283
|
+
assert_equal 'pong', @sesn.request('/ping').body
|
284
|
+
assert_equal true, @sesn.handle.started?
|
285
|
+
assert_equal 2, @acpt_count
|
286
|
+
end
|
287
|
+
|
288
|
+
end
|
289
|
+
|
290
|
+
# TODO: test retry_limit
|
291
|
+
end
|
292
|
+
end
|