http_session 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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
+ 4sPl5JJ3ceXW+xqKmozeI5hxiAeIcmvfLoMO4IHpKNDGMt/yO4zlEN8IPt3i1tgL
6
+ xE5NjtqwyL/zzp1s5OsOXVkwHwpznDUsMYF30gpRTLoVCxV91Px56AFJgQGJ31lm
7
+ LU7Qq/XrRVx0Z1CMjwr7dMrDIY3+KF+4PEMvYz5Ms0C95yXZkzyt6MQOW7qSdvHG
8
+ MmMMX3tgAxIv9uvm3j/S78upaMnefcp2LpID6MUgtwLxl7r3VNsB/u/GJYaDGRYK
9
+ 4+ByEfZsC+ktv0HXBTYJJUXt6n8o3unDF4NvNhksQG5Lhn9+hrAShqng3ItdxVbS
10
+ Dof5ARGknjrYAB5tHNitnhDZ60EGkguST9z/D3ux3Pzm6EooRPJLsAMRpT/N9ld+
11
+ AYFqf6oiJFFfM0zu7dIy5OcgNNpJqnl+5Zx6OK20TlsPZuTib7mDdqSIjPsTu9fK
12
+ 9Bsuf2DEVYFg2MF3vlmFH2AkAYz9Ic+/PXKUeNRGX0dDRsmCgn7ZgattfY5ex83L
13
+ Z8tCT8zyBj+BQajtE+B8bku7Sz6V35qvPdrvn5A7JJMVNopqfIIAHOb0S6OWy9Wq
14
+ SsiD90B9QzFGat+3eoP4/pFiPnkpyZptzdxlyVWHvP66klQYnV9foW/cdsbCIQ6b
15
+ /xiMEQBmJIU+0OPykh8NAG4SypN2PwnZwlyoX6MmYBkvuYCh6i0euo5kiFSeGD+X
16
+ oCbMGkrXFAPb1AGZBbLOc3p0eolPrelD3VygmB5JTWfM79JcFVXtLBp3/7lu5xKM
17
+ WGDlwUkMlXV87andaqItNuWJU7RdTrFt2eh5d9jEANxj6zYC3O/U9YECzzo4ZSrR
18
+ Onmr4QUNDIjO5svjZuKL/pipQSz3D0/X2zaAiq+BJEabZNPwfhAHl+MtJG5yqRHU
19
+ ERIXvdvrACVv1swsS5SrIIwyyzsjmYXMlCoIp04MdIiTFtjUHHWGch6HHUA/CKQs
20
+ 6bq7EaC1enJpi445ddkfYeB+1Pxm1qMYf1La1QC7lt5Vsj4w5fXZ+SAyW9zxx4Kg
21
+ VCX6y4ZPfNgkfJWcxRU5VigqBOVxcumGRzCBbdF5WMaGKTw4ww2M0XtBsb6JGdX6
22
+ nt9CHZVH+IyT6NS3oL/5Y3OS0v6TPigyqLusnG9EysZB/9zdhNB3WmnSrEPzAJvi
23
+ 5kKq7cQxy188h+FvLG2qVZFs4GDAK9733BPWlEKYDp8HjsRKoeIymSkc5wbOYUcV
24
+ t+cG+kvet22B5jnPvdZbMr/cOTnAuq7gmir2CjF8MjS/Gv1vLjBg875e3RATlHWE
25
+ nYS5aGP9a/fmrzeKnaf4SK26CPQe+ohgudkM1EMwbzcX/GjZQuBv+FS+8aY9M2qL
26
+ ZhUsRGQ6qIYxQtWy4qYmV3uc4sC4zw5Ju+L9Yu6jAEMGoK3hlghG4puLZkX3vlAh
27
+ XwRFtNPYHONXyARR8TN2nckmMTIj7fKFV/0Bm7xYvvTm0Zz8i0D4q9I5v9efvlLF
28
+ cgfY41bQMeg92maJDHLDndoHC6C8L1XJnsz7CiK3YL/B0PjkKz5jO4Vx50roUgbG
29
+ 4OlQrRMhGxZuovT6Oq0I1jlJYTUqjTCCuMxkEpmpPd5TDpVGjr65YqWp4o/DXdr8
30
+ eMSxJvz8w96dY0oFIhESzWbk+e1yT4hMCr5x7ITsHzXSf0zmbliMLgFIreUiOWFJ
31
+ 6k4r7mLuBMDWfLRJWi5J0ZX3J8MA9HzIjwzjPoCcu5Wf1Y+ROiO/QF5DaIlA1mup
32
+ H+iyeMtdHqPiT2c709Moj7wSgy2tLmsp5+QV5/E1YWJmJiuxeUD578tfRjpb6R6P
33
+ wPZoPMGfkMpYOKNnF45mjiJlIfi8Paveb8NoJ6Vq/yUDsS1DpkptuWzomuIlH3po
34
+ 0ooMvNYtuPTAbfYsVh2GozW0kGOJBRhGHZIY64kMQ3gNp1cEUg6LyEEPF16i6Tqu
35
+ aC2aIWHy7zMH1+A396YTcCbVYHr/ZvvjycDf8lwX87pmg2+FotykAmq3nwdJoFRd
36
+ 8pzPrTKjE+HbUJqEShzZC/Lf3ft1lUSTM5U7xhB6SjKSc1/aATosdCWySLi5RbCi
37
+ VUYBGeqzY77WunxOCmciUjrvLlEP8vsqW3CG8drhOibFqcdvyR1aEGUtL7AJecXR
38
+ dnLF46//lEE/iNOHrq6CK7v10lGTb0lO2i+A82A6c3sM0NK1chn1hiwNiZx2cIET
39
+ KS31GbRdlFsT97wy993kZ+DSTEzlRPP1KciFPN8mdB/wF5LwhMTTYaIxRVXWMrFj
40
+ vDeWKbXYcZAHjrX2QD/G9J4YuqtEGj/z9/wo0DRZQ/FbSFIyK+iDVGtE5hOJ0D2s
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