From 2dd3e22782090dc347429e306569f687fa794d06 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Mon, 8 Feb 2010 17:14:41 -0800 Subject: Allow :reentrant flag to be forced true/false Clogger may set this value independently of "rack.multithread" since Actor/Fiber-based servers may have multiple instances of Clogger wrapping different response bodies and yet be incompatible with "rack.multithread" --- ext/clogger_ext/clogger.c | 13 +++++++++++++ lib/clogger/pure.rb | 4 ++-- test/test_clogger.rb | 42 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 57 insertions(+), 2 deletions(-) diff --git a/ext/clogger_ext/clogger.c b/ext/clogger_ext/clogger.c index f2d82d6..da6b5d2 100644 --- a/ext/clogger_ext/clogger.c +++ b/ext/clogger_ext/clogger.c @@ -599,6 +599,19 @@ static VALUE clogger_init(int argc, VALUE *argv, VALUE self) tmp = rb_hash_aref(o, ID2SYM(rb_intern("format"))); if (!NIL_P(tmp)) fmt = tmp; + + tmp = rb_hash_aref(o, ID2SYM(rb_intern("reentrant"))); + switch (TYPE(tmp)) { + case T_TRUE: + c->reentrant = 1; + break; + case T_FALSE: + c->reentrant = 0; + case T_NIL: + break; + default: + rb_raise(rb_eArgError, ":reentrant must be boolean"); + } } init_buffers(c); diff --git a/lib/clogger/pure.rb b/lib/clogger/pure.rb index 0c609ba..b871c62 100644 --- a/lib/clogger/pure.rb +++ b/lib/clogger/pure.rb @@ -13,7 +13,7 @@ class Clogger (@logger.sync = true) rescue nil @fmt_ops = compile_format(opts[:format] || Format::Common, opts) @wrap_body = need_wrap_body?(@fmt_ops) - @reentrant = nil + @reentrant = opts[:reentrant] @need_resp = need_response_headers?(@fmt_ops) @body_bytes_sent = 0 end @@ -28,7 +28,7 @@ class Clogger status, headers, body = resp headers = Rack::Utils::HeaderHash.new(headers) if @need_resp if @wrap_body - @reentrant = env['rack.multithread'] + @reentrant = env['rack.multithread'] if @reentrant.nil? @env, @status, @headers, @body = env, status, headers, body return [ status, headers, @reentrant ? self.dup : self ] end diff --git a/test/test_clogger.rb b/test/test_clogger.rb index 1906718..b086bbb 100644 --- a/test/test_clogger.rb +++ b/test/test_clogger.rb @@ -545,4 +545,46 @@ class TestClogger < Test::Unit::TestCase assert_equal :foo, body.close end + def test_clogger_auto_reentrant_true + s = '' + body = [] + app = lambda { |env| [302, [ %w(a) ], body ] } + cl = Clogger.new(app, :logger => s, :format => "$request_time") + @req['rack.multithread'] = true + status, headers, body = cl.call(@req) + assert cl.reentrant? + end + + def test_clogger_auto_reentrant_false + s = '' + body = [] + app = lambda { |env| [302, [ %w(a) ], body ] } + cl = Clogger.new(app, :logger => s, :format => "$request_time") + @req['rack.multithread'] = false + status, headers, body = cl.call(@req) + assert ! cl.reentrant? + end + + def test_clogger_auto_reentrant_forced_true + s = '' + body = [] + app = lambda { |env| [302, [ %w(a) ], body ] } + o = { :logger => s, :format => "$request_time", :reentrant => true } + cl = Clogger.new(app, o) + @req['rack.multithread'] = false + status, headers, body = cl.call(@req) + assert cl.reentrant? + end + + def test_clogger_auto_reentrant_forced_false + s = '' + body = [] + app = lambda { |env| [302, [ %w(a) ], body ] } + o = { :logger => s, :format => "$request_time", :reentrant => false } + cl = Clogger.new(app, o) + @req['rack.multithread'] = true + status, headers, body = cl.call(@req) + assert ! cl.reentrant? + end + end -- cgit v1.2.3-24-ge0c7