http_session 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.document +5 -0
- data/.rvmrc +1 -0
- data/Gemfile +14 -0
- data/Gemfile.lock +27 -0
- data/LICENSE +19 -0
- data/README.rdoc +72 -0
- data/Rakefile +148 -0
- data/VERSION +1 -0
- data/http_session.gemspec +75 -0
- data/lib/http_session.rb +206 -0
- data/share/ca/cacert.pem +3987 -0
- data/test/helper.rb +84 -0
- data/test/ssl/README.rdoc +32 -0
- data/test/ssl/ca.crt +34 -0
- data/test/ssl/ca.key +54 -0
- data/test/ssl/server.crt +31 -0
- data/test/ssl/server.csr +27 -0
- data/test/ssl/server.key +51 -0
- data/test/test_http_session.rb +292 -0
- metadata +149 -0
    
        data/test/helper.rb
    ADDED
    
    | @@ -0,0 +1,84 @@ | |
| 1 | 
            +
            require 'rubygems'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            # require 'bundler'
         | 
| 4 | 
            +
            # begin
         | 
| 5 | 
            +
            #   Bundler.setup(:default, :development)
         | 
| 6 | 
            +
            # rescue Bundler::BundlerError => e
         | 
| 7 | 
            +
            #   $stderr.puts e.message
         | 
| 8 | 
            +
            #   $stderr.puts "Run `bundle install` to install missing gems"
         | 
| 9 | 
            +
            #   exit e.status_code
         | 
| 10 | 
            +
            # end
         | 
| 11 | 
            +
             | 
| 12 | 
            +
            if ENV.has_key?('USE_SIMPLECOV')
         | 
| 13 | 
            +
              require 'simplecov'
         | 
| 14 | 
            +
              SimpleCov.start do
         | 
| 15 | 
            +
                add_group 'Libraries', 'lib'
         | 
| 16 | 
            +
              end
         | 
| 17 | 
            +
            end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
            require 'test/unit'
         | 
| 20 | 
            +
            begin
         | 
| 21 | 
            +
              require 'shoulda'
         | 
| 22 | 
            +
            rescue LoadError
         | 
| 23 | 
            +
              puts 'WARNING: missing shoulda library, cannot continue run tests'
         | 
| 24 | 
            +
              exit
         | 
| 25 | 
            +
            end
         | 
| 26 | 
            +
             | 
| 27 | 
            +
            require 'webrick'
         | 
| 28 | 
            +
            require 'webrick/https'
         | 
| 29 | 
            +
            require 'openssl'
         | 
| 30 | 
            +
            require 'thread'
         | 
| 31 | 
            +
            TEST_SERVER_PORT = 8081
         | 
| 32 | 
            +
             | 
| 33 | 
            +
            $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
         | 
| 34 | 
            +
            $LOAD_PATH.unshift(File.dirname(__FILE__))
         | 
| 35 | 
            +
            require 'http_session'
         | 
| 36 | 
            +
             | 
| 37 | 
            +
            class Test::Unit::TestCase
         | 
| 38 | 
            +
              
         | 
| 39 | 
            +
              # start a simple webrick server that runs the given servlet and other options for testing
         | 
| 40 | 
            +
              @wbthread = nil
         | 
| 41 | 
            +
              def start_server(use_ssl=false, config={})
         | 
| 42 | 
            +
                # always run on this port
         | 
| 43 | 
            +
                config.update(:Port => TEST_SERVER_PORT)
         | 
| 44 | 
            +
                # for debugging the server itself, log debug output to stderr
         | 
| 45 | 
            +
                # config.update(:Logger => ::WEBrick::Log.new($stderr, ::WEBrick::Log::DEBUG))
         | 
| 46 | 
            +
                # or squelch all server logging for normal use
         | 
| 47 | 
            +
                config.update(:Logger => ::WEBrick::Log.new('/dev/null'))
         | 
| 48 | 
            +
                config.update(:AccessLog => [ [ File.open('/dev/null', 'w'), ::WEBrick::AccessLog::COMBINED_LOG_FORMAT ] ])
         | 
| 49 | 
            +
                # don't ever process any requests in parallel, always run each test one at a time
         | 
| 50 | 
            +
                config.update(:MaxClients => 1)
         | 
| 51 | 
            +
                
         | 
| 52 | 
            +
                if use_ssl
         | 
| 53 | 
            +
                  # configure server to run with SSL
         | 
| 54 | 
            +
                  config.update(:SSLEnable => true)
         | 
| 55 | 
            +
                  config.update(:SSLVerifyClient => ::OpenSSL::SSL::VERIFY_NONE)
         | 
