From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: AS6939 64.71.128.0/18 X-Spam-Status: No, score=-1.9 required=3.0 tests=AWL,BAYES_00, MSGID_FROM_MTA_HEADER shortcircuit=no autolearn=unavailable version=3.3.2 Path: news.gmane.org!not-for-mail From: Eric Wong Newsgroups: gmane.comp.lang.ruby.clogger.general Subject: [PATCH] avoid calling "<<" on env["rack.errors"] Date: Sat, 3 Nov 2012 03:12:50 +0000 Message-ID: <20121103031250.GA21670@dcvr.yhbt.net> References: <20121103031250.GA21670@dcvr.yhbt.net> NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit X-Trace: ger.gmane.org 1351912380 396 80.91.229.3 (3 Nov 2012 03:13:00 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Sat, 3 Nov 2012 03:13:00 +0000 (UTC) To: clogger@librelist.org Original-X-From: clogger@librelist.org Sat Nov 03 04:13:07 2012 Return-path: Envelope-to: gcrcg-clogger@m.gmane.org In-Reply-To: <20121103031250.GA21670@dcvr.yhbt.net> List-Archive: List-Help: List-Id: List-Post: List-Subscribe: List-Unsubscribe: Precedence: list Original-Sender: clogger@librelist.org Xref: news.gmane.org gmane.comp.lang.ruby.clogger.general:56 Archived-At: Received: from zedshaw.xen.prgmr.com ([64.71.167.205]) by plane.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1TUUAV-0004Wg-J4 for gcrcg-clogger@m.gmane.org; Sat, 03 Nov 2012 04:13:07 +0100 Received: from zedshaw.xen.prgmr.com (localhost [IPv6:::1]) by zedshaw.xen.prgmr.com (Postfix) with ESMTP id A195321ED28 for ; Sat, 3 Nov 2012 03:24:26 +0000 (UTC) Rack::Lint::ErrorWrapper forbids the "<<" method. This fallback only comes into play when no log destination (via :logger or :path) is specified and is rarely an issue in real setups. --- Pushed to 'master' on git://bogomips.org/clogger ext/clogger_ext/clogger.c | 9 +++++++-- lib/clogger/pure.rb | 10 +++++++++- test/test_clogger.rb | 17 +++++++++++++++++ 3 files changed, 33 insertions(+), 3 deletions(-) diff --git a/ext/clogger_ext/clogger.c b/ext/clogger_ext/clogger.c index 857ed9a..04359f9 100644 --- a/ext/clogger_ext/clogger.c +++ b/ext/clogger_ext/clogger.c @@ -119,6 +119,7 @@ struct clogger { int reentrant; /* tri-state, -1:auto, 1/0 true/false */ }; +static ID write_id; static ID ltlt_id; static ID call_id; static ID each_id; @@ -687,9 +688,12 @@ static VALUE cwrite(struct clogger *c) } else { VALUE logger = c->logger; - if (NIL_P(logger)) + if (NIL_P(logger)) { logger = rb_hash_aref(c->env, g_rack_errors); - rb_funcall(logger, ltlt_id, 1, dst); + rb_funcall(logger, write_id, 1, dst); + } else { + rb_funcall(logger, ltlt_id, 1, dst); + } } return Qnil; @@ -1036,6 +1040,7 @@ void Init_clogger_ext(void) check_clock(); + write_id = rb_intern("write"); ltlt_id = rb_intern("<<"); call_id = rb_intern("call"); each_id = rb_intern("each"); diff --git a/lib/clogger/pure.rb b/lib/clogger/pure.rb index 24392e7..44f4e62 100644 --- a/lib/clogger/pure.rb +++ b/lib/clogger/pure.rb @@ -161,7 +161,7 @@ def time_format(sec, usec, format, div) end def log(env, status, headers) - (@logger || env['rack.errors']) << @fmt_ops.map { |op| + str = @fmt_ops.map { |op| case op[0] when OP_LITERAL; op[1] when OP_REQUEST; byte_xs(env[op[1]] || "-") @@ -182,5 +182,13 @@ def log(env, status, headers) raise "EDOOFUS #{op.inspect}" end }.join('') + + l = @logger + if l + l << str + else + env['rack.errors'].write(str) + end + nil end end diff --git a/test/test_clogger.rb b/test/test_clogger.rb index 10c587a..9bff918 100644 --- a/test/test_clogger.rb +++ b/test/test_clogger.rb @@ -837,4 +837,21 @@ def test_full_uri expect = "\"GET http://example.com/hello?goodbye=true HTTP/1.0\"\n" assert_equal [ expect ], s end + + def test_lint_error_wrapper + require 'rack/lobster' + @req["SERVER_NAME"] = "FOO" + @req["SERVER_PORT"] = "666" + @req["rack.version"] = [1,1] + @req["rack.multithread"] = true + @req["rack.multiprocess"] = true + @req["rack.run_once"] = false + app = Rack::ContentLength.new(Rack::ContentType.new(Rack::Lobster.new)) + cl = Clogger.new(app, format: :Combined) + @req["rack.errors"] = err = StringIO.new + status, headers, body = r = Rack::Lint.new(cl).call(@req) + body.each { |x| assert_kind_of String, x.to_str } + body.close # might raise here + assert_match(%r{GET /hello}, err.string) + end end -- Eric Wong