strelka 0.0.1.pre177 → 0.0.1.pre184

Sign up to get free protection for your applications and to get access to all the features.
Files changed (38) hide show
  1. data/ChangeLog +111 -16
  2. data/Manifest.txt +8 -8
  3. data/Rakefile +3 -3
  4. data/bin/leash +51 -28
  5. data/examples/{auth-demo.rb → apps/auth-demo} +3 -3
  6. data/examples/{auth-demo2.rb → apps/auth-demo2} +0 -0
  7. data/examples/{sessions-demo.rb → apps/sessions-demo} +0 -0
  8. data/examples/config.yml +5 -1
  9. data/examples/{examples.css → static/examples.css} +0 -0
  10. data/examples/{examples.html → static/examples.html} +0 -0
  11. data/examples/{auth-form.tmpl → templates/auth-form.tmpl} +0 -0
  12. data/examples/{auth-success.tmpl → templates/auth-success.tmpl} +0 -0
  13. data/examples/{layout.tmpl → templates/layout.tmpl} +0 -0
  14. data/lib/strelka/app/auth.rb +18 -8
  15. data/lib/strelka/app/errors.rb +3 -2
  16. data/lib/strelka/app/filters.rb +2 -0
  17. data/lib/strelka/app/negotiation.rb +2 -0
  18. data/lib/strelka/app/parameters.rb +18 -140
  19. data/lib/strelka/app/plugins.rb +84 -26
  20. data/lib/strelka/app/restresources.rb +26 -18
  21. data/lib/strelka/app/routing.rb +8 -2
  22. data/lib/strelka/app/sessions.rb +7 -0
  23. data/lib/strelka/app/templating.rb +1 -1
  24. data/lib/strelka/app.rb +25 -1
  25. data/lib/strelka/constants.rb +3 -1
  26. data/lib/strelka/paramvalidator.rb +251 -74
  27. data/lib/strelka/session/default.rb +1 -1
  28. data/spec/strelka/app/auth_spec.rb +37 -0
  29. data/spec/strelka/app/errors_spec.rb +0 -2
  30. data/spec/strelka/app/filters_spec.rb +1 -1
  31. data/spec/strelka/app/parameters_spec.rb +4 -92
  32. data/spec/strelka/app/plugins_spec.rb +64 -2
  33. data/spec/strelka/app/restresources_spec.rb +3 -0
  34. data/spec/strelka/app/routing_spec.rb +5 -5
  35. data/spec/strelka/paramvalidator_spec.rb +294 -385
  36. data.tar.gz.sig +0 -0
  37. metadata +126 -46
  38. metadata.gz.sig +0 -0
data/ChangeLog CHANGED
@@ -1,22 +1,100 @@
1
- 2012-04-06 Mahlon E. Smith <mahlon@martini.nu>
1
+ 2012-04-11 Michael Granger <ged@FaerieMUD.org>
2
2
 
3
- * lib/strelka/app/sessions.rb, lib/strelka/cookie.rb,
4
- lib/strelka/cookieset.rb, lib/strelka/session.rb,
5
- lib/strelka/session/db.rb, lib/strelka/session/default.rb,
6
- spec/strelka/cookie_spec.rb, spec/strelka/session/db_spec.rb,
7
- spec/strelka/session/default_spec.rb:
8
- Expose cookie options to the default and db session stores.
9
- [49e538cdee68] [tip]
3
+ * Rakefile, lib/strelka/app.rb, lib/strelka/app/auth.rb,
4
+ lib/strelka/app/errors.rb, lib/strelka/app/filters.rb,
5
+ lib/strelka/app/negotiation.rb, lib/strelka/app/parameters.rb,
6
+ lib/strelka/app/plugins.rb, lib/strelka/app/restresources.rb,
7
+ lib/strelka/app/routing.rb, lib/strelka/app/sessions.rb,
8
+ spec/strelka/app/auth_spec.rb, spec/strelka/app/errors_spec.rb,
9
+ spec/strelka/app/filters_spec.rb, spec/strelka/app/plugins_spec.rb,
10
+ spec/strelka/app/restresources_spec.rb,
11
+ spec/strelka/app/routing_spec.rb:
12
+ Fixing specs broken by the deferred plugins change. Ugh, I suck.
13
+ [d762ebcce3a6] [tip]
10
14
 