| 56 | 
            +
                  config.update(:SSLCertificate => ::OpenSSL::X509::Certificate.new(File.open(File.expand_path('../ssl/server.crt',  __FILE__)).read))
         | 
| 57 | 
            +
                  config.update(:SSLPrivateKey => ::OpenSSL::PKey::RSA.new(File.open(File.expand_path('../ssl/server.key',  __FILE__)).read))
         | 
| 58 | 
            +
                  config.update(:SSLCertName => [ [ "CN", 'localhost' ] ])
         | 
| 59 | 
            +
                end
         | 
| 60 | 
            +
                
         | 
| 61 | 
            +
                # create the server
         | 
| 62 | 
            +
                server = ::WEBrick::HTTPServer.new(config)
         | 
| 63 | 
            +
                yield server if block_given?
         | 
| 64 | 
            +
                # run the server in its own thread, setting up USR1 signal to tell it to quit
         | 
| 65 | 
            +
                @wbthread = Thread.new(server) do |server|
         | 
| 66 | 
            +
                  trap('USR1') { server.shutdown }
         | 
| 67 | 
            +
                  server.start
         | 
| 68 | 
            +
                end
         | 
| 69 | 
            +
              end
         | 
| 70 | 
            +
              
         | 
| 71 | 
            +
              # stop the simple webrick server
         | 
| 72 | 
            +
              def stop_server
         | 
| 73 | 
            +
                if ! @wbthread.nil? && @wbthread.alive?
         | 
| 74 | 
            +
                  # signal server thread to quit
         | 
| 75 | 
            +
                  Process.kill('USR1', Process.pid)
         | 
| 76 | 
            +
                  # wait for it to actually quit
         | 
| 77 | 
            +
                  # note: Sometimes it appears to hang here at this join, when there's something wrong with the server or client
         | 
| 78 | 
            +
                  # when that happens just comment out to see more debug info what's wrong
         | 
| 79 | 
            +
                  # you'll also get some spurrious concurrency errors of course, but at least the problem will show up too
         | 
| 80 | 
            +
                  @wbthread.join
         | 
| 81 | 
            +
                end
         | 
| 82 | 
            +
              end
         | 
| 83 | 
            +
              
         | 
| 84 | 
            +
            end
         | 
| @@ -0,0 +1,32 @@ | |
| 1 | 
            +
            = How to update these files
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            These files are only good for so many years, and then they need to be updated... it is set to a very long time because they are only for testing purposes not for actual use of course.
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            == Generate your own CA (Certificate Authority):
         | 
| 6 | 
            +
             | 
| 7 | 
            +
              openssl genrsa -des3 -out ca.key 4096
         | 
| 8 | 
            +
              openssl req -new -x509 -days 3650 -key ca.key -out ca.crt
         | 
| 9 | 
            +
             | 
| 10 | 
            +
            password is 1234
         | 
| 11 | 
            +
             | 
| 12 | 
            +
            == Generate a server key and request for signing (csr):
         | 
| 13 | 
            +
             | 
| 14 | 
            +
              openssl genrsa -des3 -out server.key 4096
         | 
| 15 | 
            +
              openssl req -new -key server.key -out server.csr
         | 
| 16 | 
            +
             | 
| 17 | 
            +
            CN must match host name or IP i.e. localhost, and must be different from CA's CN
         | 
| 18 | 
            +
             | 
| 19 | 
            +
            == Sign the certificate signing request (csr) with the self-created Certificate Authority (CA) that you made earlier:
         | 
| 20 | 
            +
             | 
| 21 | 
            +
              openssl x509 -req -days 3650 -in server.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out server.crt
         | 
| 22 | 
            +
             | 
| 23 | 
            +
            increment serial each time it's updated
         | 
| 24 | 
            +
             | 
| 25 | 
            +
            == Convert server.key into a password-less one:
         | 
| 26 | 
            +
             | 
| 27 | 
            +
              openssl rsa -in server.key -out server.key.insecure
         | 
| 28 | 
            +
              mv server.key.insecure server.key
         | 
| 29 | 
            +
             | 
| 30 | 
            +
            that's it! :)
         | 
| 31 | 
            +
             | 
| 32 | 
            +
            reference used: http://www.tc.umn.edu/~brams006/selfsign.html
         | 
    
        data/test/ssl/ca.crt
    ADDED
    
    | @@ -0,0 +1,34 @@ | |
| 1 | 
            +
            -----BEGIN CERTIFICATE-----
         | 
| 2 | 
            +
            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 | 
            +
            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-----
         | 
    
        data/test/ssl/server.crt
    ADDED
    
    | @@ -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-----
         | 
    
        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 | 
            +
            MIIJJwIBAAKCAgEA0mltlnw6nuqoZQz01+vbFc/abWwvAkF3dO4lblPtEv0G7LPE
         | 
