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/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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
41
+ PS6MYksjuwC3SCYkB+gS5CZ3bVbZrPiqFnnWz8KZzpOgeOepTrDn5N2B5suSBB1k
42
+ Ecn8HgPKCuN5V78so5BA68KjQAAfiu3naDUCNQTvetH025Pj+GSekwcYf6iU4wGv
43
+ Na9V8WeGOA1FtTuCvj4005KiVSYjyzJzohIYgSUDNIk+4nuWQN6pTQfndcmkt7GF
44
+ nNcOmyPTosyVPBPGwIjTsgYC1/t7f0RVN24Fzc/58eCXfQovS/h7jXMCWNqvisM8
45
+ wLbTQqcvHeJZf0zp2ekEUuNmbCpcWU7I3BQ+nqQ0UwW03dh5L1SG3AmnQmgy0krC
46
+ zMT54WN73o4CxqthpsG3h19ij/VHLfL/IROZgIPn0YzeJpdFDlmU3Csq8s0jiNBa
47
+ /fwnsAt/vmstD16pz7k8IYsb38UQUVn0XLc6nM7WHbEbuk67cJ0STsHf/MfSxD7Y
48
+ i5pJa8OPaYUTPWsGCKOC9OLUStVI/lko6J0FFqNAreO0pnfy3BgFS/B/NmeN2JtG
49
+ pOeXBlB52tIKrB7sHe9L361a+CQtXLhy5G41HwoWcTqinUXdC+vqYKkTzmVQR0aj
50
+ +qT9k8taY69plZsG0QjeazHDDtkmZ4drzDNGUCOgHTzVtWs6iuKxQqLPcPgMOEn5
51
+ L3aZrhrM/M8f1DPokJgVYpdoJ2hv8x3X9TqHLMYXF+5GaQ5FefWbxP5BkxP8Bh8g
52
+ fei75Cyy4gvU+P1M/38RPFsFlugVnE4pYK58218KuC69UGQuc+i1/dC577u6hVDW
53
+ lyvHdOb/aB6awjmd0zD9jgji/Ee6FOqLLkMoFMKKSA6wTd3cgnkOb5qam9oVMixV
54
+ -----END RSA PRIVATE KEY-----
@@ -0,0 +1,31 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIFVzCCAz8CAQEwDQYJKoZIhvcNAQEFBQAwfjELMAkGA1UEBhMCVVMxEzARBgNV
3
+ BAgMCkNhbGlmb3JuaWExFjAUBgNVBAcMDVNhbiBGcmFuY2lzY28xFTATBgNVBAoM
4
+ DFRlc3QgQ29tcGFueTEUMBIGA1UECwwLRGV2ZWxvcG1lbnQxFTATBgNVBAMMDGxv
5
+ Y2FsaG9zdCBDQTAeFw0xMTA2MjUwODQyMzJaFw0yMTA2MjIwODQyMzJaMGUxCzAJ
6
+ BgNVBAYTAlVTMRMwEQYDVQQIDApDYWxpZm9ybmlhMRYwFAYDVQQHDA1TYW4gRnJh
7
+ bmNpc2NvMRUwEwYDVQQKDAxUZXN0IENvbXBhbnkxEjAQBgNVBAMMCWxvY2FsaG9z
8
+ dDCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANJpbZZ8Op7qqGUM9Nfr
9
+ 2xXP2m1sLwJBd3TuJW5T7RL9BuyzxLu8tbEz++eWqy3sEKKgzMaBermBLMVp2E1/
10
+ 8dI7Ek2vDUYHGnlK3qf9fbdnUPiBdNRAyVU/pxoUHRRFXQ4Y7kNl2ed45pAV+OE4
11
+ 1Qc4LLRF3cwQqbrgMCmt8KgzCy/eJfkH44fRjpUSFzu/O20sn95MuamK72SPewSg
12
+ TOHSQyEL1GzHn4d1Yct5Zan9j00uCOrcaUulpxqGz4dBrhhC48UKVgVfHBC9qJRr
13
+ YEyywW4MQnKFFBBc7AEtfIgMbeKThkGnH9B0Z4WI2rGjZVXv+g2nyIvL0VEdeu2N
14
+ zfQxrrPg1j5sQ6OLu2nO2iiQMVz37ud/9KfT+4tuiRaPQGi9RCrhy0fZJQLr+c2I
15
+ M/UrmrJ9oA7FXwvZTc81fOX6fWPKix1oPxSIsykSPSZnqfyc/01/anEH1PMbPZB6
16
+ NYtA4549adFlv7yIyJTm3o9/H3U9UdN+7wco4TqspdZ4tGEKLTjOB58L1bfFPLlH
17
+ NgOfNKExcnY/pdwGgp42AxF8cbk8BOvNsHVrgUEYbpykpBYifJbYihSnmgwxbRUN
18
+ MTCrbd5oGrs+eGkTDe/TMZO1BoWnhm7TVsNdJFuzqapnOLjM0EDHqgX+en2A7430
19
+ N5H777EGXMHWrLSTns7V/hrJAgMBAAEwDQYJKoZIhvcNAQEFBQADggIBAFxLZ5XL
20
+ 4GP0rKRQvahUyaamyN1GMH81t6hQ0SNpsJpq7Ekl7snHdYeBORqcpUhVsrp3I1At
21
+ 0C8hOFcdANo5V67VqgJkK2X+TW9vyz3Z2yZG3pOCEuHpJs3w1atA/6en/8LnTCqh
22
+ SWCqOqeaM9Vs9yb/pv5WH3ir0Ua7X7N9U7xujUwblMWjsBouhBfEQrg1CVvwAu8G
23
+ XRU42Vmkj787RBAIAxIbfADbcxPpTHL3ZFmZwTIYSx87AV0caUQY2x51Y+VBXJ5o
24
+ 7J/l+beLjlAMf65X6nGp4wzpywzblwzCMMgYdHgJlXOtSQ1INnPvh7oohGHjJGQQ
25
+ HsKNAWQQjiFQTk6Yq0TvOW/fCTjcIF9ziwMa5blCbVGIZ7u70moN6FhOvAULb0pa
26
+ 2ABtGQZzhjZL29qnDKwCeVAOGUaXfueLM7VERUlqoWjkXeyPvOH3pEb0YarYKeE1
27
+ wW2Qdz8UrhUqNoa1lV2ABAvMIZfJ/FUaiuoY8ifvpaMgcr3uQEq6ll/52sK2Fh41
28
+ zfcjjmG4Ne1TRNwK+OzGAsvSutGHCgVlyFtzgGwaZrLkpcDCp/eeU68xG1T3MQuH
29
+ UbxQXzxVIgnCAWfY5grs0kC00tWXZWkXfeNQ8qK+QCpn/W8/gQu1bnhHR2gnKuRR
30
+ IpLcSuP5rwtQcfwJwlc2TF6BLDc36qitzJO7
31
+ -----END CERTIFICATE-----
@@ -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-----
@@ -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