11
- * Manifest.txt, lib/strelka/app/sessions.rb, lib/strelka/session.rb,
12
- lib/strelka/session/db.rb, lib/strelka/session/default.rb,
13
- spec/strelka/session/db_spec.rb,
14
- spec/strelka/session/default_spec.rb:
15
- Add a persistent DB session store, using sequel.
16
- [99f3c3f5d6ca]
15
+ * Merging with ssh://hg@deveiate.org/Strelka@8f1c27819e70
16
+ [5fcd76455aad]
17
+
18
+ * Manifest.txt:
19
+ Updating the manifest
20
+ [35165b3d01cc]
21
+
22
+ 2012-04-11 Mahlon E. Smith <mahlon@martini.nu>
23
+
24
+ * lib/strelka/session/default.rb:
25
+ Use the built-in securerandom method for obtaining a hex value.
26
+ [8f1c27819e70]
27
+
28
+ 2012-04-10 Michael Granger <ged@FaerieMUD.org>
29
+
30
+ * lib/strelka/app/auth.rb, lib/strelka/app/parameters.rb,
31
+ lib/strelka/app/restresources.rb, lib/strelka/app/routing.rb,
32
+ lib/strelka/paramvalidator.rb, spec/strelka/app/auth_spec.rb,
33
+ spec/strelka/app/parameters_spec.rb,
34
+ spec/strelka/app/routing_spec.rb,
35
+ spec/strelka/paramvalidator_spec.rb:
36
+ Rework the paramvalidator and parameters plugin to allow per-request
37
+ overrides
38
+ [e7393474988b]
39
+
40
+ * bin/leash, examples/apps/auth-demo, examples/apps/auth-demo2,
41
+ examples/apps/sessions-demo, examples/auth-demo.rb, examples/auth-
42
+ demo2.rb, examples/auth-form.tmpl, examples/auth-success.tmpl,
43
+ examples/config.yml, examples/examples.css, examples/examples.html,
44
+ examples/layout.tmpl, examples/sessions-demo.rb,
45
+ examples/static/examples.css, examples/static/examples.html,
46
+ examples/templates/auth-form.tmpl, examples/templates/auth-
47
+ success.tmpl, examples/templates/layout.tmpl, lib/strelka/app.rb,
48
+ lib/strelka/app/auth.rb, lib/strelka/app/plugins.rb,
49
+ lib/strelka/constants.rb, spec/strelka/app/plugins_spec.rb:
50
+ Modify the plugins mixin to defer adding the mixin part of plugins
51
+ as long as possible.
52
+
53
+ This allows someone to call plugin/plugins multiple times without
54
+ having to worry about what order they're called in, and makes using
55
+ a common Strelka::App subclass for a suite of applications easier.
56
+ [546809f3204f]
57
+
58
+ 2012-04-09 Mahlon E. Smith <mahlon@martini.nu>
59
+
60
+ * lib/strelka/app/templating.rb:
61
+ Ensure the templating plugin runs before the errors plugin, so
62
+ symbols are properly converted to Strelka::HTTPResponse objects
63
+ before errors see them.
64
+ [9423c8ba3ee0]
17
65
 
18
66
  2012-04-06 Michael Granger <ged@FaerieMUD.org>
19
67
 
68
+ * lib/strelka/session/db.rb:
69
+ Change the DB session class to default to Mongrel2's in-memory DB.
70
+
71
+ Use Mongrel2's in-memory config db for unconfigured db sessions
72
+ instead of depending on the sqlite3 gem.
73
+ [2a1129fed218]
74
+
75
+ * Manifest.txt:
76
+ Update the manifest
77
+ [54d6bde6cb0c]
78
+
79
+ * Merged with 49e538cdee68
80
+ [05d72a2ed8cc]
81
+
82
+ * lib/strelka.rb:
83
+ Set some RDoc metadata from the main module
84
+ [28465ed81190]
85
+
86
+ * lib/strelka/logging.rb:
87
+ Remove ERB dependency from the HTML logger
88
+ [6e6a14f86dc6]
89
+
90
+ * spec/lib/helpers.rb:
91
+ Update the setup_config_db helper for Mongrel2-0.20.x
92
+ [9f5393deb2da]
93
+
94
+ * .hgignore:
95
+ Add the ChangeLog to the ignorefile
96
+ [cc8c30d38652]
97
+
20
98
  * lib/strelka/app/templating.rb:
