about summary refs log tree commit homepage
path: root/test/test_ssl.rb
diff options
context:
space:
mode:
Diffstat (limited to 'test/test_ssl.rb')
-rw-r--r--test/test_ssl.rb43
1 files changed, 35 insertions, 8 deletions
diff --git a/test/test_ssl.rb b/test/test_ssl.rb
index 172d8e4..fe7e09e 100644
--- a/test/test_ssl.rb
+++ b/test/test_ssl.rb
@@ -63,12 +63,21 @@ AQjjxMXhwULlmuR/K+WwlaZPiLIBYalLAZQ7ZbOPeVkJ8ePao0eLAgEC
 
   def test_ssl_basic
     err, cfg, host, port = @err, Yahns::Config.new, @srv.addr[3], @srv.addr[1]
+    insecure = TCPServer.new(ENV["TEST_HOST"] || "127.0.0.1", 0)
     ctx = srv_ctx
     raw = File.read(__FILE__)
     pid = mkserver(cfg) do
+      ENV["YAHNS_FD"] += ",#{insecure.fileno.to_s}"
       cfg.instance_eval do
         ru = lambda do |env|
-          case env['PATH_INFO']
+          case path_info = env['PATH_INFO']
+          when '/rack.url_scheme', '/HTTPS'
+            s = env[path_info[1..-1]] # remove leading slash
+            s = s.inspect if s.nil?
+            [ 200, {
+                'Content-Length' => s.bytesize.to_s,
+                'Content-Type'=>'text/plain',
+              }, [ s ] ]
           when '/static'
             f = File.open(__FILE__)
             [ 200, {
@@ -80,19 +89,36 @@ AQjjxMXhwULlmuR/K+WwlaZPiLIBYalLAZQ7ZbOPeVkJ8ePao0eLAgEC
             [ 200, {'Content-Length'=>'2'}, ['HI'] ]
           end
         end
-        app(:rack, ru) { listen "#{host}:#{port}", ssl_ctx: ctx }
+        app(:rack, ru) {
+          listen "#{host}:#{port}", ssl_ctx: ctx
+          listen "#{insecure.addr[3]}:#{insecure.addr[1]}"
+        }
         logger(Logger.new(err.path))
       end
     end
     client = ssl_client(host, port)
-    client.write("GET / HTTP/1.1\r\nHost: example.com\r\n\r\n")
     buf = ''.dup
-    Timeout.timeout(60) do
-      buf << client.readpartial(111) until buf =~ /HI\z/
+    { '/' => 'HI',
+      '/rack.url_scheme' => 'https',
+      '/HTTPS' => 'on'
+    }.each do |path, exp|
+      client.write("GET #{path} HTTP/1.1\r\nHost: example.com\r\n\r\n")
+      buf.clear
+      re = /#{Regexp.escape(exp)}\z/
+      Timeout.timeout(60) do
+        buf << client.readpartial(111) until buf =~ re
+      end
+      head, body = buf.split("\r\n\r\n", 2)
+      assert_equal exp, body
+      assert_match %r{\AHTTP/1\.\d 200 OK\r\n}, head
+    end
+
+    Net::HTTP.start(insecure.addr[3], insecure.addr[1]) do |h|
+      res = h.get('/rack.url_scheme')
+      assert_equal 'http', res.body
+      res = h.get('/HTTPS')
+      assert_equal 'nil', res.body
     end
-    head, body = buf.split("\r\n\r\n", 2)
-    assert_equal "HI", body
-    assert_match %r{\AHTTP/1\.\d 200 OK\r\n}, head
 
     # read static file
     client.write("GET /static HTTP/1.1\r\nHost: example.com\r\n\r\n")
@@ -109,6 +135,7 @@ AQjjxMXhwULlmuR/K+WwlaZPiLIBYalLAZQ7ZbOPeVkJ8ePao0eLAgEC
     assert_equal "HI", body
     assert_match %r{\AHTTP/1\.\d 200 OK\r\n}, head
   ensure
+    insecure.close if insecure
     client.close if client
     quit_wait(pid)
   end