clogger RubyGem user+dev discussion/patches/pulls/bugs/help
 help / Atom feed
* [PATCH] avoid calling "<<" on env["rack.errors"]
@ 2012-11-03  3:12 Eric Wong
  0 siblings, 0 replies; 1+ messages in thread
From: Eric Wong @ 2012-11-03  3:12 UTC (permalink / raw)
  To: clogger

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


^ permalink raw reply	[flat|nested] 1+ messages in thread

only message in thread, back to index

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-11-03  3:12 [PATCH] avoid calling "<<" on env["rack.errors"] Eric Wong

clogger RubyGem user+dev discussion/patches/pulls/bugs/help

Archives are clonable:
	git clone --mirror https://bogomips.org/clogger-public
	git clone --mirror http://ou63pmih66umazou.onion/clogger-public

Newsgroups are available over NNTP:
	nntp://news.public-inbox.org/inbox.comp.lang.ruby.clogger
	nntp://ou63pmih66umazou.onion/inbox.comp.lang.ruby.clogger

 note: .onion URLs require Tor: https://www.torproject.org/
       or Tor2web: https://www.tor2web.org/

AGPL code for this site: git clone https://public-inbox.org/ public-inbox