21
99
  Add API docs to the :templating plugin module
22
100
  [3c160d996320]
@@ -33,11 +111,28 @@
33
111
  Update dependencies
34
112
  [787e523777d1]
35
113
 
114
+ 2012-04-06 Mahlon E. Smith <mahlon@martini.nu>
115
+
116
+ * lib/strelka/app/sessions.rb, lib/strelka/cookie.rb,
117
+ lib/strelka/cookieset.rb, lib/strelka/session.rb,
118
+ lib/strelka/session/db.rb, lib/strelka/session/default.rb,
119
+ spec/strelka/cookie_spec.rb, spec/strelka/session/db_spec.rb,
120
+ spec/strelka/session/default_spec.rb:
121
+ Expose cookie options to the default and db session stores.
122
+ [49e538cdee68]
123
+
124
+ * Manifest.txt, lib/strelka/app/sessions.rb, lib/strelka/session.rb,
125
+ lib/strelka/session/db.rb, lib/strelka/session/default.rb,
126
+ spec/strelka/session/db_spec.rb,
127
+ spec/strelka/session/default_spec.rb:
128
+ Add a persistent DB session store, using sequel.
129
+ [99f3c3f5d6ca]
130
+
36
131
  2012-04-04 Michael Granger <ged@FaerieMUD.org>
37
132
 
38
133
  * manual/src/tutorial.page:
39
134
  Add a bit more content to the manual.
40
- [79a26c9e4dd5] [github/master]
135
+ [79a26c9e4dd5]
41
136
 
42
137
  2012-04-02 Michael Granger <ged@FaerieMUD.org>
43
138
 
@@ -88,7 +183,7 @@
88
183
  * examples/auth-demo.rb, lib/strelka/app/auth.rb,
89
184
  lib/strelka/authprovider.rb, spec/strelka/app/auth_spec.rb:
90
185
  Merging with accidentally-committed auth patch on Github
91
- [3025b5711352]
186
+ [3025b5711352] [github/master]
92
187
 
93
188
  2012-03-20 Michael Granger <ged@FaerieMUD.org>
94
189
 
data/Manifest.txt CHANGED
@@ -16,16 +16,16 @@ contrib/hoetemplate/data/project/templates/top.tmpl.erb
16
16
  contrib/hoetemplate/lib/file_name.rb.erb
17
17
  contrib/hoetemplate/spec/file_name_spec.rb.erb
18
18
  data/strelka/apps/hello-world
19
- examples/auth-demo.rb
20
- examples/auth-demo2.rb
21
- examples/auth-form.tmpl
22
- examples/auth-success.tmpl
19
+ examples/apps/auth-demo
20
+ examples/apps/auth-demo2
21
+ examples/apps/sessions-demo
23
22
  examples/config.yml
24
- examples/examples.css
25
- examples/examples.html
26
23
  examples/gen-config.rb
27
- examples/layout.tmpl
28
- examples/sessions-demo.rb
24
+ examples/static/examples.css
25
+ examples/static/examples.html
26
+ examples/templates/auth-form.tmpl
27
+ examples/templates/auth-success.tmpl
28
+ examples/templates/layout.tmpl
29
29
  lib/strelka.rb
30
30
  lib/strelka/app.rb
31
31
  lib/strelka/app/auth.rb
data/Rakefile CHANGED
@@ -25,11 +25,11 @@ hoespec = Hoe.spec 'strelka' do
25
25
  self.dependency 'highline', '~> 1.6'
26
26
  self.dependency 'sysexits', '~> 1.0'
27
27
  self.dependency 'formvalidator', '~> 0.1'
28
- self.dependency 'inversion ', '~> 0.8'
28
+ self.dependency 'inversion', '~> 0.8'
29
29
  self.dependency 'mongrel2', '~> 0.20'
30
- self.dependency 'uuidtools ', '~> 2.1'
30
+ self.dependency 'uuidtools', '~> 2.1'
31
31
  self.dependency 'configurability', '~> 1.0'
32
- self.dependency 'pluginfactory ', '~> 1.0'
32
+ self.dependency 'pluginfactory', '~> 1.0'
33
33
 
34
34
  self.dependency 'hoe-deveiate', '~> 0.1', :developer
35
35
  self.dependency 'hoe-manualgen', '~> 0.3', :developer