| 3 | 
            +
            u7y1sTP755arLewQoqDMxoF6uYEsxWnYTX/x0jsSTa8NRgcaeUrep/19t2dQ+IF0
         | 
| 4 | 
            +
            1EDJVT+nGhQdFEVdDhjuQ2XZ53jmkBX44TjVBzgstEXdzBCpuuAwKa3wqDMLL94l
         | 
| 5 | 
            +
            +Qfjh9GOlRIXO787bSyf3ky5qYrvZI97BKBM4dJDIQvUbMefh3Vhy3llqf2PTS4I
         | 
| 6 | 
            +
            6txpS6WnGobPh0GuGELjxQpWBV8cEL2olGtgTLLBbgxCcoUUEFzsAS18iAxt4pOG
         | 
| 7 | 
            +
            Qacf0HRnhYjasaNlVe/6DafIi8vRUR167Y3N9DGus+DWPmxDo4u7ac7aKJAxXPfu
         | 
| 8 | 
            +
            53/0p9P7i26JFo9AaL1EKuHLR9klAuv5zYgz9Suasn2gDsVfC9lNzzV85fp9Y8qL
         | 
| 9 | 
            +
            HWg/FIizKRI9Jmep/Jz/TX9qcQfU8xs9kHo1i0Djnj1p0WW/vIjIlObej38fdT1R
         | 
| 10 | 
            +
            037vByjhOqyl1ni0YQotOM4HnwvVt8U8uUc2A580oTFydj+l3AaCnjYDEXxxuTwE
         | 
| 11 | 
            +
            682wdWuBQRhunKSkFiJ8ltiKFKeaDDFtFQ0xMKtt3mgauz54aRMN79Mxk7UGhaeG
         | 
| 12 | 
            +
            btNWw10kW7Opqmc4uMzQQMeqBf56fYDvjfQ3kfvvsQZcwdastJOeztX+GskCAwEA
         | 
| 13 | 
            +
            AQKCAgAt1L8FD0wpf01srVTLj1kqOBsIyI64vA/MDW9jx64U+749Yq7QgbtFvN/6
         | 
| 14 | 
            +
            wsvIdentsn7IIj3cGDHrUjHGN78xnqJO/3kxrqxqjQ9Qoht3Dm8JohEThoUUJ4g7
         | 
| 15 | 
            +
            WvQ2jSFGx9FmJtI+5Au8iLysOhfUubyrC6jTITIHPXvgKD4KNQwTwhydUMWTuOaI
         | 
| 16 | 
            +
            u+cJoY7NKfIslqO+NUANtF8EU/JLIeRzV0NO6nBqLfw+ONQXId7L3eIdXiMlUhDC
         | 
| 17 | 
            +
            62hausi0CiXYrnasNtpDHzyQD49rRWhykwMKNMh5A/R4ETNV4vcwahfNRxzb5+8A
         | 
| 18 | 
            +
            nB2eocuZ22qo/MnnAV83fudexQt95soYaOIql6OUvk/fWEC9QJUuw910y0lqpyPx
         | 
| 19 | 
            +
            D8fyIPVeR9PZ3l6UVVgfxVsYEcWwo/W06jWXQpPr96s4jO3I4xm7V8fzmQE5nas7
         | 
| 20 | 
            +
            5dh4jrVlyv2wsK1j9gW25eCzAKDvCnk7o5qpU2mBZn/GY86IsrA46JfMNDMf3CoK
         | 
| 21 | 
            +
            +J4fcJHDsO7H1ZYUJ1AktMn+0tmiNVYI94kg5DV8p5H9hR9WxJeT2DJqNX0zYcSh
         | 
| 22 | 
            +
            iy1TWCheCwWUUzy4yzwA5nK1ZRCHvWMpQBURy4KkwgX84s5N7RAGlxdvCvIBRCN/
         | 
| 23 | 
            +
            jM7btop76Twl8mSzn7xbkKaS66zVM8k7SAD7yi+7LlepjX8STQKCAQEA+nDvgzXM
         | 
| 24 | 
            +
            l/thTHCpDoYh1+ThM49EDidQglRxCZIp3EGQevDzklBtWNgA8kNQJGERPTr3ceNo
         | 
| 25 | 
            +
            LDvWkkPxOrA/sdgCWkX6donnwZA6mx0dbSKuA2FhVY6et9y60T+arstSYf2PXsjt
         | 
| 26 | 
            +
            gIHoE1GDFyLujepn2ORTqU7a1FHCUn1G9lkVoOL7gCdcwl5yO0jt4bxekPG27ir7
         | 
