http_session 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
+
MIIFzzCCA7egAwIBAgIJAO8zD/BC+rdSMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNV
|
3
|
+
BAYTAlVTMRMwEQYDVQQIDApDYWxpZm9ybmlhMRYwFAYDVQQHDA1TYW4gRnJhbmNp
|
4
|
+
c2NvMRUwEwYDVQQKDAxUZXN0IENvbXBhbnkxFDASBgNVBAsMC0RldmVsb3BtZW50
|
5
|
+
MRUwEwYDVQQDDAxsb2NhbGhvc3QgQ0EwHhcNMTEwNjI1MDg0MTU1WhcNMjEwNjIy
|
6
|
+
MDg0MTU1WjB+MQswCQYDVQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQG
|
7
|
+
A1UEBwwNU2FuIEZyYW5jaXNjbzEVMBMGA1UECgwMVGVzdCBDb21wYW55MRQwEgYD
|
8
|
+
VQQLDAtEZXZlbG9wbWVudDEVMBMGA1UEAwwMbG9jYWxob3N0IENBMIICIjANBgkq
|
9
|
+
hkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA1AOLIPgIWKlS+uJhEUjdmLWZZYC308Kc
|
10
|
+
Yw+mJu1SchmfEqLPzp7pA2T3zkboHHpFhYx8kj+0vQPLzhcO0IfGckgiJjNdh8+m
|
11
|
+
yaUMtgKfx762EkqkmWaLL27OMvGI/ZmAIevuJAiLtKdgv5d+rKBKDMFbEzCauXwF
|
12
|
+
5Z6YbW/Ssx8VcG4Hb4SY7ivVMYWLgeh2V53rHRour+c6Vx8Yh2SOUTI+t6FBMH9N
|
13
|
+
V3l4bigs0kEJj5ApqIRpoNvVL8dJOUyZKIVxkVmyidmgRqOLAS8ZjQbyVb6CXRDg
|
14
|
+
Cm5DDmWiKRbTEBoPGRrDjgqkMwpYH9HPoElZQrbfeUf3LbIA5p6bIx55VXVf63HF
|
15
|
+
lOb61KTfyzQ9yBmjwAG7YTCzCZ5yNChgiYdnZJs7ELlU9zKI6cGHPwIJnAq0YPOo
|
16
|
+
FtOpQd5BJcVJ14efdAkrrNvbrdkhozRCorkIc91USEQCooXLeBVYuJw7Xl1t/FTx
|
17
|
+
Ne3iLtGzdX4h7gowoqsNF3IdE0FG/mG/1AQU44dTOYZiBnubZcPSnC0elWPkrZZb
|
18
|
+
AJ6ifDYGITv9gBj0+Z+yArGdcorrieobHWlGgkPTpsfn2E+gdXNY7CcmJIz+7Up9
|
19
|
+
2c2spER6J9hKzhIBReto0YCT5aM7wgB0U+phSMQcR0ZP9TxN58Yhl3rFjpEVS81G
|
20
|
+
u90GC5Y/uEsCAwEAAaNQME4wHQYDVR0OBBYEFAuZ6H1rDg57x2XJ1TkwCjJeXNVp
|
21
|
+
MB8GA1UdIwQYMBaAFAuZ6H1rDg57x2XJ1TkwCjJeXNVpMAwGA1UdEwQFMAMBAf8w
|
22
|
+
DQYJKoZIhvcNAQEFBQADggIBAG0jdL4a6hC7j4oNTbNtbNib1ZvN3OzXH242Fa1o
|
23
|
+
N28LuMCYWOFzans7EPCdvxGzXI25cNXpv3qFv6HxVOVjF8Stl9T5+AQ4H0lcWjXv
|
24
|
+
1a/MoBn2MuxoDd95jPSTz8IycGKrJu0PpkOH5DKRbFq6ocQDQNN2Mhvzv6FciAxo
|
25
|
+
5rPE2R/XAk/QM0JbYBe/2wERc7S+yvrasrc4OQxoNmN9Q2AEXp62FKXxl3ksY8B1
|
26
|
+
VmN0OM3uNEXAtk5akc1/wZZ8vTJKwk3LwN73Pba4nD78qJWScCfbmrOkPncp4Tk9
|
27
|
+
84Vf9Ka8PsuKaCwV5Eo4fyeukhZpbyyyawiBYN+gm7/FVyQcr44l9wSvf5TOkaXm
|
28
|
+
IkSt1Izso/X2/Vlx+H48ItAMZxVLNcOjDTqNs1xNvqseLD1JwSIGygjZFB7BVx/a
|
29
|
+
K8+pVMYZNPd9e0xXTuok0ChaTUVWKxCo2qnd+6gZ4MLUNEygAZfjpzWr5RKOYgYx
|
30
|
+
BTGuoMEQTm0n995845pI4iCqgTOgdahBFPhXGgBU9pd2Ggwi5oczsJf5p7z5SCDp
|
31
|
+
DFlbKuip32r4MXSS+vOIbb2+gPxa4kSK8SyPIkbAs1ysZkZqT9qtWE7tGvJrQjbi
|
32
|
+
mDwSIqPcSLNjp1tHWnqQjwsY6/XTbL1V/rsaGxsJan9C9fjNkdyNrSt3uZz4zqTs
|
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
|