about summary refs log tree commit homepage
diff options
context:
space:
mode:
-rw-r--r--lib/yahns/http_response.rb5
-rw-r--r--test/server_helper.rb7
-rw-r--r--test/test_expect_100.rb7
-rw-r--r--test/test_serve_static.rb30
4 files changed, 41 insertions, 8 deletions
diff --git a/lib/yahns/http_response.rb b/lib/yahns/http_response.rb
index df935e9..6b97038 100644
--- a/lib/yahns/http_response.rb
+++ b/lib/yahns/http_response.rb
@@ -58,7 +58,10 @@ module Yahns::HttpResponse # :nodoc:
     when nil
       case alive
       when :ignore
-        @state = :ignore
+        @state = alive
+      when Yahns::StreamFile
+        @state = alive
+        :wait_writable
       when true, false
         http_response_done(alive)
       end
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