data/bin/leash CHANGED
@@ -103,7 +103,7 @@ class Strelka::LeashCommand
103
103
  text ''
104
104
 
105
105
  text 'Global Options'
106
- opt :config, "Specify the config file to load."
106
+ opt :config, "Specify the config file to load.", :type => :string
107
107
  text ''
108
108
 
109
109
  text 'Other Options:'
@@ -163,7 +163,7 @@ class Strelka::LeashCommand
163
163
  ### Create a new instance of the command and set it up with the given
164
164
  ### +options+.
165
165
  def initialize( options )
166
- Strelka.logger.formatter = Strelka::Logging::ColorFormatter.new( Strelka.logger )
166
+ Strelka.logger.formatter = Strelka::Logging::ColorFormatter.new( Strelka.logger ) if $stderr.tty?
167
167
  @options = options
168
168
 
169
169
  if @options.debug
@@ -196,8 +196,8 @@ class Strelka::LeashCommand
196
196
 
197
197
  begin
198
198
  cmd_method = self.method( "#{command}_command" )
199
- rescue NoMethodError => err
200
- error "No such command"
199
+ rescue NameError => err
200
+ error "No such command %p" % [ command ]
201
201
  exit :usage
202
202
  end
203
203
 
@@ -264,8 +264,19 @@ class Strelka::LeashCommand
264
264
 
265
265
  ### The 'start' command
266
266
  def start_command( *args )
267
+ path, appname, gemname = self.find_specified_app( *args )
268
+
269
+ header "Starting the %s app from the %s gem" % [ appname, gemname ]
270
+ fork do
271
+ self.log.debug " in the child."
272
+ Strelka.load_config( self.options.config ) if self.options.config
273
+ Kernel.load( path )
274
+ end
275
+
276
+ message "started. Waiting for shutdown."
277
+ Process.wait
267
278
  end
268
- help :start, "Start the web adminstration app"
279
+ help :start, "Start a Strelka app"
269
280
 
270
281
 
271
282
  ### The 'version' command
@@ -276,36 +287,48 @@ class Strelka::LeashCommand
276
287
 
277
288
 
278
289
  #
279
- # Command functions
290
+ # Helper methods
280
291
  #
281
292
 
282
- ### Install a bootstrap config database for the admin server.
283
- def setup_bootstrap_config
284
- Mongrel2::Config.init_database
285
-
286
- if Mongrel2::Config::Server.by_uuid( ADMINSERVER_ID ).first
287
- message "Admin server is already configured"
288
- if !self.prompt.agree( "Replace the existing config? ", true )
289
- message "Okay, keeping the existing config."
290
- return
293
+ ### Find the app specified in the specified +args+ and return the Pathname to it and the
294
+ ### name of the gem it belongs to. Raises a RuntimeError if the +args+ didn't contain a
295
+ ### valid application specification.
296
+ def find_specified_app( *args )
297
+ appname = args.pop
298
+ gemname = args.pop
299
+ discovered_apps = Strelka::App.discover_paths
300
+
301
+ path = nil
302
+ if gemname
303
+ discovered_apps[ gemname ].each do |apppath|
304
+ self.log.debug " %s (%s)" % [ apppath, apppath.basename('.rb') ]
305
+ if apppath.basename('.rb').to_s == appname
306
+ path = apppath
307
+ break
308
+ end
309
+ end
310
+ else
311
+ self.log.debug "No gem name; searching them all:"
312
+ discovered_apps.each do |disc_gemname, paths|
313
+ self.log.debug " %s: %d paths" % [ disc_gemname, paths.length ]
314
+ path = paths.find do |apppath|
315
+ self.log.debug " %s (%s)" % [ apppath, apppath.basename('.rb') ]
316
+ self.log.debug " %p vs. %p" % [ apppath.basename('.rb').to_s, appname ]
317
+ apppath.basename('.rb').to_s == appname
318
+ end or next
319
+ gemname = disc_gemname
320
+ break
291
321
  end
292
322
  end
293
323
 
294
- configfile = DATADIR + 'bootstrap-config.rb'
295
- runspace = Module.new do
296
- extend Mongrel2::Config::DSL, FileUtils::Verbose
324
+ unless path
325
+ msg = "Couldn't find an app named '#{appname}'"
326
+ msg << " in the #{gemname} gem" if gemname
327
+ raise( msg )
297
328
  end
