right_http_connection 1.2.4 → 1.5.1

Sign up to get free protection for your applications and to get access to all the features.
data/spec/ca/Rakefile ADDED
@@ -0,0 +1,64 @@
1
+ #-- -*- mode: ruby; encoding: utf-8 -*-
2
+ # Copyright: Copyright (c) 2011 RightScale, Inc.
3
+ #
4
+ # Permission is hereby granted, free of charge, to any person obtaining
5
+ # a copy of this software and associated documentation files (the
6
+ # 'Software'), to deal in the Software without restriction, including
7
+ # without limitation the rights to use, copy, modify, merge, publish,
8
+ # distribute, sublicense, and/or sell copies of the Software, and to
9
+ # permit persons to whom the Software is furnished to do so, subject to
10
+ # the following conditions:
11
+ #
12
+ # The above copyright notice and this permission notice shall be
13
+ # included in all copies or substantial portions of the Software.
14
+ #
15
+ # THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
16
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
18
+ # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
19
+ # CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
20
+ # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
21
+ # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
+ #++
23
+
24
+ require 'rubygems'
25
+ require 'rake'
26
+ require 'rake/clean'
27
+
28
+ file "passphrase.txt" do
29
+ File.open("passphrase.txt", "w") { |f| f.puts "foobar" }
30
+ end
31
+
32
+ file "ca.key" => "passphrase.txt" do |t|
33
+ sh("openssl", "req", "-new", "-x509", "-extensions", "v3_ca",
34
+ "-keyout", "ca.key", "-out", "ca.crt", "-days", "1825",
35
+ "-passout", "file:#{t.prerequisites[0]}")
36
+ end
37
+
38
+ file "ca.crt" => "ca.key"
39
+
40
+ file "server.key" do |t|
41
+ sh("openssl", "req", "-new", "-nodes", "-keyout", t.name,
42
+ "-out", "server.csr", "-days", "365")
43
+ end
44
+ file "server.csr" => "server.key"
45
+
46
+ directory "demoCA"
47
+ file "demoCA/index.txt" => "demoCA" do
48
+ sh "touch", "demoCA/index.txt"
49
+ end
50
+ file "demoCA/serial" => "demoCA" do
51
+ File.open("demoCA/serial", "w") {|f| f.puts "01"}
52
+ end
53
+
54
+ file "server.crt" => ["server.csr", "ca.key", "passphrase.txt", "demoCA/index.txt", "demoCA/serial"] do |t|
55
+ sh("openssl", "ca", "-policy", "policy_anything", "-out", t.name,
56
+ "-outdir", ".",
57
+ "-cert", "ca.crt", "-keyfile", "ca.key", "-passin", "file:passphrase.txt",
58
+ "-infiles", "server.csr")
59
+ end
60
+
61
+ task :default => ["ca.crt", "server.crt", "server.key"] do |t|
62
+ sh("cp", *(t.prerequisites + [".."]))
63
+ sh "cp", "ca.crt", "../good.ca"
64
+ end
data/spec/ca/ca.crt ADDED
@@ -0,0 +1,23 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIID6TCCA1KgAwIBAgIJAMbnbxA3pDCfMA0GCSqGSIb3DQEBBQUAMIGqMQswCQYD
3
+ VQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FudGEgQmFy
4
+ YmFyYTEZMBcGA1UEChMQUmlnaHRTY2FsZSwgSW5jLjEVMBMGA1UECxMMQXp1cmUg
5
+ U3ByaW50MRYwFAYDVQQDEw1BenVyZSB0ZXN0IENBMSQwIgYJKoZIhvcNAQkBFhVn
6
+ cmFoYW1AcmlnaHRzY2FsZS5jb20wHhcNMTEwMjAxMDIzNjU2WhcNMTYwMTMxMDIz
7
+ NjU2WjCBqjELMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNV
8
+ BAcTDVNhbnRhIEJhcmJhcmExGTAXBgNVBAoTEFJpZ2h0U2NhbGUsIEluYy4xFTAT
9
+ BgNVBAsTDEF6dXJlIFNwcmludDEWMBQGA1UEAxMNQXp1cmUgdGVzdCBDQTEkMCIG
10
+ CSqGSIb3DQEJARYVZ3JhaGFtQHJpZ2h0c2NhbGUuY29tMIGfMA0GCSqGSIb3DQEB
11
+ AQUAA4GNADCBiQKBgQDha7yTsOMojuy/4RvZqPlPNxQj2AAhEIFONvMcSTXBwlND
12
+ xtOXHzF963LxBrxqOXnCMvfSBnzsfywS6k8dGwBpxoiG420QK6SZ0X3DEwzBXVX7
13
+ jnxQICtMzFO/h/AYhuNbzeAPwzrnRKNhqJGLuKOKga7Z6+ZyyXtKIf2+apjO+wID
14
+ AQABo4IBEzCCAQ8wHQYDVR0OBBYEFL4IVWcPJhd11ajwbIT2va3O5XhpMIHfBgNV
15
+ HSMEgdcwgdSAFL4IVWcPJhd11ajwbIT2va3O5XhpoYGwpIGtMIGqMQswCQYDVQQG
16
+ EwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FudGEgQmFyYmFy
17
+ YTEZMBcGA1UEChMQUmlnaHRTY2FsZSwgSW5jLjEVMBMGA1UECxMMQXp1cmUgU3By
18
+ aW50MRYwFAYDVQQDEw1BenVyZSB0ZXN0IENBMSQwIgYJKoZIhvcNAQkBFhVncmFo
19
+ YW1AcmlnaHRzY2FsZS5jb22CCQDG528QN6QwnzAMBgNVHRMEBTADAQH/MA0GCSqG
20
+ SIb3DQEBBQUAA4GBADbJoPLdHiwR3RQ9mrKUgxdCv14BLvg1UAP6QhU1Y8TIUxAp
21
+ HljbEHYk/B9PoG9GsdxTlnFu7LJVOZB7c+aFOaMyRR4TUUwPm/AGMMFnZMbnecqD
22
+ Y9JV2y0mn10i6er9Lz19CGi9TlOUuNdYKLT9cTCaqaVFPvXk44sNb3/5mrpi
23
+ -----END CERTIFICATE-----
data/spec/ca/ca.key ADDED
@@ -0,0 +1,18 @@
1
+ -----BEGIN RSA PRIVATE KEY-----
2
+ Proc-Type: 4,ENCRYPTED
3
+ DEK-Info: DES-EDE3-CBC,269408AD40EA6D81
4
+
5
+ u6a+jexScTHmtbYnNUSvhxJgpXVN9e/ctKYKBm27qlFraLz+Vnkj0fMW8yHzY+We
6
+ 8517Kl82vytZhTjnU6Elw6RpfgJzs0TnP5OhvLBsmNEXpHymNCcGt7p8jJopHEaa
7
+ 8IT87WqKqryyEjbkEFqCb0QfwLBd9PVT+lQeEcPAHlMkC8lwkjVCAsvJaZ3GsURJ
8
+ Tb5xHOYj0jccm/xrg82e/25emMqTGCBKwb7cTyyKxmL8ezi1vA9jJcf9M7KgNgUA
9
+ FGo7mrCK9niHfOLULD8f3WN+2DHoTwIDXseNWS/giSePQZZupVmWEUtDkt2x9qCb
10
+ nJat/ESncAU1BrqXiYTpdtgao/TXcpt+7w/DMLHbOxus7p9sqZnAcXc/0Y+ZsYF1
11
+ rq0spVpgJfDU6sP0ay61rOf7YnTko0oewiF0/c+dB42XErkM88wupNHJfr+M2Cfg
12
+ w8BQeCx1l14W2haWlTgstBhfGWod76CT7Ng7/927L7P3pJ5ebS7qWRMskJGFMCFV
13
+ 9rd7OjGiYEqB365YI0VUiZPkXE9bXxRyfnU6K7hVtR3kY+TYADEgcaDE+6W1bgOc
14
+ jwEeObdDqRbAR/YD/3myhvRF9k7C/fQ5PqOC3dlQZTXQCAJYCt9aNXkxBnMmh1WS
15
+ GDDUpF9s6lSoUFm+yic4RXNX9Jj5npUKZR1TBqZfHQjzRLxEKxQo6VESa5QEWkM0
16
+ C2Rsmxs/3dXXTJTOrP9rzWhQmxdCz7n4efHEHuMuVXvRtEAFjMrKfcH1t5fFQ8fA
17
+ sBrulv26/ygJFwZrSfq7ILW/AcYFEMmQflLGoVJ8aiSl4oBwIS7FvA==
18
+ -----END RSA PRIVATE KEY-----
@@ -0,0 +1 @@
1
+ V 120201024841Z 01 unknown /C=US/ST=California/L=Santa Barbara/O=RightScale, Inc./OU=Azure Sprint/CN=127.0.0.1
@@ -0,0 +1 @@
1
+ 02
@@ -0,0 +1 @@
1
+ foobar
@@ -0,0 +1,12 @@
1
+ -----BEGIN CERTIFICATE REQUEST-----
2
+ MIIBwTCCASoCAQAwgYAxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlh
3
+ MRYwFAYDVQQHEw1TYW50YSBCYXJiYXJhMRkwFwYDVQQKExBSaWdodFNjYWxlLCBJ
4
+ bmMuMRUwEwYDVQQLEwxBenVyZSBTcHJpbnQxEjAQBgNVBAMTCTEyNy4wLjAuMTCB
5
+ nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAvgzuf4/JyaNK3VC7eijUk0uCtJ6H
6
+ WInYzgrpX/Xxmf0Po6nZ6RlY4YiPL9YtqaPLXuT+GDkDDsOMAZDBFsPbiiiZM4QT
7
+ qW8e1hiM8xg6w/wrf/ofBakjTsik3Oa0kIWCs1cymLsEZJMJsoH9CpoDGUvA47AB
8
+ QVkSq00F6IAF0r8CAwEAAaAAMA0GCSqGSIb3DQEBBQUAA4GBADiV9fCKFAiA9k98
9
+ cgHpVKpLpSGkGXndwyOZO+E0H7rwTtNwW3DM0CKN7z0EpbE4YBtSF+3qOFV2zWJF
10
+ N3dWd2bJWDwfLybtHXWIADKmUXjkoGJfGNoh+APMqNtRLudAXIoDkiJRmBgFizTV
11
+ mA9goBMk2IGpUmMVl778iGD6rBQh
12
+ -----END CERTIFICATE REQUEST-----
Binary file
@@ -0,0 +1,17 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIICxjCCAa6gAwIBAgIJAJYV+DprCQ1CMA0GCSqGSIb3DQEBBQUAMBMxETAPBgNV
3
+ BAMTCE15VGVzdENBMB4XDTExMDkxMzIyNTMxMVoXDTEyMDkxMjIyNTMxMVowEzER
4
+ MA8GA1UEAxMITXlUZXN0Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
5
+ AQCwmvBNrd7t/Z7ZVo1YfimpGgerOn1vXZY+OGJtqo+pN11Ei7dhVQfWBd2dAkYH
6
+ B8NlPr5QyxmIT88JIRKEzk7ZZ+nRdfyoocg63FeLn+b6OeR5hwyK38aMRbhqY1Gq
7
+ aIKMYyEpv0YNbuwoomv5Atl8mwvuUFr2XKndyzsrP1TrTCHH4lA5P0UUzIjVyyz9
8
+ F4YAjGLjjoVO5R02LmZ/h/LqT6bJQ+cu/2JeIWGVnjKoFvyWHd0TOaOGDHlQc5h8
9
+ RxgdOFrjsZGpQ5sKlhcI+9p0LOXqVfoC2J2ZWtAjFo0d54E/OarnBPFB6VNtoSmj
10
+ l0z+OLGMKuDGaLflXNE0STVdAgMBAAGjHTAbMAwGA1UdEwQFMAMBAf8wCwYDVR0P
11
+ BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQAAbVkvPzS59uhX6Ox1ZT92cJXW8yjP
12
+ IyXrZjcWlaKQSKcn8v5RpebtVA+pL6mCActBE8fMac5ixlwTTnF5LHb9v80XuXMe
13
+ MXooQZBliyim5lVCp9gjKZYXEeVDphsuwDr5M4qO7tdZTB1ezCULObVF1N7qMwpO
14
+ yWI6zifRtLsgWmnRyaeVyv2uNRYoAEsAd2Dj4oJjvuyc9U5QUhtsXwD3jvSPsdi6
15
+ Mbr5tVIcZSpT4W9PSiZw2ZUZXIEbxX+w+FsuehhvoFJCi05R1ashCPxQA13bOJK0
16
+ BmbHqeLDzJCK0+kQs8CRIGWGTGng84AyJ5MygGzd0WN9jtZslWTPDtbz
17
+ -----END CERTIFICATE-----
@@ -0,0 +1,18 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIC9TCCAd2gAwIBAgIBAjANBgkqhkiG9w0BAQUFADATMREwDwYDVQQDEwhNeVRl
3
+ c3RDQTAeFw0xMTA5MTMyMzAxMDVaFw0xMjA5MTIyMzAxMDVaMDgxJTAjBgNVBAMM
4
+ HE1haGVuZHJhLUt1dGFyZXMtTWFjQm9vay1Qcm8xDzANBgNVBAoMBmNsaWVudDCC
5
+ ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMcEhrVTKKgWVqTUBCGBWJlD
6
+ u7RIk7kPcGAARy7Ctx+4VReEYlgVRqECzt4itglNdrQkUVCHXE0rwJMOozE8Hsgh
7
+ rAOQvxzPJhG3hPUJf/VkfB+Dn0xRsPvrE90HpRlSqdT8X6iuryPEmp5RyMaY122P
8
+ r/+Xs+lHhRlKQPdRpYXHlOwWX/U56Wy7jjGU9lONBEIEV8tD5ExzkCG23nbCvrFr
9
+ /2c4VjrAwXR2RyYfSDRyc/obky49ydKZ8/HKbS3VdJYAWBI4Wnj2hayCcZggEFB0
10
+ zg/IDXpOjnr6zV5UEfdaMIH4/K44ISX7xmZWGmQ3464NTmykj5xUMmfy3rVNREsC
11
+ AwEAAaMvMC0wCQYDVR0TBAIwADALBgNVHQ8EBAMCB4AwEwYDVR0lBAwwCgYIKwYB
12
+ BQUHAwIwDQYJKoZIhvcNAQEFBQADggEBACmNyOoCvNsz8N3LN47VZK7aev54tjtd
13
+ zJilLgAxEGBeaIvHX9LDkgi3sQAvHMHc3VIq4BoEd9TNtyxIrUdc2EG1TCJvHINP
14
+ 7YoHtbajvT3bhVLlnWjB7jHp9jNfZtHL7aEDp+5eqPT6wzaVeiu1nABs7gudCQq1
15
+ CJw0Mfz1U3mG0sTb5JlRt7toce9dW0R6jfYTmTj6Yzu3kcgYjQKy2k2BCInLOIhz
16
+ 6tyOH51mCGAy1zgcWMvuyKYCeJQxRd46GrR2peyE2wYY6SfSlrK16pjaz48S3uhI
17
+ 01jd+HA1LARcImMhkMa/QFTo4uI7lx9Q+Y06Ny+rMuTNSnBSIgCUPQk=
18
+ -----END CERTIFICATE-----
@@ -0,0 +1,27 @@
1
+ -----BEGIN RSA PRIVATE KEY-----
2
+ MIIEpAIBAAKCAQEAxwSGtVMoqBZWpNQEIYFYmUO7tEiTuQ9wYABHLsK3H7hVF4Ri
3
+ WBVGoQLO3iK2CU12tCRRUIdcTSvAkw6jMTweyCGsA5C/HM8mEbeE9Ql/9WR8H4Of
4
+ TFGw++sT3QelGVKp1PxfqK6vI8SanlHIxpjXbY+v/5ez6UeFGUpA91GlhceU7BZf
5
+ 9TnpbLuOMZT2U40EQgRXy0PkTHOQIbbedsK+sWv/ZzhWOsDBdHZHJh9INHJz+huT
6
+ Lj3J0pnz8cptLdV0lgBYEjhaePaFrIJxmCAQUHTOD8gNek6OevrNXlQR91owgfj8
7
+ rjghJfvGZlYaZDfjrg1ObKSPnFQyZ/LetU1ESwIDAQABAoIBAB23pU3KHxYKT+HI
8
+ 7tz57XrlTE/9TmGh1ovfPsHSvXl1Eu+yCuVQN/2u56jv0fLNqF351lKKA9RaJiVP
9
+ WDrv2UDVFlRp9r+chvi6SJY2Vu8TlB04kD7bK+xSC+NDUvnXCBkPnlEX1HsozlW5
10
+ rJtLE0/+1q75vhmlXlCKb+z+OhMhmFnaWTf/xLNbkItO5tOf+mv/CoqBUSEk+i9t
11
+ O6Zjzh02jbpW7xH3jJ/UexKMYOuqxoOMfC/MI6q3Qcu2OeZgl8cEIi94sjafq9ob
12
+ WcFTrZY+YG5b1SE8ILg69Fkqve5d2Mn1sN8mYZxLeM0C/ATNghM5uSWhdze06bNu
13
+ fpcgvOECgYEA/L+J/xVgUySUByELEBosY8q0HYG5Msq+GT7L5GMIoEmEp4j6MPRu
14
+ kF/DihxefcvDyVRLhJh7o/kwR7Vwe4wP9145e3MOe9b7IH6pEwV0nAsBO6ldVToX
15
+ gvrHOIoySNt/XtRurrbtZ08OtUDCLIRQATTnY9ieh8sxTyl1G9GehoMCgYEAyZQE
16
+ r4ByBzXjTiuaODH6tPndbKFxRo2iis9CyxqYXAMDkjvF4NEpQyW5ucRxpRqTt51P
17
+ kR13jdadnOF4t82M0qqEH3G6H4biKisY1jXRNH7mPSbyPbC4vxrQhnAEF3RiqbXz
18
+ f2LUC4uOtLzW7HeyjEiZy2mg7UKdOfsmmJ//oJkCgYEAxZF/8GqoQjW8lJoKyMp8
19
+ 2oDQLKSDvSVoVdmVjfCwBIOTc1aKpAveBXMmKealIlZOtCj1Yy/CrlmSmOtGgvzo
20
+ WihIbKxyrPFOmocH6PuBvJyJmTZ5464mRNd9NUApsHQL63fJET+i8feFer+lSSEg
21
+ XOEa4xyoR2PZJpU0mstPzLsCgYBvcS3F+TURV3F7Xg+80aTROPJ5hCej4dni9ALx
22
+ Vpq1A9WNmw4i5H/zZ3/ue/R4WuEfuhCrIade+y/X869RrooUTcENwUos891Fgt4Q
23
+ T2CBrUaMuGNkR7dbr+9o47TfYrDJMpaT7odceqNCuMP5p5NGizy7gII/qXxS+c60
24
+ woAIwQKBgQCiIfXZtAgYTPL23CQrxIMFwnlO0TiOe0ha0et7hjCh/CStG7NET7KK
25
+ U1L1kfyl1YDgoJbLXTsG2WwGZRnK1oyEEFj2iY5EvwoMPr0Sv8/CiOIyEfC62s3V
26
+ MoHemunnFhAj+JAy2HTKV0VYiNNNAxz3CBG8yMLK7YAMgPw1/HQQLQ==
27
+ -----END RSA PRIVATE KEY-----
data/spec/good.ca ADDED
@@ -0,0 +1,23 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIID6TCCA1KgAwIBAgIJAMbnbxA3pDCfMA0GCSqGSIb3DQEBBQUAMIGqMQswCQYD
3
+ VQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FudGEgQmFy
4
+ YmFyYTEZMBcGA1UEChMQUmlnaHRTY2FsZSwgSW5jLjEVMBMGA1UECxMMQXp1cmUg
5
+ U3ByaW50MRYwFAYDVQQDEw1BenVyZSB0ZXN0IENBMSQwIgYJKoZIhvcNAQkBFhVn
6
+ cmFoYW1AcmlnaHRzY2FsZS5jb20wHhcNMTEwMjAxMDIzNjU2WhcNMTYwMTMxMDIz
7
+ NjU2WjCBqjELMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNV
8
+ BAcTDVNhbnRhIEJhcmJhcmExGTAXBgNVBAoTEFJpZ2h0U2NhbGUsIEluYy4xFTAT
9
+ BgNVBAsTDEF6dXJlIFNwcmludDEWMBQGA1UEAxMNQXp1cmUgdGVzdCBDQTEkMCIG
10
+ CSqGSIb3DQEJARYVZ3JhaGFtQHJpZ2h0c2NhbGUuY29tMIGfMA0GCSqGSIb3DQEB
11
+ AQUAA4GNADCBiQKBgQDha7yTsOMojuy/4RvZqPlPNxQj2AAhEIFONvMcSTXBwlND
12
+ xtOXHzF963LxBrxqOXnCMvfSBnzsfywS6k8dGwBpxoiG420QK6SZ0X3DEwzBXVX7
13
+ jnxQICtMzFO/h/AYhuNbzeAPwzrnRKNhqJGLuKOKga7Z6+ZyyXtKIf2+apjO+wID
14
+ AQABo4IBEzCCAQ8wHQYDVR0OBBYEFL4IVWcPJhd11ajwbIT2va3O5XhpMIHfBgNV
15
+ HSMEgdcwgdSAFL4IVWcPJhd11ajwbIT2va3O5XhpoYGwpIGtMIGqMQswCQYDVQQG
16
+ EwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FudGEgQmFyYmFy
17
+ YTEZMBcGA1UEChMQUmlnaHRTY2FsZSwgSW5jLjEVMBMGA1UECxMMQXp1cmUgU3By
18
+ aW50MRYwFAYDVQQDEw1BenVyZSB0ZXN0IENBMSQwIgYJKoZIhvcNAQkBFhVncmFo
19
+ YW1AcmlnaHRzY2FsZS5jb22CCQDG528QN6QwnzAMBgNVHRMEBTADAQH/MA0GCSqG
20
+ SIb3DQEBBQUAA4GBADbJoPLdHiwR3RQ9mrKUgxdCv14BLvg1UAP6QhU1Y8TIUxAp
21
+ HljbEHYk/B9PoG9GsdxTlnFu7LJVOZB7c+aFOaMyRR4TUUwPm/AGMMFnZMbnecqD
22
+ Y9JV2y0mn10i6er9Lz19CGi9TlOUuNdYKLT9cTCaqaVFPvXk44sNb3/5mrpi
23
+ -----END CERTIFICATE-----
@@ -0,0 +1,75 @@
1
+ #-- -*- mode: ruby; encoding: utf-8 -*-
2
+ # Copyright: Copyright (c) 2011 RightScale, Inc.
3
+ #
4
+ # Permission is hereby granted, free of charge, to any person obtaining
5
+ # a copy of this software and associated documentation files (the
6
+ # 'Software'), to deal in the Software without restriction, including
7
+ # without limitation the rights to use, copy, modify, merge, publish,
8
+ # distribute, sublicense, and/or sell copies of the Software, and to
9
+ # permit persons to whom the Software is furnished to do so, subject to
10
+ # the following conditions:
11
+ #
12
+ # The above copyright notice and this permission notice shall be
13
+ # included in all copies or substantial portions of the Software.
14
+ #
15
+ # THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
16
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
18
+ # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
19
+ # CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
20
+ # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
21
+ # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
+ #++
23
+
24
+ require 'rubygems'
25
+ require 'bundler/setup'
26
+ require 'trollop'
27
+ require 'webrick/httpproxy'
28
+ require 'webrick/httpauth'
29
+ require 'cgi'
30
+
31
+ # Patch broken WEBrick escape
32
+ module WEBrick::HTMLUtils
33
+ def escape(string)
34
+ CGI.escapeHTML(string.to_s)
35
+ end
36
+ module_function :escape
37
+ end
38
+
39
+ opts = Trollop::options do
40
+ version "proxy_server 0.1 (c) 2011 RightScale, Inc."
41
+ banner <<-EOS
42
+ Run a very simple proxy server for debugging.
43
+
44
+ Usage:
45
+ proxy_server [options]
46
+ where [options] are:
47
+ EOS
48
+ opt :username, "Username to use for authentication", :type => :string
49
+ opt :password, "Password to use for authentication", :type => :string
50
+ opt :port, "Port to use", :default => 9090
51
+ opt :disable_connect, "Whether to disable using CONNECT through the proxy"
52
+ end
53
+
54
+ logger = WEBrick::Log.new($stderr, WEBrick::Log::WARN)
55
+ config = {}
56
+ config[:Port] = opts[:port]
57
+ config[:Logger] = logger
58
+ config[:AccessLog] = [[$stdout, WEBrick::AccessLog::COMBINED_LOG_FORMAT]]
59
+ config[:ProxyAuthProc] = Proc.new do |req, res|
60
+ if opts[:disable_connect] && req.request_method == "CONNECT"
61
+ raise WEBrick::HTTPStatus::Forbidden
62
+ end
63
+
64
+ unless opts[:username].nil? || opts[:password].nil?
65
+ WEBrick::HTTPAuth.proxy_basic_auth(req, res, "Test realm") {|user, pass|
66
+ user == opts[:username] && pass == opts[:password]
67
+ }
68
+ end
69
+ end
70
+ $stdout.sync = true
71
+ server = WEBrick::HTTPProxyServer.new(config)
72
+ ['INT', 'TERM'].each {|signal|
73
+ trap(signal) { server.shutdown }
74
+ }
75
+ server.start
@@ -0,0 +1,122 @@
1
+ #-- -*- mode: ruby; encoding: utf-8 -*-
2
+ # Copyright: Copyright (c) 2011 RightScale, Inc.
3
+ #
4
+ # Permission is hereby granted, free of charge, to any person obtaining
5
+ # a copy of this software and associated documentation files (the
6
+ # 'Software'), to deal in the Software without restriction, including
7
+ # without limitation the rights to use, copy, modify, merge, publish,
8
+ # distribute, sublicense, and/or sell copies of the Software, and to
9
+ # permit persons to whom the Software is furnished to do so, subject to
10
+ # the following conditions:
11
+ #
12
+ # The above copyright notice and this permission notice shall be
13
+ # included in all copies or substantial portions of the Software.
14
+ #
15
+ # THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
16
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
18
+ # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
19
+ # CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
20
+ # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
21
+ # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
+ #++
23
+
24
+ require 'webrick'
25
+
26
+ ssl_cert, ssl_key, ca_cert = ARGV[0], ARGV[1], ARGV[2]
27
+
28
+ # Monkey patch bad User-Agent parsing
29
+ module WEBrick::AccessLog
30
+ module_function
31
+
32
+ def format(format_string, params)
33
+ format_string.gsub(/\%(?:\{(.*?)\})?>?([a-zA-Z%])/){
34
+ param, spec = $1, $2
35
+ case spec[0]
36
+ when ?e, ?i, ?n, ?o
37
+ raise AccessLogError,
38
+ "parameter is required for \"#{spec}\"" unless param
39
+ if params[spec][param]
40
+ escape(params[spec][param])
41
+ else
42
+ "-"
43
+ end
44
+ when ?t
45
+ params[spec].strftime(param || CLF_TIME_FORMAT)
46
+ when ?%
47
+ "%"
48
+ else
49
+ escape(params[spec].to_s)
50
+ end
51
+ }
52
+ end
53
+ end
54
+
55
+ logger = WEBrick::Log.new($stderr, WEBrick::Log::WARN)#WEBrick::Log::DEBUG
56
+ config = {}
57
+ config[:Port] = 7890
58
+ config[:Logger] = logger
59
+ config[:AccessLog] = [[$stdout, WEBrick::AccessLog::COMBINED_LOG_FORMAT]]
60
+ unless ssl_cert.nil? || ssl_key.nil?
61
+ require 'webrick/https'
62
+ config[:SSLEnable] = true
63
+ # http://www.openssl.org/docs/ssl/SSL_CTX_set_verify.html#
64
+ # SSL_VERIFY_FAIL_IF_NO_PEER_CERT
65
+ # => Server mode: if the client did not return a certificate, the TLS/SSL handshake is immediately terminated with a 'handshake failure' alert.
66
+ # => This flag must be used together with SSL_VERIFY_PEER.
67
+ config[:SSLVerifyClient] = OpenSSL::SSL::VERIFY_PEER
68
+ config[:SSLVerifyClient] |= OpenSSL::SSL::VERIFY_FAIL_IF_NO_PEER_CERT if ca_cert
69
+ config[:SSLPrivateKey] = OpenSSL::PKey::RSA.new(File.open(ssl_key).read)
70
+ config[:SSLCertificate] = OpenSSL::X509::Certificate.new(File.open(ssl_cert).read)
71
+ # KHRVI: option config[:SSLCertName] does make sense only when config[:SSLCertificate] isn't specified
72
+ # see: webrick/ssl.rb method :setup_ssl_context
73
+ # config[:SSLCertName] = [["CN", "Graham Hughes"]]
74
+ config[:SSLVerifyDepth] = 9
75
+ config[:SSLCACertificateFile] = ca_cert if ca_cert
76
+ end
77
+ $stdout.sync = true
78
+ server = WEBrick::HTTPServer.new(config)
79
+
80
+ server.mount_proc('/good') {|req, resp|
81
+ resp.status = 200
82
+ resp['Content-Type'] = "text/plain"
83
+ resp.body = "good"
84
+ }
85
+ intermittent_times = 0
86
+ server.mount_proc('/intermittent-hang') {|req, resp|
87
+ intermittent_times += 1
88
+ if intermittent_times % 2 == 1
89
+ sleep 5
90
+ resp.status = 403
91
+ resp['Content-Type'] = "text/plain"
92
+ resp.body = "bad"
93
+ else
94
+ resp.status = 200
95
+ resp['Content-Type'] = "text/plain"
96
+ resp.body = "good"
97
+ end
98
+ }
99
+ server.mount_proc('/hang') {|req, resp|
100
+ sleep 5
101
+ resp.status = 200
102
+ resp['Content-Type'] = "text/plain"
103
+ resp.body = "good"
104
+ }
105
+ server.mount_proc('/ugly') {|req, resp|
106
+ resp.status = 404
107
+ resp['Content-Type'] = "text/plain"
108
+ resp.body = "ugly"
109
+ }
110
+ server.mount_proc('/filename') {|req, resp|
111
+ resp.status = 200
112
+ resp['ETag'] = File.stat('filename').mtime
113
+ resp['Content-Type'] = "text/plain"
114
+ resp.body = File.open("filename").read
115
+ }
116
+
117
+ # trap signals to invoke shutdown cleanly
118
+ ['INT', 'TERM'].each { |signal|
119
+ trap(signal) { server.shutdown }
120
+ }
121
+
122
+ server.start
data/spec/server.crt ADDED
@@ -0,0 +1,62 @@
1
+ Certificate:
2
+ Data:
3
+ Version: 3 (0x2)
4
+ Serial Number: 1 (0x1)
5
+ Signature Algorithm: sha1WithRSAEncryption
6
+ Issuer: C=US, ST=California, L=Santa Barbara, O=RightScale, Inc., OU=Azure Sprint, CN=Azure test CA/emailAddress=graham@rightscale.com
7
+ Validity
8
+ Not Before: Feb 1 02:48:41 2011 GMT
9
+ Not After : Feb 1 02:48:41 2012 GMT
10
+ Subject: C=US, ST=California, L=Santa Barbara, O=RightScale, Inc., OU=Azure Sprint, CN=127.0.0.1
11
+ Subject Public Key Info:
12
+ Public Key Algorithm: rsaEncryption
13
+ RSA Public Key: (1024 bit)
14
+ Modulus (1024 bit):
15
+ 00:be:0c:ee:7f:8f:c9:c9:a3:4a:dd:50:bb:7a:28:
16
+ d4:93:4b:82:b4:9e:87:58:89:d8:ce:0a:e9:5f:f5:
17
+ f1:99:fd:0f:a3:a9:d9:e9:19:58:e1:88:8f:2f:d6:
18
+ 2d:a9:a3:cb:5e:e4:fe:18:39:03:0e:c3:8c:01:90:
19
+ c1:16:c3:db:8a:28:99:33:84:13:a9:6f:1e:d6:18:
20
+ 8c:f3:18:3a:c3:fc:2b:7f:fa:1f:05:a9:23:4e:c8:
21
+ a4:dc:e6:b4:90:85:82:b3:57:32:98:bb:04:64:93:
22
+ 09:b2:81:fd:0a:9a:03:19:4b:c0:e3:b0:01:41:59:
23
+ 12:ab:4d:05:e8:80:05:d2:bf
24
+ Exponent: 65537 (0x10001)
25
+ X509v3 extensions:
26
+ X509v3 Basic Constraints:
27
+ CA:FALSE
28
+ Netscape Comment:
29
+ OpenSSL Generated Certificate
30
+ X509v3 Subject Key Identifier:
31
+ 53:2D:31:08:5D:F7:AC:1F:0B:05:68:9D:02:16:EE:A8:95:58:B3:B7
32
+ X509v3 Authority Key Identifier:
33
+ keyid:BE:08:55:67:0F:26:17:75:D5:A8:F0:6C:84:F6:BD:AD:CE:E5:78:69
34
+
35
+ Signature Algorithm: sha1WithRSAEncryption
36
+ 24:7e:c8:da:b9:bb:f8:ab:49:cb:cc:58:39:51:eb:e4:70:0f:
37
+ 1c:18:19:f3:91:54:9e:7a:9f:9b:9b:02:e2:83:81:6f:0b:c6:
38
+ d6:15:e7:22:f3:0b:72:01:fa:d2:1a:f9:17:57:15:aa:fb:f6:
39
+ 1f:d2:9d:ef:45:23:58:66:38:c1:ad:f0:c9:9e:c0:d7:7c:17:
40
+ f1:1e:f9:6b:bd:52:48:8b:ac:80:89:41:35:10:d4:a1:c8:68:
41
+ 6e:87:e7:18:45:31:ff:35:a7:57:07:c1:aa:54:75:b2:78:f2:
42
+ 3d:7d:33:38:7f:71:4a:4f:ee:ed:d8:ca:cb:f3:8e:01:41:44:
43
+ 2a:3f
44
+ -----BEGIN CERTIFICATE-----
45
+ MIIDHTCCAoagAwIBAgIBATANBgkqhkiG9w0BAQUFADCBqjELMAkGA1UEBhMCVVMx
46
+ EzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbnRhIEJhcmJhcmExGTAX
47
+ BgNVBAoTEFJpZ2h0U2NhbGUsIEluYy4xFTATBgNVBAsTDEF6dXJlIFNwcmludDEW
48
+ MBQGA1UEAxMNQXp1cmUgdGVzdCBDQTEkMCIGCSqGSIb3DQEJARYVZ3JhaGFtQHJp
49
+ Z2h0c2NhbGUuY29tMB4XDTExMDIwMTAyNDg0MVoXDTEyMDIwMTAyNDg0MVowgYAx
50
+ CzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1TYW50
51
+ YSBCYXJiYXJhMRkwFwYDVQQKExBSaWdodFNjYWxlLCBJbmMuMRUwEwYDVQQLEwxB
52
+ enVyZSBTcHJpbnQxEjAQBgNVBAMTCTEyNy4wLjAuMTCBnzANBgkqhkiG9w0BAQEF
53
+ AAOBjQAwgYkCgYEAvgzuf4/JyaNK3VC7eijUk0uCtJ6HWInYzgrpX/Xxmf0Po6nZ
54
+ 6RlY4YiPL9YtqaPLXuT+GDkDDsOMAZDBFsPbiiiZM4QTqW8e1hiM8xg6w/wrf/of
55
+ BakjTsik3Oa0kIWCs1cymLsEZJMJsoH9CpoDGUvA47ABQVkSq00F6IAF0r8CAwEA
56
+ AaN7MHkwCQYDVR0TBAIwADAsBglghkgBhvhCAQ0EHxYdT3BlblNTTCBHZW5lcmF0
57
+ ZWQgQ2VydGlmaWNhdGUwHQYDVR0OBBYEFFMtMQhd96wfCwVonQIW7qiVWLO3MB8G
58
+ A1UdIwQYMBaAFL4IVWcPJhd11ajwbIT2va3O5XhpMA0GCSqGSIb3DQEBBQUAA4GB
59
+ ACR+yNq5u/irScvMWDlR6+RwDxwYGfORVJ56n5ubAuKDgW8LxtYV5yLzC3IB+tIa
60
+ +RdXFar79h/Sne9FI1hmOMGt8MmewNd8F/Ee+Wu9UkiLrICJQTUQ1KHIaG6H5xhF
61
+ Mf81p1cHwapUdbJ48j19Mzh/cUpP7u3YysvzjgFBRCo/
62
+ -----END CERTIFICATE-----
data/spec/server.key ADDED
@@ -0,0 +1,15 @@
1
+ -----BEGIN RSA PRIVATE KEY-----
2
+ MIICXQIBAAKBgQC+DO5/j8nJo0rdULt6KNSTS4K0nodYidjOCulf9fGZ/Q+jqdnp
3
+ GVjhiI8v1i2po8te5P4YOQMOw4wBkMEWw9uKKJkzhBOpbx7WGIzzGDrD/Ct/+h8F
4
+ qSNOyKTc5rSQhYKzVzKYuwRkkwmygf0KmgMZS8DjsAFBWRKrTQXogAXSvwIDAQAB
5
+ AoGBAIb2zgRey3FbelXy+ECHcHbt3/N+xSU2N3YTP6p7EUlG8m1KuMqVyo3Xmb/h
6
+ /OmEvW81ddEj46z/Z5TRBJ6zFlssmo0xYkbYfjXBbqumn7D8XA8ogFLWwDQzrIvQ
7
+ c2iRuiitXiocqFSVw6NaU7YUfURFCepech9yu0kEkeO2dolJAkEA4gnjJmv7b1D8
8
+ GsZhj+q31vfpfqd/PHOS22IhSQ9Q7xN3uqsH5sDnPWcuwl3z9rcmJYe3wcvgJRkZ
9
+ Dl+t2oNOdQJBANc93maaDbnlydf+5h+aT+wqkzp4U4iE1fNRcbBRjWF+UY4+3NYe
10
+ 0PVf15UNcXjzo+KSQupLgN7Py9BkTFhkHeMCQDpcZSqxbKzUExNyrxPyfV7iiYXr
11
+ Bz37dSpxjriHXNUtiJdIu3SHz+yZrIgArBHCPfYosXg3BHtvnHmKmJ+3kVUCQFEF
12
+ E9sxL+uCyKiKZVsN/fmayRKgSmk//zz4sj+5YuuI3fAaT4w1y1ghvId5qPXrWAwo
13
+ HBIPW7IDK+gEaQx4mxsCQQCpuseeUqAuZXlzedbff5KBq0RcrzzEgRZCGyDM/uPU
14
+ boj87H/49H68OZmPzER+hHTbo5pYSOI3A9v5XmOOORxb
15
+ -----END RSA PRIVATE KEY-----