clogger 0.0.3 → 0.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/GNUmakefile CHANGED
@@ -72,6 +72,7 @@ release: package Manifest.txt $(release_notes) $(release_changes)
72
72
  clogger clogger $(VERSION) pkg/clogger-$(VERSION).tgz
73
73
  rubyforge add_release -f -n $(release_notes) -a $(release_changes) \
74
74
  clogger clogger_ext $(VERSION) pkg/clogger_ext-$(VERSION).gem
75
+ rake post_news
75
76
  endif
76
77
 
77
78
  .PHONY: test doc Manifest.txt release
data/History.txt CHANGED
@@ -1,3 +1,19 @@
1
+ === 0.0.4 / 2009-09-02
2
+
3
+ The pure Ruby version now escapes with uppercase A-F
4
+ characters to match nginx log output. There are now extra
5
+ checks against badly behaving Rack applications and 500
6
+ errors will be logged before TypeError is raised if the
7
+ application response does not conform (minimally) to Rack
8
+ expectations. Finally, handling of $request (requests
9
+ without "HTTP_VERSION" set in the Rack env) should now be
10
+ logged correctly without unnecessary trailing characters.
11
+
12
+ Hackers: the primary git repository has been moved to
13
+ git://git.bogomips.org/clogger.git for now since I'm having
14
+ issues with pushing to Rubyforge (seems related to Support
15
+ Requests item #26185).
16
+
1
17
  === 0.0.3 / 2009-08-29
2
18
 
3
19
  The MRI extension clogger_ext gets GC bug fix and
data/README.txt CHANGED
@@ -78,13 +78,13 @@ somewhere inside the "Rails::Initializer.run do |config|" block:
78
78
 
79
79
  The latest development happens in git and is published to the following:
80
80
 
81
- git://rubyforge.org/clogger.git
82
- git://git.bogomips.org/mirrors/clogger.git
81
+ git://git.bogomips.org/clogger.git
82
+ git://repo.or.cz/clogger.git
83
83
 
84
84
  You may also browse and download snapshot tarballs:
85
85
 
86
- * http://clogger.rubyforge.org/git?p=clogger.git (gitweb)
87
- * http://git.bogomips.org/cgit/mirrors/clogger.git (cgit)
86
+ * http://git.bogomips.org/cgit/clogger.git (cgit)
87
+ * http://repo.or.cz/w/clogger.git (gitweb)
88
88
 
89
89
  The mailing list (see below) is central for coordination and
90
90
  development. Patches should always be sent inline
@@ -55,7 +55,7 @@ enum clogger_special {
55
55
  CL_SP_response_length,
56
56
  CL_SP_ip,
57
57
  CL_SP_pid,
58
- CL_SP_request_uri,
58
+ CL_SP_request_uri
59
59
  };
60
60
 
61
61
  struct clogger {
@@ -185,7 +185,7 @@ static int str_case_eq(VALUE a, VALUE b)
185
185
  struct response_ops { long nr; VALUE ops; };
186
186
 
187
187
  /* this can be worse than O(M*N) :<... but C loops are fast ... */
188
- static VALUE swap_sent_headers(VALUE kv, VALUE memo)
188
+ static VALUE swap_sent_headers_unsafe(VALUE kv, VALUE memo)
189
189
  {
190
190
  struct response_ops *tmp = (struct response_ops *)memo;
191
191
  VALUE key = rb_obj_as_string(RARRAY_PTR(kv)[0]);
@@ -214,6 +214,15 @@ static VALUE swap_sent_headers(VALUE kv, VALUE memo)
214
214
  return Qnil;
215
215
  }
216
216
 
217
+ static VALUE swap_sent_headers(VALUE kv, VALUE memo)
218
+ {
219
+ if (TYPE(kv) != T_ARRAY)
220
+ rb_raise(rb_eTypeError, "headers not returning pairs");
221
+ if (RARRAY_LEN(kv) < 2)
222
+ rb_raise(rb_eTypeError, "headers not returning pairs");
223
+ return swap_sent_headers_unsafe(kv, memo);
224
+ }
225
+
217
226
  static VALUE sent_headers_ops(struct clogger *c)
218
227
  {
219
228
  struct response_ops tmp;
@@ -452,12 +461,12 @@ static void append_request(struct clogger *c)
452
461
 
453
462
  append_request_uri(c);
454
463
 
455
- rb_str_buf_append(c->log_buf, g_space);
456
-
457
464
  /* HTTP_VERSION can be injected by malicious clients */
458
465
  tmp = rb_hash_aref(c->env, g_HTTP_VERSION);
459
- if (!NIL_P(tmp))
466
+ if (!NIL_P(tmp)) {
467
+ rb_str_buf_append(c->log_buf, g_space);
460
468
  rb_str_buf_append(c->log_buf, byte_xs(tmp));
469
+ }
461
470
  }
462
471
 
463
472
  static void append_request_length(struct clogger *c)
data/lib/clogger.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  # -*- encoding: binary -*-
2
2
  class Clogger
3
- VERSION = '0.0.3'
3
+ VERSION = '0.0.4'
4
4
 
5
5
  OP_LITERAL = 0
6
6
  OP_REQUEST = 1
data/lib/clogger/pure.rb CHANGED
@@ -62,7 +62,7 @@ private
62
62
  def byte_xs(s)
63
63
  s = s.dup
64
64
  s.force_encoding(Encoding::BINARY) if defined?(Encoding::BINARY)
65
- s.gsub!(/(['"\x00-\x1f])/) { |x| "\\x#{$1.unpack('H2').first}" }
65
+ s.gsub!(/(['"\x00-\x1f])/) { |x| "\\x#{$1.unpack('H2').first.upcase}" }
66
66
  s
67
67
  end
68
68
 
@@ -83,11 +83,11 @@ private
83
83
  status = status.to_i
84
84
  status >= 100 && status <= 999 ? ('%03d' % status) : '-'
85
85
  when :request
86
+ version = env['HTTP_VERSION'] and version = " #{byte_xs(version)}"
86
87
  qs = env['QUERY_STRING']
87
88
  qs.empty? or qs = "?#{byte_xs(qs)}"
88
89
  "#{env['REQUEST_METHOD']} " \
89
- "#{request_uri(env)} " \
90
- "#{byte_xs(env['HTTP_VERSION'])}"
90
+ "#{request_uri(env)}#{version}"
91
91
  when :request_uri
92
92
  request_uri(env)
93
93
  when :request_length
@@ -133,7 +133,12 @@ private
133
133
  end
134
134
 
135
135
  def get_sent_header(headers, match)
136
- headers.each { |key, value| match == key.downcase and return value }
136
+ headers.each do |pair|
137
+ Array === pair && pair.size >= 2 or
138
+ raise TypeError, "headers not returning pairs"
139
+ key, value = pair
140
+ match == key.downcase and return value
141
+ end
137
142
  "-"
138
143
  end
139
144
 
data/test/test_clogger.rb CHANGED
@@ -333,6 +333,18 @@ class TestClogger < Test::Unit::TestCase
333
333
  assert_equal expect, str.string
334
334
  end
335
335
 
336
+ # rack allows repeated headers with "\n":
337
+ # { 'Set-Cookie' => "a\nb" } =>
338
+ # Set-Cookie: a
339
+ # Set-Cookie: b
340
+ def test_escape_header_newlines
341
+ str = StringIO.new
342
+ app = lambda { |env| [302, { 'Set-Cookie' => "a\nb" }, [] ] }
343
+ cl = Clogger.new(app, :logger => str, :format => '$sent_http_set_cookie')
344
+ cl.call(@req)
345
+ assert_equal "a\\x0Ab\n", str.string
346
+ end
347
+
336
348
  def test_request_uri_fallback
337
349
  str = StringIO.new
338
350
  app = lambda { |env| [ 200, {}, [] ] }
@@ -373,4 +385,21 @@ class TestClogger < Test::Unit::TestCase
373
385
  assert_match %r{#{e}$}m, str
374
386
  end
375
387
 
388
+ def test_broken_header_response
389
+ str = StringIO.new
390
+ app = lambda { |env| [302, [ %w(a) ], []] }
391
+ cl = Clogger.new(app, :logger => str, :format => '$sent_http_set_cookie')
392
+ assert_raise(TypeError) { cl.call(@req) }
393
+ end
394
+
395
+ def test_http_09_request
396
+ str = StringIO.new
397
+ app = lambda { |env| [302, [ %w(a) ], []] }
398
+ cl = Clogger.new(app, :logger => str, :format => '$request')
399
+ req = @req.dup
400
+ req.delete 'HTTP_VERSION'
401
+ cl.call(req)
402
+ assert_equal "GET /hello?goodbye=true\n", str.string
403
+ end
404
+
376
405
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: clogger
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Eric Wong
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-08-29 00:00:00 -07:00
12
+ date: 2009-09-02 00:00:00 -07:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency