From f6dd9694b43c2625f514e89856834a633b70f91b Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Fri, 12 Feb 2016 00:55:46 +0000 Subject: properly emulate sendfile for OpenSSL sockets We cannot use the sendfile(2) syscall when serving static files to TLS clients without breaking them. We currently rely on OpenSSL to encrypt the data before it hits the socket, so it must be read into userspace buffers before being written to the socket. --- test/test_ssl.rb | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) (limited to 'test') diff --git a/test/test_ssl.rb b/test/test_ssl.rb index a8e3bea..172d8e4 100644 --- a/test/test_ssl.rb +++ b/test/test_ssl.rb @@ -64,9 +64,22 @@ AQjjxMXhwULlmuR/K+WwlaZPiLIBYalLAZQ7ZbOPeVkJ8ePao0eLAgEC def test_ssl_basic err, cfg, host, port = @err, Yahns::Config.new, @srv.addr[3], @srv.addr[1] ctx = srv_ctx + raw = File.read(__FILE__) pid = mkserver(cfg) do cfg.instance_eval do - ru = lambda { |_| [ 200, {'Content-Length'=>'2'}, ['HI'] ] } + ru = lambda do |env| + case env['PATH_INFO'] + when '/static' + f = File.open(__FILE__) + [ 200, { + 'Content-Length' => f.size.to_s, + 'Content-Type'=>'text/plain', + }, + f ] + else + [ 200, {'Content-Length'=>'2'}, ['HI'] ] + end + end app(:rack, ru) { listen "#{host}:#{port}", ssl_ctx: ctx } logger(Logger.new(err.path)) end @@ -81,6 +94,16 @@ AQjjxMXhwULlmuR/K+WwlaZPiLIBYalLAZQ7ZbOPeVkJ8ePao0eLAgEC 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") + buf.clear + Timeout.timeout(60) do + buf << client.readpartial(8192) until buf.include?(raw) + end + head, body = buf.split("\r\n\r\n", 2) + assert_match %r{\AHTTP/1\.\d 200 OK\r\n}, head + assert_equal raw, body + client.write("GET / HTTP/1.0\r\n\r\n") head, body = client.read.split("\r\n\r\n", 2) assert_equal "HI", body -- cgit v1.2.3-24-ge0c7