From 14b21f7a162c6f4e76d00d6d08fa9a09524997ae Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Sat, 26 Oct 2013 01:39:49 +0000 Subject: fix output buffer corner-case for static files The write buffer may block on a single write and immediately become unblocked afterwards. We need to account for this odd corner case when serving static files; because clients can trigger strange corner cases like this. --- test/server_helper.rb | 7 +++++++ test/test_expect_100.rb | 7 ------- test/test_serve_static.rb | 30 ++++++++++++++++++++++++++++++ 3 files changed, 37 insertions(+), 7 deletions(-) (limited to 'test') diff --git a/test/server_helper.rb b/test/server_helper.rb index aeb0dc9..73d3ec8 100644 --- a/test/server_helper.rb +++ b/test/server_helper.rb @@ -79,3 +79,10 @@ module ServerHelper end end end + +module TrywriteBlocked + def kgio_trywrite(*args) + return :wait_writable if $_tw_block_on.include?($_tw_blocked += 1) + super + end +end diff --git a/test/test_expect_100.rb b/test/test_expect_100.rb index 5b1ffa8..4c19493 100644 --- a/test/test_expect_100.rb +++ b/test/test_expect_100.rb @@ -19,13 +19,6 @@ class TestExpect100 < Testcase end end - module TrywriteBlocked - def kgio_trywrite(*args) - return :wait_writable if $_tw_block_on.include?($_tw_blocked += 1) - super - end - end - def test_buffer_noccc; _test_expect_100(true, false); end def test_nobuffer_noccc; _test_expect_100(false, false); end def test_lazybuffer_noccc; _test_expect_100(:lazy, false); end diff --git a/test/test_serve_static.rb b/test/test_serve_static.rb index 4b46fb0..95c07bc 100644 --- a/test/test_serve_static.rb +++ b/test/test_serve_static.rb @@ -36,4 +36,34 @@ class TestServeStatic < Testcase ensure quit_wait(pid) end + + def test_serve_static_blocked_header + err = @err + cfg = Yahns::Config.new + host, port = @srv.addr[3], @srv.addr[1] + cfg.instance_eval do + GTL.synchronize do + app(:rack, Rack::File.new(Dir.pwd)) { listen "#{host}:#{port}" } + end + logger(Logger.new(err.path)) + end + pid = fork do + ENV["YAHNS_FD"] = @srv.fileno.to_s + $_tw_blocked = 0 + $_tw_block_on = [1] + Yahns::HttpClient.__send__(:include, TrywriteBlocked) + Yahns::Server.new(cfg).start.join + end + gplv3 = File.read("COPYING") + Net::HTTP.start(host, port) do |http| + res = http.request(Net::HTTP::Get.new("/COPYING")) + assert_equal gplv3, res.body + + req = Net::HTTP::Get.new("/COPYING", "Range" => "bytes=5-46") + res = http.request(req) + assert_equal gplv3[5..46], res.body + end + ensure + quit_wait(pid) + end end -- cgit v1.2.3-24-ge0c7