329
+ self.log.debug " found: %s" % [ path ]
298
330
 
299
- header "Installing admin server config from #{configfile}"
300
- source = configfile.read
301
- runspace.module_eval( source, configfile.to_s, 1 )
302
- end
303
-
304
-
305
- ### Set up the mongrel2 chroot directory for Strelka's adminserver by copying static
306
- ### files, and creating the necessary directories. This depends on the configuration
307
- ### being installed.
308
- def setup_runtime_directory
331
+ return path, appname, gemname
309
332
  end
310
333
 
311
334
 
@@ -9,9 +9,11 @@ class AuthDemo < Strelka::App
9
9
  # The Mongrel2 appid of this app
10
10
  ID = 'auth-demo'
11
11
 
12
- plugins :routing, :auth
12
+ plugin :auth
13
13
  auth_provider :basic
14
14
 
15
+ plugin :routing
16
+
15
17
  ### Handle any (authenticated) HTTP request
16
18
  get do |req|
17
19
  res = req.response
@@ -27,6 +29,4 @@ class AuthDemo < Strelka::App
27
29
 
28
30
  end # class AuthDemo
29
31
 
30
-
31
- Strelka.load_config( 'examples/config.yml' )
32
32
  AuthDemo.run
File without changes
File without changes
data/examples/config.yml CHANGED
@@ -1,5 +1,5 @@
1
1
  mongrel2:
2
- configdb: examples/mongrel2.sqlite
2
+ configdb: amalgalite://examples/mongrel2.sqlite
3
3
 
4
4
  auth:
5
5
  realm: Examples
@@ -13,3 +13,7 @@ sessions:
13
13
  options:
14
14
  cookie-name: "session-demo"
15
15
 
16
+ templates:
17
+ template_paths:
18
+ - examples/templates
19
+
File without changes
File without changes
File without changes
@@ -31,7 +31,7 @@ require 'strelka/authprovider'
31
31
  #
32
32
  # == Applying Authentication
33
33
  #
34
- # The default authentication policy is to require authentification from every
34
+ # The default authentication policy is to require authentication from every
35
35
  # request, but sometimes you may wish to narrow the restrictions a bit.
36
36
  #
37
37
  # === Relaxing \Auth for A Few Methods
@@ -51,7 +51,8 @@ require 'strelka/authprovider'
51
51
  # A String or a Regexp argument will be used to match against the request's
52
52
  # {#app_path}[rdoc-ref:Strelka::HTTPRequest#app_path] (the path of the request
53
53
  # URI with the Mongrel2 route omitted), and any requests which match are sent
54
- # along as-is.
54
+ # along as-is. A String will match the path exactly, with any leading or trailing
55
+ # '/' characters removed, and a Regexp will be tested against the \#app_path as-is.
55
56
  #
56
57
  # If you require some more-complex criteria for determining if the request should
57
58
  # skip the auth plugin, you can provide a block to +no_auth_for+ instead.
@@ -325,10 +326,12 @@ module Strelka::App::Auth
325
326
  "defining both positive and negative auth criteria is unsupported."
326
327
  end
327
328
 
328
- criteria << '' if criteria.empty?
329
+ criteria << nil if criteria.empty?
329
330
  block ||= Proc.new { true }
330
331
 
331
332
  criteria.each do |pattern|
333
+ pattern.gsub!( %r{^/+|/+$}, '' ) if pattern.respond_to?( :gsub! )
334
+ Strelka.log.debug " adding require_auth for %p" % [ pattern ]
332
335
  self.positive_auth_criteria[ pattern ] = block
333
336
  end
334
337
  end
@@ -342,10 +345,12 @@ module Strelka::App::Auth
342
345
  "defining both positive and negative auth criteria is unsupported."
343
346
  end
344
347
 
345
- criteria << '' if criteria.empty?
348
+ criteria << nil if criteria.empty?
346
349
  block ||= Proc.new { true }
347
350
 
348
351
  criteria.each do |pattern|
352
+ pattern.gsub!( %r{^/+|/+$}, '' ) if pattern.respond_to?( :gsub! )
353
+ Strelka.log.debug " adding no_auth for %p" % [ pattern ]
349
354
  self.negative_auth_criteria[ pattern ] = block
350
355
  end
351
356
  end
