diff options
author | Eric Wong <normalperson@yhbt.net> | 2010-07-04 22:16:52 +0000 |
---|---|---|
committer | Eric Wong <normalperson@yhbt.net> | 2010-07-04 22:34:09 +0000 |
commit | 39b178cdebe275cbc8ce19cf269bea7cd15ff4ca (patch) | |
tree | b7628ed278895fcf70ea3206956be586ac9e1ac5 /lib/rainbows/base.rb | |
parent | 75f5aa9a0d6b37a94afbea3121fc2c16e70a2b1d (diff) | |
download | rainbows-39b178cdebe275cbc8ce19cf269bea7cd15ff4ca.tar.gz |
This hopefully allows the "sendfile" gem to be required anywhere in the Rainbows!/Unicorn config file, and not have to be required via RUBYOPT or the '-r' command-line switch. We also modularize HttpResponse and avoids singleton methods in the response path. This (hopefully) makes it easier for individual concurrency models to share code and override individual methods.
Diffstat (limited to 'lib/rainbows/base.rb')
-rw-r--r-- | lib/rainbows/base.rb | 67 |
1 files changed, 7 insertions, 60 deletions
diff --git a/lib/rainbows/base.rb b/lib/rainbows/base.rb index 24924cb..cd719d2 100644 --- a/lib/rainbows/base.rb +++ b/lib/rainbows/base.rb @@ -10,17 +10,18 @@ module Rainbows::Base # :stopdoc: include Rainbows::Const + include Rainbows::HttpResponse # shortcuts... G = Rainbows::G NULL_IO = Unicorn::HttpRequest::NULL_IO TeeInput = Rainbows::TeeInput - HttpResponse = Rainbows::HttpResponse HttpParser = Unicorn::HttpParser # this method is called by all current concurrency models def init_worker_process(worker) super(worker) + Rainbows::HttpResponse.setup(self.class) Rainbows::MaxBody.setup G.tmp = worker.tmp @@ -39,57 +40,6 @@ module Rainbows::Base logger.info "Rainbows! #@use worker_connections=#@worker_connections" end - # TODO: move write_body_* stuff out of Base - def write_body_each(client, body) - body.each { |chunk| client.write(chunk) } - ensure - body.respond_to?(:close) and body.close - end - - # The sendfile 1.0.0 RubyGem includes IO#sendfile and - # IO#sendfile_nonblock, previous versions didn't have - # IO#sendfile_nonblock, and IO#sendfile in previous versions - # could other threads under 1.8 with large files - # - # IO#sendfile currently (June 2010) beats 1.9 IO.copy_stream with - # non-Linux support and large files on 32-bit. We still fall back to - # IO.copy_stream (if available) if we're dealing with DevFdResponse - # objects, though. - if IO.method_defined?(:sendfile_nonblock) - def write_body_path(client, body) - file = Rainbows.body_to_io(body) - file.stat.file? ? client.sendfile(file, 0) : - write_body_stream(client, file) - end - end - - if IO.respond_to?(:copy_stream) - unless method_defined?(:write_body_path) - def write_body_path(client, body) - IO.copy_stream(Rainbows.body_to_io(body), client) - end - end - - def write_body_stream(client, body) - IO.copy_stream(body, client) - end - else - alias write_body_stream write_body_each - end - - if method_defined?(:write_body_path) - def write_body(client, body) - body.respond_to?(:to_path) ? - write_body_path(client, body) : - write_body_each(client, body) - end - else - alias write_body write_body_each - end - - module_function :write_body, :write_body_each, :write_body_stream - method_defined?(:write_body_path) and module_function(:write_body_path) - def wait_headers_readable(client) IO.select([client], nil, nil, G.kato) end @@ -115,20 +65,17 @@ module Rainbows::Base env[RACK_INPUT] = 0 == hp.content_length ? NULL_IO : TeeInput.new(client, env, hp, buf) env[REMOTE_ADDR] = remote_addr - status, headers, body = app.call(env.update(RACK_DEFAULTS)) + response = app.call(env.update(RACK_DEFAULTS)) - if 100 == status.to_i + if 100 == response[0].to_i client.write(EXPECT_100_RESPONSE) env.delete(HTTP_EXPECT) - status, headers, body = app.call(env) + response = app.call(env) end alive = hp.keepalive? && G.alive - if hp.headers? - out = [ alive ? CONN_ALIVE : CONN_CLOSE ] - client.write(HttpResponse.header_string(status, headers, out)) - end - write_body(client, body) + out = [ alive ? CONN_ALIVE : CONN_CLOSE ] if hp.headers? + write_response(client, response, out) end while alive and hp.reset.nil? and env.clear # if we get any error, try to write something back to the client # assuming we haven't closed the socket, but don't get hung up |