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.
- data/ChangeLog +111 -16
- data/Manifest.txt +8 -8
- data/Rakefile +3 -3
- data/bin/leash +51 -28
- data/examples/{auth-demo.rb → apps/auth-demo} +3 -3
- data/examples/{auth-demo2.rb → apps/auth-demo2} +0 -0
- data/examples/{sessions-demo.rb → apps/sessions-demo} +0 -0
- data/examples/config.yml +5 -1
- data/examples/{examples.css → static/examples.css} +0 -0
- data/examples/{examples.html → static/examples.html} +0 -0
- data/examples/{auth-form.tmpl → templates/auth-form.tmpl} +0 -0
- data/examples/{auth-success.tmpl → templates/auth-success.tmpl} +0 -0
- data/examples/{layout.tmpl → templates/layout.tmpl} +0 -0
- data/lib/strelka/app/auth.rb +18 -8
- data/lib/strelka/app/errors.rb +3 -2
- data/lib/strelka/app/filters.rb +2 -0
- data/lib/strelka/app/negotiation.rb +2 -0
- data/lib/strelka/app/parameters.rb +18 -140
- data/lib/strelka/app/plugins.rb +84 -26
- data/lib/strelka/app/restresources.rb +26 -18
- data/lib/strelka/app/routing.rb +8 -2
- data/lib/strelka/app/sessions.rb +7 -0
- data/lib/strelka/app/templating.rb +1 -1
- data/lib/strelka/app.rb +25 -1
- data/lib/strelka/constants.rb +3 -1
- data/lib/strelka/paramvalidator.rb +251 -74
- data/lib/strelka/session/default.rb +1 -1
- data/spec/strelka/app/auth_spec.rb +37 -0
- data/spec/strelka/app/errors_spec.rb +0 -2
- data/spec/strelka/app/filters_spec.rb +1 -1
- data/spec/strelka/app/parameters_spec.rb +4 -92
- data/spec/strelka/app/plugins_spec.rb +64 -2
- data/spec/strelka/app/restresources_spec.rb +3 -0
- data/spec/strelka/app/routing_spec.rb +5 -5
- data/spec/strelka/paramvalidator_spec.rb +294 -385
- data.tar.gz.sig +0 -0
- metadata +126 -46
- metadata.gz.sig +0 -0
@@ -35,13 +35,6 @@ require 'strelka/paramvalidator'
|
|
35
35
|
#
|
36
36
|
# end # class UserManager
|
37
37
|
#
|
38
|
-
#
|
39
|
-
# == To-Do
|
40
|
-
#
|
41
|
-
# _We may add support for other ways of passing parameters later,
|
42
|
-
# e.g., via structured entity bodies like JSON, XML, YAML, etc_.
|
43
|
-
#
|
44
|
-
#
|
45
38
|
module Strelka::App::Parameters
|
46
39
|
extend Strelka::App::Plugin
|
47
40
|
|
@@ -52,114 +45,32 @@ module Strelka::App::Parameters
|
|
52
45
|
# Class methods to add to classes with routing.
|
53
46
|
module ClassMethods # :nodoc:
|
54
47
|
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
PARAMETER_DEFAULT_OPTIONS = {
|
60
|
-
:constraint => //,
|
61
|
-
:required => false,
|
62
|
-
:description => nil,
|
63
|
-
}
|
64
|
-
|
65
|
-
# Pattern to use to strip binding operators from parameter patterns so they
|
66
|
-
# can be used in the middle of routing Regexps.
|
67
|
-
PARAMETER_PATTERN_STRIP_RE = Regexp.union( '^', '$', '\\A', '\\z', '\\Z' )
|
68
|
-
|
69
|
-
# Options that are passed as Symbols to .param
|
70
|
-
FLAGS = [ :required, :untaint ]
|
71
|
-
|
72
|
-
|
73
|
-
# Default parameters hash
|
74
|
-
@parameters = {}
|
75
|
-
@untaint_all_constraints = false
|
76
|
-
|
77
|
-
# The hash of declared parameters
|
78
|
-
attr_reader :parameters
|
79
|
-
|
80
|
-
# The flag for untainting constrained parameters that match their constraints
|
81
|
-
attr_writer :untaint_all_constraints
|
48
|
+
##
|
49
|
+
# Default ParamValidator
|
50
|
+
@paramvalidator = Strelka::ParamValidator.new
|
51
|
+
attr_reader :paramvalidator
|
82
52
|
|
83
53
|
|
54
|
+
### :call-seq:
|
55
|
+
### param( name, *flags )
|
56
|
+
### param( name, constraint, *flags )
|
57
|
+
### param( name, description, *flags )
|
58
|
+
### param( name, constraint, description, *flags )
|
59
|
+
###
|
84
60
|
### Declare a parameter with the specified +name+ that will be validated using the given
|
85
61
|
### +constraint+. The +constraint+ can be any of the types supported by
|
86
62
|
### Strelka::ParamValidator.
|
87
|
-
### :call-seq:
|
88
|
-
# param( name, *flags )
|
89
|
-
# param( name, constraint, *flags )
|
90
|
-
# param( name, description, *flags )
|
91
|
-
# param( name, constraint, description, *flags )
|
92
63
|
def param( name, *args )
|
93
64
|
Strelka.log.debug "New param %p" % [ name ]
|
94
|
-
name
|
95
|
-
|
96
|
-
# Consume the arguments
|
97
|
-
constraint = args.shift unless args.first.is_a?( String ) || FLAGS.include?( args.first )
|
98
|
-
constraint ||= name
|
99
|
-
description = args.shift if args.first.is_a?( String )
|
100
|
-
# description ||= name.to_s.capitalize
|
101
|
-
flags = args
|
102
|
-
|
103
|
-
# Give a regexp constraint a named capture group for the constraint name if it
|
104
|
-
# doesn't already have one
|
105
|
-
if constraint.is_a?( Regexp )
|
106
|
-
constraint = Regexp.compile( "(?<#{name}>" + constraint.to_s + ")" ) unless
|
107
|
-
constraint.names.include?( name.to_s )
|
108
|
-
Strelka.log.debug " regex constraint is: %p" % [ constraint ]
|
109
|
-
end
|
110
|
-
|
111
|
-
# Merge the param into the parameters hash
|
112
|
-
options = PARAMETER_DEFAULT_OPTIONS.dup
|
113
|
-
options[ :constraint ] = constraint
|
114
|
-
options[ :description ] = description
|
115
|
-
options[ :required ] = true if flags.include?( :required )
|
116
|
-
options[ :untaint ] = true if flags.include?( :untaint )
|
117
|
-
Strelka.log.debug " param options are: %p" % [ options ]
|
118
|
-
|
119
|
-
self.parameters[ name ] = options
|
65
|
+
self.paramvalidator.add( name, *args )
|
120
66
|
end
|
121
67
|
|
122
68
|
|
123
69
|
### Get/set the untainting flag. If set, all parameters which match their constraints
|
124
70
|
### will also be untainted.
|
125
71
|
def untaint_all_constraints( newval=nil )
|
126
|
-
|
127
|
-
|
128
|
-
return @untaint_all_constraints
|
129
|
-
end
|
130
|
-
|
131
|
-
|
132
|
-
### Turn the constraint associated with +name+ into a routing component.
|
133
|
-
def extract_route_from_constraint( name )
|
134
|
-
name.slice!( 0, 1 ) if name.start_with?( ':' )
|
135
|
-
Strelka.log.debug " searching for a param for %p" % [ name ]
|
136
|
-
param = self.parameters[ name.to_sym ] or
|
137
|
-
raise ScriptError, "no parameter %p defined" % [ name ]
|
138
|
-
|
139
|
-
# Munge the constraint into a Regexp
|
140
|
-
constraint = param[ :constraint ]
|
141
|
-
re = case constraint
|
142
|
-
when Regexp
|
143
|
-
constraint
|
144
|
-
when Array
|
145
|
-
sub_res = constraint.map( &self.method(:extract_route_from_constraint) )
|
146
|
-
Regexp.union( sub_res )
|
147
|
-
when Symbol
|
148
|
-
re = Strelka::ParamValidator.pattern_for_constraint( constraint ) or
|
149
|
-
raise ScriptError, "no pattern for %p constraint" % [ constraint ]
|
150
|
-
/(?<#{name}>#{re})/
|
151
|
-
else
|
152
|
-
raise ScriptError,
|
153
|
-
"can't route on a parameter with a %p constraint %p" % [ constraint.class ]
|
154
|
-
end
|
155
|
-
|
156
|
-
# Unbind the pattern from beginning or end of line.
|
157
|
-
# :TODO: This is pretty ugly. Find a better way of modifying the regex.
|
158
|
-
re_str = re.to_s.
|
159
|
-
sub( %r{\(\?[\-mix]+:(.*)\)}, '\\1' ).
|
160
|
-
gsub( PARAMETER_PATTERN_STRIP_RE, '' )
|
161
|
-
|
162
|
-
return Regexp.new( re_str, re.options )
|
72
|
+
self.paramvalidator.untaint_all = newval unless newval.nil?
|
73
|
+
return self.paramvalidator.untaint_all?
|
163
74
|
end
|
164
75
|
|
165
76
|
|
@@ -167,7 +78,7 @@ module Strelka::App::Parameters
|
|
167
78
|
### declarations, too.
|
168
79
|
def inherited( subclass )
|
169
80
|
super
|
170
|
-
subclass.instance_variable_set( :@
|
81
|
+
subclass.instance_variable_set( :@paramvalidator, self.paramvalidator.dup )
|
171
82
|
end
|
172
83
|
|
173
84
|
end # module ClassMethods
|
@@ -176,48 +87,15 @@ module Strelka::App::Parameters
|
|
176
87
|
|
177
88
|
### Add a ParamValidator to the given +request+ before passing it on.
|
178
89
|
def handle_request( request, &block )
|
179
|
-
|
180
|
-
self.log.debug "Applying validator profile: %p" % [ profile ]
|
181
|
-
validator = Strelka::ParamValidator.new( profile, request.params )
|
182
|
-
self.log.debug " validator: %p" % [ validator ]
|
90
|
+
self.log.debug "[:parameters] Wrapping request with parameter validation."
|
183
91
|
|
92
|
+
validator = self.class.paramvalidator.dup
|
93
|
+
validator.validate( request.params )
|
184
94
|
request.params = validator
|
185
|
-
super
|
186
|
-
end
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
### Make a validator profile for Strelka::ParamValidator for the specified
|
191
|
-
### +request+ using the declared parameters in the App, returning it as a Hash.
|
192
|
-
def make_validator_profile( request )
|
193
|
-
profile = {
|
194
|
-
:required => [],
|
195
|
-
:optional => [],
|
196
|
-
:descriptions => {},
|
197
|
-
:constraints => {},
|
198
|
-
:untaint_constraint_fields => [],
|
199
|
-
:untaint_all_constraints => self.class.untaint_all_constraints,
|
200
|
-
}
|
201
95
|
|
202
|
-
|
203
|
-
|
204
|
-
return self.class.parameters.inject( profile ) do |accum, (name, opts)|
|
205
|
-
self.log.debug " adding parameter: %p: %p" % [ name, opts ]
|
206
|
-
if opts[:required]
|
207
|
-
accum[:required] << name
|
208
|
-
else
|
209
|
-
accum[:optional] << name
|
210
|
-
end
|
211
|
-
|
212
|
-
accum[:untaint_constraint_fields] << name if opts[:untaint]
|
213
|
-
accum[:descriptions][ name ] = opts[:description] if opts[:description]
|
214
|
-
accum[:constraints][ name ] = opts[:constraint]
|
215
|
-
|
216
|
-
accum
|
217
|
-
end
|
96
|
+
super
|
218
97
|
end
|
219
98
|
|
220
|
-
|
221
99
|
end # module Strelka::App::Parameters
|
222
100
|
|
223
101
|
|
data/lib/strelka/app/plugins.rb
CHANGED
@@ -118,16 +118,59 @@ class Strelka::App
|
|
118
118
|
end
|
119
119
|
|
120
120
|
|
121
|
-
### Extension callback -- add instance variables to extending objects.
|
122
|
-
def self::extended( object )
|
123
|
-
super
|
124
|
-
object.instance_variable_set( :@plugins, {} )
|
125
|
-
end
|
126
|
-
|
127
|
-
|
128
121
|
### Class methods to add to classes with plugins.
|
129
122
|
module ClassMethods
|
130
123
|
|
124
|
+
##
|
125
|
+
# If plugins have already been installed, this will be the call frame
|
126
|
+
# they were first installed from. This is used to warn about installing
|
127
|
+
# plugins twice.
|
128
|
+
attr_accessor :plugins_installed_from
|
129
|
+
|
130
|
+
|
131
|
+
### Returns +true+ if the plugins for the extended app class have already
|
132
|
+
### been installed.
|
133
|
+
def plugins_installed?
|
134
|
+
return !self.plugins_installed_from.nil?
|
135
|
+
end
|
136
|
+
|
137
|
+
|
138
|
+
### Extension callback -- add instance variables to extending objects.
|
139
|
+
def inherited( subclass )
|
140
|
+
super
|
141
|
+
@plugins ||= []
|
142
|
+
subclass.instance_variable_set( :@plugins, @plugins.dup )
|
143
|
+
subclass.instance_variable_set( :@plugins_installed_from, nil )
|
144
|
+
end
|
145
|
+
|
146
|
+
|
147
|
+
### Load the plugins with the given +names+ and install them.
|
148
|
+
def plugins( *names )
|
149
|
+
Strelka.log.info "Adding plugins: %s" % [ names.flatten.map(&:to_s).join(', ') ]
|
150
|
+
|
151
|
+
# Load the associated Plugin Module objects
|
152
|
+
names.flatten.each {|name| self.load_plugin(name) }
|
153
|
+
|
154
|
+
# Add the name/s to the list of mixins to apply on startup
|
155
|
+
@plugins |= names
|
156
|
+
|
157
|
+
# Install the declarative half of the plugin immediately
|
158
|
+
names.each do |name|
|
159
|
+
plugin = nil
|
160
|
+
|
161
|
+
if name.is_a?( Module )
|
162
|
+
plugin = name
|
163
|
+
else
|
164
|
+
plugin = Strelka::App.loaded_plugins[ name ]
|
165
|
+
end
|
166
|
+
|
167
|
+
Strelka.log.debug " registering %p" % [ name ]
|
168
|
+
self.register_plugin( plugin )
|
169
|
+
end
|
170
|
+
end
|
171
|
+
alias_method :plugin, :plugins
|
172
|
+
|
173
|
+
|
131
174
|
### Load the plugin with the given +name+
|
132
175
|
def load_plugin( name )
|
133
176
|
|
@@ -146,11 +189,10 @@ class Strelka::App
|
|
146
189
|
end
|
147
190
|
|
148
191
|
|
149
|
-
###
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
192
|
+
### Register the plugin +mod+ in the receiving class. This adds any
|
193
|
+
### declaratives and class-level data necessary for configuring the
|
194
|
+
### plugin.
|
195
|
+
def register_plugin( mod )
|
154
196
|
if mod.const_defined?( :ClassMethods )
|
155
197
|
cm_mod = mod.const_get(:ClassMethods)
|
156
198
|
Strelka.log.debug " adding class methods from %p" % [ cm_mod ]
|
@@ -172,27 +214,43 @@ class Strelka::App
|
|
172
214
|
end
|
173
215
|
|
174
216
|
|
175
|
-
###
|
176
|
-
|
177
|
-
|
178
|
-
|
217
|
+
### Install the mixin part of plugins immediately before the first instance
|
218
|
+
### is created.
|
219
|
+
def new( * )
|
220
|
+
self.install_plugins unless self.plugins_installed?
|
221
|
+
super
|
222
|
+
end
|
223
|
+
|
224
|
+
|
225
|
+
### Install the mixin part of the plugin, in the order determined by
|
226
|
+
### the plugin registry based on the run_before and run_after specifications
|
227
|
+
### of the plugins themselves.
|
228
|
+
def install_plugins
|
229
|
+
if self.plugins_installed?
|
230
|
+
Strelka.log.warn "Plugins were already installed for %p from %p" %
|
231
|
+
[ self, self.plugins_installed_from ]
|
232
|
+
Strelka.log.info "I'll attempt to install any new ones, but plugin ordering"
|
233
|
+
Strelka.log.info "and other functionality might exhibit strange behavior."
|
234
|
+
else
|
235
|
+
Strelka.log.info "Installing plugins for %p." % [ self ]
|
236
|
+
end
|
179
237
|
|
180
238
|
sorted_plugins = Strelka::App.loaded_plugins.tsort.reverse
|
181
|
-
Strelka.log.debug "Sorted plugins: app -> %p <- Mongrel2" % [ sorted_plugins ]
|
182
239
|
|
183
|
-
# Install the plugins in reverse-sorted order
|
184
240
|
sorted_plugins.each do |name|
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
Strelka.log.debug "
|
189
|
-
|
190
|
-
else
|
191
|
-
Strelka.log.debug " not used by this app; skipping"
|
241
|
+
mod = Strelka::App.loaded_plugins[ name ]
|
242
|
+
|
243
|
+
unless @plugins.include?( name ) || @plugins.include?( mod )
|
244
|
+
Strelka.log.debug " skipping %s" % [ name ]
|
245
|
+
next
|
192
246
|
end
|
247
|
+
|
248
|
+
Strelka.log.info " including %p." % [ mod ]
|
249
|
+
include( mod )
|
193
250
|
end
|
251
|
+
|
252
|
+
self.plugins_installed_from = caller( 1 ).first
|
194
253
|
end
|
195
|
-
alias_method :plugin, :plugins
|
196
254
|
|
197
255
|
end # module ClassMethods
|
198
256
|
|
@@ -62,23 +62,6 @@ module Strelka::App::RestResources
|
|
62
62
|
}.freeze
|
63
63
|
|
64
64
|
|
65
|
-
### Inclusion callback -- overridden to also install dependencies.
|
66
|
-
def self::included( mod )
|
67
|
-
super
|
68
|
-
|
69
|
-
# Load the plugins this one depends on if they aren't already
|
70
|
-
mod.plugins :routing, :negotiation, :parameters
|
71
|
-
|
72
|
-
# Add validations for the limit and offset parameters
|
73
|
-
mod.param :limit, :integer
|
74
|
-
mod.param :offset, :integer
|
75
|
-
|
76
|
-
# Use the 'exclusive' router instead of the more-flexible
|
77
|
-
# Mongrel2-style default one
|
78
|
-
mod.router :exclusive
|
79
|
-
end
|
80
|
-
|
81
|
-
|
82
65
|
# Class methods to add to classes with REST resources.
|
83
66
|
module ClassMethods # :nodoc:
|
84
67
|
include Sequel::Inflections
|
@@ -96,6 +79,23 @@ module Strelka::App::RestResources
|
|
96
79
|
attr_reader :global_options
|
97
80
|
|
98
81
|
|
82
|
+
### Extension callback -- overridden to also install dependencies.
|
83
|
+
def self::extended( obj )
|
84
|
+
super
|
85
|
+
|
86
|
+
# Load the plugins this one depends on if they aren't already
|
87
|
+
obj.plugins :routing, :negotiation, :parameters
|
88
|
+
|
89
|
+
# Add validations for the limit and offset parameters
|
90
|
+
obj.param :limit, :integer
|
91
|
+
obj.param :offset, :integer
|
92
|
+
|
93
|
+
# Use the 'exclusive' router instead of the more-flexible
|
94
|
+
# Mongrel2-style default one
|
95
|
+
obj.router :exclusive
|
96
|
+
end
|
97
|
+
|
98
|
+
|
99
99
|
### Set the prefix for all following resource routes to +route+.
|
100
100
|
def resource_prefix( route )
|
101
101
|
self.global_options[ :prefix ] = route
|
@@ -141,7 +141,7 @@ module Strelka::App::RestResources
|
|
141
141
|
### Add parameter declarations for parameters related to +rsrcobj+.
|
142
142
|
def add_parameters( rsrcobj, options )
|
143
143
|
Strelka.log.debug "Declaring validations for columns from %p" % [ rsrcobj ]
|
144
|
-
self.untaint_all_constraints
|
144
|
+
self.untaint_all_constraints
|
145
145
|
rsrcobj.db_schema.each do |col, config|
|
146
146
|
Strelka.log.debug " %s (%p)" % [ col, config[:type] ]
|
147
147
|
param col, config[:type]
|
@@ -155,9 +155,11 @@ module Strelka::App::RestResources
|
|
155
155
|
# :TODO: Documentation for HTML mode (possibly using http://swagger.wordnik.com/)
|
156
156
|
Strelka.log.debug "Adding OPTIONS handler for %p" % [ route, rsrcobj ]
|
157
157
|
self.add_route( :OPTIONS, route, options ) do |req|
|
158
|
+
self.log.debug "OPTIONS handler!"
|
158
159
|
verbs = self.class.resource_verbs[ route ].sort
|
159
160
|
res = req.response
|
160
161
|
|
162
|
+
self.log.debug " making a reply with Allowed: %s" % [ verbs.join(', ') ]
|
161
163
|
res.header.allowed = verbs.join(', ')
|
162
164
|
res.content_type = 'text/plain'
|
163
165
|
res.body = ''
|
@@ -498,4 +500,10 @@ module Strelka::App::RestResources
|
|
498
500
|
end # module ClassMethods
|
499
501
|
|
500
502
|
|
503
|
+
### This is just here for logging.
|
504
|
+
def handle_request( * ) # :nodoc:
|
505
|
+
self.log.debug "[:restresources] handling request for REST resource."
|
506
|
+
super
|
507
|
+
end
|
508
|
+
|
501
509
|
end # module Strelka::App::RestResources
|
data/lib/strelka/app/routing.rb
CHANGED
@@ -216,10 +216,12 @@ module Strelka::App::Routing
|
|
216
216
|
return pattern.split( '/' ).collect do |component|
|
217
217
|
|
218
218
|
if component.start_with?( ':' )
|
219
|
+
Strelka.log.debug "translating parameter component %p to a regexp" % [component]
|
219
220
|
raise ScriptError,
|
220
221
|
"parameter-based routing not supported without a 'parameters' plugin" unless
|
221
|
-
self.respond_to?( :
|
222
|
-
|
222
|
+
self.respond_to?( :paramvalidator )
|
223
|
+
component = component.slice( 1..-1 )
|
224
|
+
self.paramvalidator.constraint_regexp_for( component )
|
223
225
|
else
|
224
226
|
component
|
225
227
|
end
|
@@ -249,6 +251,8 @@ module Strelka::App::Routing
|
|
249
251
|
|
250
252
|
### Dispatch the request using the Router.
|
251
253
|
def handle_request( request, &block )
|
254
|
+
self.log.debug "[:routing] Routing request using %p" % [ self.router.class ]
|
255
|
+
|
252
256
|
if route = self.router.route_request( request )
|
253
257
|
# Track which route was chosen for later plugins
|
254
258
|
request.notes[:routing][:route] = route
|
@@ -257,6 +261,8 @@ module Strelka::App::Routing
|
|
257
261
|
else
|
258
262
|
finish_with HTTP::NOT_FOUND, "The requested resource was not found on this server."
|
259
263
|
end
|
264
|
+
|
265
|
+
self.log.debug "[:routing] Done with routing."
|
260
266
|
end
|
261
267
|
|
262
268
|
end # module Strelka::App::Routing
|
data/lib/strelka/app/sessions.rb
CHANGED
@@ -172,6 +172,13 @@ module Strelka::App::Sessions
|
|
172
172
|
return super
|
173
173
|
end
|
174
174
|
|
175
|
+
|
176
|
+
### This is just here for logging.
|
177
|
+
def handle_request( * ) # :nodoc:
|
178
|
+
self.log.debug "[:sessions] Adding sessions to the transaction."
|
179
|
+
super
|
180
|
+
end
|
181
|
+
|
175
182
|
end # module Strelka::App::Sessions
|
176
183
|
|
177
184
|
|
data/lib/strelka/app.rb
CHANGED
@@ -53,8 +53,8 @@ class Strelka::App < Mongrel2::Handler
|
|
53
53
|
Strelka.logger.level = Logger::DEBUG if $VERBOSE
|
54
54
|
Strelka.logger.formatter = Strelka::Logging::ColorFormatter.new( Strelka.logger ) if $stderr.tty?
|
55
55
|
|
56
|
+
Strelka.log.info "Starting up with appid %p." % [ appid ]
|
56
57
|
super( appid )
|
57
|
-
|
58
58
|
end
|
59
59
|
|
60
60
|
|
@@ -172,6 +172,13 @@ class Strelka::App < Mongrel2::Handler
|
|
172
172
|
### I N S T A N C E M E T H O D S
|
173
173
|
#################################################################
|
174
174
|
|
175
|
+
### Dump the application stack when a new instance is created.
|
176
|
+
def initialize( * )
|
177
|
+
self.dump_application_stack
|
178
|
+
super
|
179
|
+
end
|
180
|
+
|
181
|
+
|
175
182
|
######
|
176
183
|
public
|
177
184
|
######
|
@@ -192,11 +199,15 @@ class Strelka::App < Mongrel2::Handler
|
|
192
199
|
|
193
200
|
# Dispatch the request after allowing plugins to to their thing
|
194
201
|
status_info = catch( :finish ) do
|
202
|
+
self.log.debug "Starting dispatch of request %p" % [ request ]
|
195
203
|
|
196
204
|
# Run fixup hooks on the request
|
197
205
|
request = self.fixup_request( request )
|
206
|
+
self.log.debug " done with request fixup"
|
198
207
|
response = self.handle_request( request )
|
208
|
+
self.log.debug " done with handler"
|
199
209
|
response = self.fixup_response( response )
|
210
|
+
self.log.debug " done with response fixup"
|
200
211
|
|
201
212
|
nil # rvalue for the catch
|
202
213
|
end
|
@@ -337,5 +348,18 @@ class Strelka::App < Mongrel2::Handler
|
|
337
348
|
return response
|
338
349
|
end
|
339
350
|
|
351
|
+
|
352
|
+
### Output the application stack into the logfile.
|
353
|
+
def dump_application_stack
|
354
|
+
stack = self.class.ancestors.
|
355
|
+
reverse.
|
356
|
+
drop_while {|mod| mod != Strelka::App }.
|
357
|
+
select {|mod| mod.respond_to?(:plugin_name) }.
|
358
|
+
reverse.
|
359
|
+
collect {|mod| mod.plugin_name }
|
360
|
+
|
361
|
+
self.log.info "Application stack: request -> %s" % [ stack.join(" -> ") ]
|
362
|
+
end
|
363
|
+
|
340
364
|
end # class Strelka::App
|
341
365
|
|
data/lib/strelka/constants.rb
CHANGED
@@ -12,7 +12,9 @@ module Strelka::Constants
|
|
12
12
|
include Mongrel2::Constants
|
13
13
|
|
14
14
|
# The data directory in the project if that exists, otherwise the gem datadir
|
15
|
-
DATADIR = if
|
15
|
+
DATADIR = if ENV['STRELKA_DATADIR']
|
16
|
+
Pathname( ENV['STRELKA_DATADIR'] )
|
17
|
+
elsif File.directory?( 'data/strelka' )
|
16
18
|
Pathname( 'data/strelka' )
|
17
19
|
elsif path = Gem.datadir('strelka')
|
18
20
|
Pathname( path )
|