| 27 | 
            +
            W4UNp9nJavA+xw5mFr7oY0jjRhBprXgIQmaTp8w4eJCUGNiWcO58DUKunNabWlK0
         | 
| 28 | 
            +
            U6Gyuk7+xcEjMdFP4gwOZXsnUxK8QeQq0iW2XYbRh5cV2DmUWGEfUDm1Uwpg7nFq
         | 
| 29 | 
            +
            51jgIscQwKTgawKCAQEA1xUJX8Af4HlRXfcQTUQFQvPQcq7I7hhXAQyVukqxgKpR
         | 
| 30 | 
            +
            87PUOWVSHmA/jOCN1lnizsBExrhNbhgPyTbN7TMpExFVAGDD4TZNdFu8CPilX36i
         | 
| 31 | 
            +
            3MTcm85uhfSCU1xKz6qSw4b9qA01ooOhWTLoEeQKp+omyhRtc+aB0FtVzO5LNMpx
         | 
| 32 | 
            +
            AVbZ0h5rwpCu2GYJnDxY3/0c18Q3q6YgN42SHVrPVpp/iPFlY0cT6cs9CD3tbr68
         | 
| 33 | 
            +
            CeTxfHzq/lLFtYa5bW9GEjKAGE10P0eLdLDUYW+jJmcyYT9fiykGQa9ICAK2vQtc
         | 
| 34 | 
            +
            m/CpJc7KaNvVG9I129vYKlBNeI7TGmBXPv2Vf0UumwKCAQAGse41O8L0bSv0ty5N
         | 
| 35 | 
            +
            zRgqhVvf3PycxEBKu6cp8lZcJQSPxNE+IBhMP7oGv/XsgwvK70CeMs4eIJtj3Z0d
         | 
| 36 | 
            +
            TIjnYDbv4t8HPDiN3CU08FpRCJROUtQfTWjA0Y3M+j5QXe8d34Ftr0FqJg7mNU+j
         | 
| 37 | 
            +
            1rM56AJOsgvqgskm0+i1+9Nh0o/ZdTfz/RlluNCk9RYm6ro8dbnGNC/0CmKLEi9o
         | 
| 38 | 
            +
            RHPpLmFcSk48GT66KMYqdQMDg2p/Gd6ImpTa9S9QZY+7awTv/Gy6xWs8sR3uDR6S
         | 
| 39 | 
            +
            es9ODaJtEJVx8RDkD6QovsjGRWvSpEAFt+xFk4R7uFz18BUA204sEawh8yZKx7eS
         | 
| 40 | 
            +
            7tVxAoIBAB7JdxcKpEV4eCowJFg7BVnJFqxj0oUqXMHcsE4DRRc6yhJNSnKQy0ln
         | 
| 41 | 
            +
            05Dxz7vAEBQyN2YOmZ7JuPC/dIigix+cmoM8Vq2VHU8rlmXeWaWqtdtOHpn62Z05
         | 
| 42 | 
            +
            G7KdAmRpcSql1wdIJMZHe0AOZmOxNclFXhoNBIHTm/9cI5L7BS7gT362lOVbz2cB
         | 
| 43 | 
            +
            WNXG/Vcs2DfvvkIwZxud4vywuhqTlhw6b0kF7NJiKTqNCgZ0/ticWsQ7zklYhDa1
         | 
| 44 | 
            +
            WHGcgExm4ivWqLlR1PL95btlWHE+Dqd/nBmJfb6ot6mNUo06/jdfOflkYIH18MlD
         | 
| 45 | 
            +
            tmSOGYGIHZApAH3iS9t5sONmXxDhsUMCggEAF3u3Xr9g4CFj2XloYueziB4hRWVP
         | 
| 46 | 
            +
            kfIC7Oao/se39+Yka3nhu/mFSNB2AMc0tpiuLsKv79IL1BjWzswq52taOp20DMmi
         | 
| 47 | 
            +
            TaH+HEiqTSrGSvhMgLKqD2F7EVgEX2Yz6CgFwOUSI1TFcNmsYyeGmEzWc8iILLBT
         | 
| 48 | 
            +
            KnZ6/u2fBj+OLjsg0kIQ78Fq/kKWR6gelaO3AFGaOWtlajtDXlrJbg4yOdu+bAhM
         | 
| 49 | 
            +
            /f9hv0QdU7Mq3npus5D7fPahhUbownSkw/SaWLkJRQVpXRasluuQrymRdCwlGSqZ
         | 
| 50 | 
            +
            YsSQVQWbZ3XYYMi5J4Kj1nGcPxFDaJF/pWtlS9G0Yatzs3QuEV6jdUANaw==
         | 
| 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
         |