@@ -382,7 +387,7 @@ module Strelka::App::Auth
382
387
  ### Check authentication and authorization for requests that need it before
383
388
  ### sending them on.
384
389
  def handle_request( request, &block )
385
- self.log.debug "AuthProvider: %p" % [ self.auth_provider ]
390
+ self.log.debug "[:auth] Wrapping request in auth with a %p" % [ self.auth_provider ]
386
391
 
387
392
  self.authenticate_and_authorize( request ) if self.request_should_auth?( request )
388
393
 
@@ -396,7 +401,7 @@ module Strelka::App::Auth
396
401
 
397
402
  ### Returns +true+ if the given +request+ requires authentication.
398
403
  def request_should_auth?( request )
399
- self.log.debug "Checking to see if Auth(entication/orization) should be applied for %s" %
404
+ self.log.debug "Checking to see if Auth(entication/orization) should be applied for app_path: %p" %
400
405
  [ request.app_path ]
401
406
 
402
407
  # If there are positive criteria, return true if the request matches any of them,
@@ -430,6 +435,10 @@ module Strelka::App::Auth
430
435
  ### at least one of them.
431
436
  def request_matches_criteria( request, pattern )
432
437
  case pattern
438
+ when nil
439
+ self.log.debug " no pattern; calling the block"
440
+ return yield( request )
441
+
433
442
  when Regexp
434
443
  self.log.debug " matching app_path with regexp: %p" % [ pattern ]
435
444
  matchdata = pattern.match( request.app_path ) or return false
@@ -437,8 +446,8 @@ module Strelka::App::Auth
437
446
  return yield( request, matchdata )
438
447
 
439
448
  when String
440
- self.log.debug " matching app_path prefix: %p" % [ pattern ]
441
- request.app_path.start_with?( pattern ) or return false
449
+ self.log.debug " matching app_path: %p" % [ pattern ]
450
+ request.app_path.gsub( %r{^/+|/+$}, '' ) == pattern or return false
442
451
  self.log.debug " calling the block"
443
452
  return yield( request )
444
453
 
@@ -475,6 +484,7 @@ module Strelka::App::Auth
475
484
  provider.authorize( credentials, request, &callback )
476
485
  end
477
486
 
487
+
478
488
  end # module Strelka::App::Auth
479
489
 
480
490
 
@@ -113,6 +113,7 @@ module Strelka::App::Errors
113
113
 
114
114
  ### Check for a status response that is hooked, and run the hook if one is found.
115
115
  def handle_request( request )
116
+ self.log.debug "[:errors] Wrapping request in custom error-handling."
116
117
  response = nil
117
118
 
118
119
  # Catch a finish_with; the status_response will only be non-nil
@@ -126,7 +127,7 @@ module Strelka::App::Errors
126
127
  if status_response
127
128
  response = request.response
128
129
  status = status_response[:status]
129
- self.log.info "Handling a status response: %d" % [ status ]
130
+ self.log.info "[:errors] Handling a status response: %d" % [ status ]
130
131
 
131
132
  # If we can't find a custom handler for this status, re-throw
132
133
  # to the default handler instead
@@ -145,7 +146,7 @@ module Strelka::App::Errors
145
146
 
146
147
  ### Find a status handler for the given +status_code+ and return it as an UnboundMethod.
147
148
  def status_handler_for( status_code )
148
- self.log.debug "Looking for a status handler for %d responses" % [ status_code ]
149
+ self.log.debug "[:errors] Looking for a status handler for %d responses" % [ status_code ]
149
150
  handlers = self.class.status_handlers
150
151
  ranges = handlers.keys
151
152
 
@@ -51,6 +51,8 @@ module Strelka::App::Filters
51
51
  ### Apply filters to the given +request+ before yielding back to the App, then apply
52
52
  ### filters to the response that comes back.
53
53
  def handle_request( request )
54
+ self.log.debug "[:filters] Wrapping request with request/response filters."
55
+
54
56
  self.apply_request_filters( request )
55
57
  response = super
56
58
  self.apply_response_filters( response )
@@ -83,6 +83,8 @@ module Strelka::App::Negotiation
83
83
 
84
84
  ### Start content-negotiation when the response has returned.
85
85
  def handle_request( request )
86
+ self.log.debug "[:negotiation] Wrapping response with HTTP content negotiation."
87
+
86
88
  response = super
87
89
  response.negotiate
88
90