diff options
author | Eric Wong <normalperson@yhbt.net> | 2012-05-09 02:18:08 +0000 |
---|---|---|
committer | Eric Wong <normalperson@yhbt.net> | 2012-05-09 02:18:08 +0000 |
commit | bbd55c8bcd0d2833c99a2c23856ff07be7f46f9a (patch) | |
tree | 2e02524ffed199460cf3ac0d72b7869bdb94c09e | |
parent | 9573d9bc6c63aced28300a9d7346b5575eed8b7d (diff) | |
download | rainbows-bbd55c8bcd0d2833c99a2c23856ff07be7f46f9a.tar.gz |
unicorn 4.3.x now calls shutdown() explicitly on the socket, so we can't just rely on a dup()-ed FD to keep a socket around.
-rw-r--r-- | lib/rainbows/stream_response_epoll.rb | 24 | ||||
-rw-r--r-- | lib/rainbows/stream_response_epoll/client.rb | 3 |
2 files changed, 25 insertions, 2 deletions
diff --git a/lib/rainbows/stream_response_epoll.rb b/lib/rainbows/stream_response_epoll.rb index ed13c05..3bb3540 100644 --- a/lib/rainbows/stream_response_epoll.rb +++ b/lib/rainbows/stream_response_epoll.rb @@ -67,9 +67,31 @@ module Rainbows::StreamResponseEpoll end while true end end - ep_client.close if ep_client ensure body.respond_to?(:close) and body.close + if ep_client + ep_client.close + else + socket.shutdown + socket.close + end + end + + # once a client is accepted, it is processed in its entirety here + # in 3 easy steps: read request, call app, write app response + def process_client(client) + status, headers, body = @app.call(env = @request.read(client)) + + if 100 == status.to_i + client.write(Unicorn::Const::EXPECT_100_RESPONSE) + env.delete(Unicorn::Const::HTTP_EXPECT) + status, headers, body = @app.call(env) + end + @request.headers? or headers = nil + http_response_write(client, status, headers, body) + rescue => e + handle_error(client, e) end + # :startdoc: end diff --git a/lib/rainbows/stream_response_epoll/client.rb b/lib/rainbows/stream_response_epoll/client.rb index cf3056e..db303b0 100644 --- a/lib/rainbows/stream_response_epoll/client.rb +++ b/lib/rainbows/stream_response_epoll/client.rb @@ -19,7 +19,7 @@ class Rainbows::StreamResponseEpoll::Client def initialize(io, unwritten) @closed = false - @to_io = io.dup + @to_io = io @wr_queue = [ unwritten.dup ] EP.set(self, OUT) end @@ -50,6 +50,7 @@ class Rainbows::StreamResponseEpoll::Client def on_write_complete if @closed + @to_io.shutdown @to_io.close N.decr(0, 1) end |