merb-core 0.9.6 → 0.9.7

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.
Files changed (38) hide show
  1. data/CHANGELOG +67 -0
  2. data/CONTRIBUTORS +1 -0
  3. data/PUBLIC_CHANGELOG +34 -0
  4. data/Rakefile +7 -4
  5. data/bin/merb +1 -31
  6. data/lib/merb-core.rb +17 -6
  7. data/lib/merb-core/config.rb +0 -7
  8. data/lib/merb-core/controller/abstract_controller.rb +6 -3
  9. data/lib/merb-core/dispatch/cookies.rb +11 -10
  10. data/lib/merb-core/dispatch/dispatcher.rb +11 -5
  11. data/lib/merb-core/dispatch/request.rb +7 -2
  12. data/lib/merb-core/dispatch/session.rb +33 -17
  13. data/lib/merb-core/dispatch/session/container.rb +19 -9
  14. data/lib/merb-core/dispatch/session/cookie.rb +27 -12
  15. data/lib/merb-core/dispatch/session/memcached.rb +47 -27
  16. data/lib/merb-core/dispatch/session/memory.rb +10 -6
  17. data/lib/merb-core/dispatch/session/store_container.rb +25 -20
  18. data/lib/merb-core/test/helpers/request_helper.rb +6 -3
  19. data/lib/merb-core/test/helpers/route_helper.rb +1 -1
  20. data/lib/merb-core/test/matchers/view_matchers.rb +5 -1
  21. data/lib/merb-core/version.rb +1 -1
  22. data/spec/private/dispatch/fixture/log/merb_test.log +144 -0
  23. data/spec/private/router/fixture/log/merb_test.log +16 -0
  24. data/spec/public/controller/controllers/cookies.rb +14 -3
  25. data/spec/public/controller/cookies_spec.rb +53 -10
  26. data/spec/public/controller/url_spec.rb +6 -0
  27. data/spec/public/directory_structure/directory/log/merb_test.log +112 -0
  28. data/spec/public/reloading/directory/log/merb_test.log +16 -0
  29. data/spec/public/request/request_spec.rb +19 -10
  30. data/spec/public/router/fixture/log/merb_test.log +224 -0
  31. data/spec/public/session/controllers/sessions.rb +4 -0
  32. data/spec/public/session/memcached_session_spec.rb +2 -2
  33. data/spec/public/session/multiple_sessions_spec.rb +2 -2
  34. data/spec/public/session/session_spec.rb +15 -0
  35. data/spec/public/test/request_helper_spec.rb +21 -0
  36. data/spec/public/test/route_helper_spec.rb +7 -0
  37. metadata +6 -17
  38. data/lib/merb-core/script.rb +0 -112
@@ -37,15 +37,9 @@ module Merb
37
37
  # ==== Parameters
38
38
  # session_id<String>:: A unique identifier for this session.
39
39
  def initialize(session_id)
40
+ @_destroy = false
40
41
  self.session_id = session_id
41
42
  end
42
-
43
- # Teardown and/or persist the current session.
44
- #
45
- # ==== Parameters
46
- # request<Merb::Request>:: The Merb::Request that came in from Rack.
47
- def finalize(request)
48
- end
49
43
 
50
44
  # Assign a new session_id.
51
45
  #
@@ -56,9 +50,25 @@ module Merb
56
50
  @session_id = sid
57
51
  end
58
52
 
59
- # Regenerate the Session ID
60
- def regenerate
53
+ # Teardown and/or persist the current session.
54
+ #
55
+ # If @_destroy is true, clear out the session completely, including
56
+ # removal of the session cookie itself.
57
+ #
58
+ # ==== Parameters
59
+ # request<Merb::Request>:: The Merb::Request that came in from Rack.
60
+ def finalize(request)
61
61
  end
62
62
 
63
+ # Destroy the current session - clears data and removes session cookie.
64
+ def clear!
65
+ @_destroy = true
66
+ self.clear
67
+ end
68
+
69
+ # Regenerate the session_id.
70
+ def regenerate
71
+ end
72
+
63
73
  end
64
74
  end
@@ -1,6 +1,5 @@
1
1
  require 'base64' # to convert Marshal.dump to ASCII
2
2
  require 'openssl' # to generate the HMAC message digest
3
- # Most of this code is taken from bitsweat's implementation in rails
4
3
  module Merb
5
4
 
6
5
  # If you have more than 4K of session data or don't want your data to be
@@ -45,7 +44,7 @@ module Merb
45
44
  self.new(Merb::SessionMixin.rand_uuid, "", Merb::Request._session_secret_key)
46
45
  end
47
46
 
48
- # Setup a new session.
47
+ # Set up a new session on request: make it available on request instance.
49
48
  #
50
49
  # ==== Parameters
51
50
  # request<Merb::Request>:: The Merb::Request that came in from Rack.
@@ -72,8 +71,9 @@ module Merb
72
71
  def initialize(session_id, cookie, secret)
73
72
  super session_id
74
73
  if secret.blank? || secret.length < 16
75
- Merb.logger.warn("You must specify a session_secret_key in your init file, and it must be at least 16 characters")
76
- raise ArgumentError, 'A secret is required to generate an integrity hash for cookie session data.'
74
+ msg = "You must specify a session_secret_key in your init file, and it must be at least 16 characters"
75
+ Merb.logger.warn(msg)
76
+ raise ArgumentError, msg
77
77
  end
78
78
  @secret = secret
79
79
  self.update(unmarshal(cookie))
@@ -81,13 +81,23 @@ module Merb
81
81
 
82
82
  # Teardown and/or persist the current session.
83
83
  #
84
+ # If @_destroy is true, clear out the session completely, including
85
+ # removal of the session cookie itself.
86
+ #
84
87
  # ==== Parameters
85
- # request<Merb::Request>:: The Merb::Request that came in from Rack.
88
+ # request<Merb::Request>:: request object created from Rack environment.
86
89
  def finalize(request)
87
- if _original_session_data != (new_session_data = self.to_cookie)
90
+ if @_destroy
91
+ request.destroy_session_cookie
92
+ elsif _original_session_data != (new_session_data = self.to_cookie)
88
93
  request.set_session_cookie_value(new_session_data)
89
94
  end
90
95
  end
96
+
97
+ # Regenerate the session_id.
98
+ def regenerate
99
+ self.session_id = Merb::SessionMixin.rand_uuid
100
+ end
91
101
 
92
102
  # Create the raw cookie string; includes an HMAC keyed message digest.
93
103
  #
@@ -95,17 +105,21 @@ module Merb
95
105
  # String:: Cookie value.
96
106
  #
97
107
  # ==== Raises
98
- # CookieOverflow:: Session contains too much information.
108
+ # CookieOverflow:: More than 4K of data put into session.
99
109
  #
100
110
  # ==== Notes
101
- # The data (self) is converted to a Hash first, since a container might
102
- # choose to do a full Marshal on the data, which would make it persist
111
+ # Session data is converted to a Hash first, since a container might
112
+ # choose to marshal it, which would make it persist
103
113
  # attributes like 'needs_new_cookie', which it shouldn't.
104
114
  def to_cookie
105
115
  unless self.empty?
106
116
  data = self.serialize
107
117
  value = Merb::Request.escape "#{data}--#{generate_digest(data)}"
108
- raise CookieOverflow if value.size > MAX
118
+ if value.size > MAX
119
+ msg = "Cookies have limit of 4K. Session contents: #{data.inspect}"
120
+ Merb.logger.error!(msg)
121
+ raise CookieOverflow, msg
122
+ end
109
123
  value
110
124
  end
111
125
  end
@@ -145,12 +159,13 @@ module Merb
145
159
 
146
160
  protected
147
161
 
148
- # Serialize current session data - as a Hash
162
+ # Serialize current session data as a Hash.
163
+ # Uses Base64 encoding for integrity.
149
164
  def serialize
150
165
  Base64.encode64(Marshal.dump(self.to_hash)).chop
151
166
  end
152
167
 
153
- # Unserialize the raw cookie data - to a Hash
168
+ # Unserialize the raw cookie data to a Hash
154
169
  def unserialize(data)
155
170
  Marshal.load(Base64.decode64(data)) rescue {}
156
171
  end
@@ -3,11 +3,21 @@ module Merb
3
3
  # Sessions stored in memcached.
4
4
  #
5
5
  # Requires setup in your +init.rb+.
6
+ #
7
+ # This for the 'memcache-client' gem:
6
8
  #
7
9
  # Merb::BootLoader.after_app_loads do
8
- # require 'memcached'
10
+ # require 'memcache'
9
11
  # Merb::MemcacheSession.store =
10
- # Memcached.new('127.0.0.1:11211', { :namespace => 'my_app' })
12
+ # MemCache.new('127.0.0.1:11211', :namespace => 'my_app')
13
+ # end
14
+ #
15
+ # Or this for the 'memcached' gem:
16
+ #
17
+ # Merb::BootLoader.after_app_loads do
18
+ # require 'memcache'
19
+ # Merb::MemcacheSession.store =
20
+ # Memcached.new('127.0.0.1:11211', :namespace => 'my_app')
11
21
  # end
12
22
 
13
23
  class MemcacheSession < SessionStoreContainer
@@ -16,33 +26,43 @@ module Merb
16
26
  self.session_store_type = :memcache
17
27
 
18
28
  end
29
+
30
+ module MemcacheStore
31
+
32
+ # Make the Memcached gem conform to the SessionStoreContainer interface
33
+
34
+ # ==== Parameters
35
+ # session_id<String>:: ID of the session to retrieve.
36
+ #
37
+ # ==== Returns
38
+ # ContainerSession:: The session corresponding to the ID.
39
+ def retrieve_session(session_id)
40
+ get("session:#{session_id}")
41
+ end
42
+
43
+ # ==== Parameters
44
+ # session_id<String>:: ID of the session to set.
45
+ # data<ContainerSession>:: The session to set.
46
+ def store_session(session_id, data)
47
+ set("session:#{session_id}", data)
48
+ end
49
+
50
+ # ==== Parameters
51
+ # session_id<String>:: ID of the session to delete.
52
+ def delete_session(session_id)
53
+ delete("session:#{session_id}")
54
+ end
55
+
56
+ end
19
57
 
20
58
  end
21
59
 
60
+ # For the memcached gem.
22
61
  class Memcached
23
-
24
- # Make the Memcached gem conform to the SessionStoreContainer interface
25
-
26
- # ==== Parameters
27
- # session_id<String>:: ID of the session to retrieve.
28
- #
29
- # ==== Returns
30
- # ContainerSession:: The session corresponding to the ID.
31
- def retrieve_session(session_id)
32
- get("session:#{session_id}")
33
- end
34
-
35
- # ==== Parameters
36
- # session_id<String>:: ID of the session to set.
37
- # data<ContainerSession>:: The session to set.
38
- def store_session(session_id, data)
39
- set("session:#{session_id}", data)
40
- end
41
-
42
- # ==== Parameters
43
- # session_id<String>:: ID of the session to delete.
44
- def delete_session(session_id)
45
- delete("session:#{session_id}")
46
- end
47
-
62
+ include Merb::MemcacheStore
63
+ end
64
+
65
+ # For the memcache-client gem.
66
+ class MemCache
67
+ include Merb::MemcacheStore
48
68
  end
@@ -10,7 +10,11 @@ module Merb
10
10
  # end
11
11
  #
12
12
  # Sessions will remain in memory until the server is stopped or the time
13
- # as set in :memory_session_ttl expires.
13
+ # as set in :memory_session_ttl expires. Expired sessions are cleaned up in the
14
+ # background by a separate thread. Every time reaper
15
+ # cleans up expired sessions, garbage collection is scheduled start.
16
+ #
17
+ # Memory session is accessed in a thread safe manner.
14
18
  class MemorySession < SessionStoreContainer
15
19
 
16
20
  # The session store type
@@ -30,14 +34,14 @@ module Merb
30
34
 
31
35
  # Used for handling multiple sessions stored in memory.
32
36
  class MemorySessionStore
33
-
37
+
34
38
  # ==== Parameters
35
39
  # ttl<Fixnum>:: Session validity time in seconds. Defaults to 1 hour.
36
40
  def initialize(ttl=nil)
37
41
  @sessions = Hash.new
38
42
  @timestamps = Hash.new
39
43
  @mutex = Mutex.new
40
- @session_ttl = ttl || 60*60 # default 1 hour
44
+ @session_ttl = ttl || Merb::Const::HOUR # defaults 1 hour
41
45
  start_timer
42
46
  end
43
47
 
@@ -73,7 +77,7 @@ module Merb
73
77
  end
74
78
 
75
79
  # Deletes any sessions that have reached their maximum validity.
76
- def reap_old_sessions
80
+ def reap_expired_sessions
77
81
  @timestamps.each do |session_id,stamp|
78
82
  delete_session(session_id) if (stamp + @session_ttl) < Time.now
79
83
  end
@@ -85,11 +89,11 @@ module Merb
85
89
  Thread.new do
86
90
  loop {
87
91
  sleep @session_ttl
88
- reap_old_sessions
92
+ reap_expired_sessions
89
93
  }
90
94
  end
91
95
  end
92
96
 
93
97
  end
94
98
 
95
- end
99
+ end
@@ -6,29 +6,27 @@ module Merb
6
6
  attr_accessor :_fingerprint
7
7
 
8
8
  # The class attribute :store holds a reference to an object that implements
9
- # the following interface (either as class or instance methods):
9
+ # the following interface:
10
10
  #
11
- # - retrieve_session(session_id) # returns data as Hash
12
- # - store_session(session_id, data) # data should be a Hash
11
+ # - retrieve_session(session_id) # returns a Hash
12
+ # - store_session(session_id, data) # expects data to be Hash
13
13
  # - delete_session(session_id)
14
14
  #
15
- # You can use this session store directly by assigning to :store in your
15
+ # You can use session store classes directly by assigning to :store in your
16
16
  # config/init.rb after_app_loads step, for example:
17
17
  #
18
18
  # Merb::BootLoader.after_app_loads do
19
- # SessionStoreContainer.store = BarSession.new(:option => 'value')
19
+ # SessionStoreContainer.store = MemorySession.new
20
20
  # end
21
21
  #
22
22
  # Or you can inherit from SessionStoreContainer to create a SessionContainer
23
- # that delegates to its 'store' attribute.
23
+ # that delegates to aggregated store.
24
24
  #
25
- # class FooSession < SessionStoreContainer
26
- #
27
- # self.store = FooContainer
28
- #
25
+ # class MemorySession < SessionStoreContainer
26
+ # self.session_store_type = :memory
29
27
  # end
30
28
  #
31
- # class FooContainer
29
+ # class MemoryContainer
32
30
  #
33
31
  # def self.retrieve_session(session_id)
34
32
  # ...
@@ -43,7 +41,6 @@ module Merb
43
41
  # end
44
42
  #
45
43
  # end
46
-
47
44
  # When used directly, report as :store store
48
45
  self.session_store_type = :store
49
46
 
@@ -114,6 +111,9 @@ module Merb
114
111
 
115
112
  # Teardown and/or persist the current session.
116
113
  #
114
+ # If @_destroy is true, clear out the session completely, including
115
+ # removal of the session cookie itself.
116
+ #
117
117
  # ==== Parameters
118
118
  # request<Merb::Request>:: The Merb::Request that came in from Rack.
119
119
  #
@@ -122,15 +122,20 @@ module Merb
122
122
  # choose to do a full Marshal on the data, which would make it persist
123
123
  # attributes like 'needs_new_cookie', which it shouldn't.
124
124
  def finalize(request)
125
- if _fingerprint != Marshal.dump(data = self.to_hash).hash
126
- begin
127
- store.store_session(request.session(self.class.session_store_type).session_id, data)
128
- rescue => err
129
- Merb.logger.warn!("Could not persist session to #{self.class.name}: #{err.message}")
125
+ if @_destroy
126
+ store.delete_session(self.session_id)
127
+ request.destroy_session_cookie
128
+ else
129
+ if _fingerprint != Marshal.dump(data = self.to_hash).hash
130
+ begin
131
+ store.store_session(request.session(self.class.session_store_type).session_id, data)
132
+ rescue => err
133
+ Merb.logger.warn!("Could not persist session to #{self.class.name}: #{err.message}")
134
+ end
135
+ end
136
+ if needs_new_cookie || Merb::SessionMixin.needs_new_cookie?
137
+ request.set_session_id_cookie(self.session_id)
130
138
  end
131
- end
132
- if needs_new_cookie || Merb::SessionMixin.needs_new_cookie?
133
- request.set_session_id_cookie(session_id)
134
139
  end
135
140
  end
136
141
 
@@ -207,9 +207,12 @@ module Merb
207
207
  # @public
208
208
  def build_request(params = {}, env = {})
209
209
  params = Merb::Request.params_to_query_string(params)
210
- env[:query_string] = env["QUERY_STRING"] ? "#{env["QUERY_STRING"]}&#{params}" : params
210
+
211
+ query_string = env[:query_string] || env['QUERY_STRING']
212
+ env[:query_string] = query_string ? "#{query_string}&#{params}" : params
211
213
 
212
- fake_request(env, { :post_body => env[:post_body], :req => env[:req] })
214
+ post_body = env[:post_body] || env['POST_BODY']
215
+ fake_request(env, { :post_body => post_body, :req => env[:req] })
213
216
  end
214
217
 
215
218
  # An HTTP GET request that operates through the router.
@@ -318,7 +321,7 @@ module Merb
318
321
 
319
322
  multipart = env.delete(:test_with_multipart)
320
323
 
321
- request = fake_request(env)
324
+ request = build_request(params, env)
322
325
 
323
326
  opts = check_request_for_route(request) # Check that the request will be routed correctly
324
327
  controller_name = (opts[:namespace] ? opts.delete(:namespace) + '/' : '') + opts.delete(:controller)
@@ -26,7 +26,7 @@ module Merb
26
26
  env[:request_method] ||= method.to_s.upcase
27
27
  env[:request_uri] = path
28
28
 
29
- check_request_for_route(fake_request(env))
29
+ check_request_for_route(build_request({}, env))
30
30
  end
31
31
  end
32
32
  end
@@ -333,7 +333,11 @@ module Merb::Test::Rspec::ViewMatchers
333
333
  alias_method :match_selector, :have_selector
334
334
 
335
335
  def have_xpath(expected)
336
- require "libxml"
336
+ begin
337
+ require "libxml"
338
+ rescue LoadError => e
339
+ puts "To use have_xpath helper you need to install libxml-ruby gem"
340
+ end
337
341
  HaveXpath.new(expected)
338
342
  end
339
343
  alias_method :match_xpath, :have_xpath
@@ -1,5 +1,5 @@
1
1
  module Merb
2
- VERSION = '0.9.6' unless defined?(Merb::VERSION)
2
+ VERSION = '0.9.7' unless defined?(Merb::VERSION)
3
3
 
4
4
  # Merb::RELEASE meanings:
5
5
  # 'dev' : unreleased
@@ -8693,3 +8693,147 @@ Restarting Worker Thread
8693
8693
  ~ Started request handling: Tue Sep 09 01:15:03 +0300 2008
8694
8694
  ~ Params: {"format"=>nil, "action"=>"bar", "id"=>"54", "controller"=>"foo"}
8695
8695
  ~ {:action_time=>0.000236, :before_filters_time=>6.0e-06, :dispatch_time=>0.000434, :after_filters_time=>6.0e-06}
8696
+ ~ Loaded TEST Environment...
8697
+ ~ Compiling routes...
8698
+ ~ Starting Merb server listening at 0.0.0.0:4000
8699
+ ~ Started request handling: Tue Sep 09 13:12:49 +0300 2008
8700
+ ~ Params: {"format"=>nil, "action"=>"bar", "id"=>"54", "controller"=>"foo"}
8701
+ ~ {:dispatch_time=>0.000871, :after_filters_time=>1.7e-05, :action_time=>0.000599, :before_filters_time=>2.0e-05}
8702
+ ~ Started request handling: Tue Sep 09 13:12:49 +0300 2008
8703
+ ~ Params: {"format"=>nil, "action"=>"bar", "id"=>"54", "controller"=>"foo"}
8704
+ ~ {:dispatch_time=>0.000393, :after_filters_time=>6.0e-06, :action_time=>0.000225, :before_filters_time=>6.0e-06}
8705
+ ~ Loaded TEST Environment...
8706
+ ~ Compiling routes...
8707
+ ~ Starting Merb server listening at 0.0.0.0:4000
8708
+ ~ Started request handling: Tue Sep 09 23:12:00 +0300 2008
8709
+ ~ Params: {"format"=>nil, "action"=>"bar", "id"=>"54", "controller"=>"foo"}
8710
+ ~ {:dispatch_time=>0.000881, :after_filters_time=>1.8e-05, :action_time=>0.00054, :before_filters_time=>2.6e-05}
8711
+ ~ Started request handling: Tue Sep 09 23:12:00 +0300 2008
8712
+ ~ Params: {"format"=>nil, "action"=>"bar", "id"=>"54", "controller"=>"foo"}
8713
+ ~ {:dispatch_time=>0.000407, :after_filters_time=>6.0e-06, :action_time=>0.000239, :before_filters_time=>7.0e-06}
8714
+ ~ Loaded TEST Environment...
8715
+ ~ Compiling routes...
8716
+ ~ Starting Merb server listening at 0.0.0.0:4000
8717
+ ~ Started request handling: Wed Sep 10 01:53:03 +0300 2008
8718
+ ~ Params: {"format"=>nil, "action"=>"bar", "id"=>"54", "controller"=>"foo"}
8719
+ ~ {:dispatch_time=>0.000773, :after_filters_time=>1.7e-05, :action_time=>0.000506, :before_filters_time=>1.6e-05}
8720
+ ~ Started request handling: Wed Sep 10 01:53:03 +0300 2008
8721
+ ~ Params: {"format"=>nil, "action"=>"bar", "id"=>"54", "controller"=>"foo"}
8722
+ ~ {:dispatch_time=>0.000401, :after_filters_time=>6.0e-06, :action_time=>0.000239, :before_filters_time=>5.0e-06}
8723
+ ~ Loaded TEST Environment...
8724
+ ~ Compiling routes...
8725
+ ~ Starting Merb server listening at 0.0.0.0:4000
8726
+ ~ Started request handling: Wed Sep 10 03:11:55 +0300 2008
8727
+ ~ Params: {"format"=>nil, "action"=>"bar", "id"=>"54", "controller"=>"foo"}
8728
+ ~ {:dispatch_time=>0.000816, :after_filters_time=>1.7e-05, :action_time=>0.000538, :before_filters_time=>1.7e-05}
8729
+ ~ Started request handling: Wed Sep 10 03:11:55 +0300 2008
8730
+ ~ Params: {"format"=>nil, "action"=>"bar", "id"=>"54", "controller"=>"foo"}
8731
+ ~ {:dispatch_time=>0.00046, :after_filters_time=>7.0e-06, :action_time=>0.000244, :before_filters_time=>5.0e-06}
8732
+ ~ Loaded TEST Environment...
8733
+ ~ Compiling routes...
8734
+ ~ Starting Merb server listening at 0.0.0.0:4000
8735
+ ~ Started request handling: Wed Sep 10 03:15:37 +0300 2008
8736
+ ~ Params: {"format"=>nil, "action"=>"bar", "id"=>"54", "controller"=>"foo"}
8737
+ ~ {:dispatch_time=>0.000807, :after_filters_time=>1.7e-05, :action_time=>0.000529, :before_filters_time=>1.6e-05}
8738
+ ~ Started request handling: Wed Sep 10 03:15:37 +0300 2008
8739
+ ~ Params: {"format"=>nil, "action"=>"bar", "id"=>"54", "controller"=>"foo"}
8740
+ ~ {:dispatch_time=>0.000426, :after_filters_time=>7.0e-06, :action_time=>0.000247, :before_filters_time=>5.0e-06}
8741
+ ~ Loaded TEST Environment...
8742
+ ~ Compiling routes...
8743
+ ~ Starting Merb server listening at 0.0.0.0:4000
8744
+ ~ Started request handling: Wed Sep 10 03:25:15 +0300 2008
8745
+ ~ Params: {"format"=>nil, "action"=>"bar", "id"=>"54", "controller"=>"foo"}
8746
+ ~ {:dispatch_time=>0.000838, :after_filters_time=>1.7e-05, :action_time=>0.000579, :before_filters_time=>2.1e-05}
8747
+ ~ Started request handling: Wed Sep 10 03:25:15 +0300 2008
8748
+ ~ Params: {"format"=>nil, "action"=>"bar", "id"=>"54", "controller"=>"foo"}
8749
+ ~ {:dispatch_time=>0.000405, :after_filters_time=>7.0e-06, :action_time=>0.000235, :before_filters_time=>5.0e-06}
8750
+ ~ Loaded TEST Environment...
8751
+ ~ Compiling routes...
8752
+ ~ Starting Merb server listening at 0.0.0.0:4000
8753
+ ~ Started request handling: Wed Sep 10 04:26:15 +0300 2008
8754
+ ~ Params: {"format"=>nil, "action"=>"bar", "id"=>"54", "controller"=>"foo"}
8755
+ ~ {:dispatch_time=>0.000822, :after_filters_time=>1.7e-05, :action_time=>0.000504, :before_filters_time=>1.6e-05}
8756
+ ~ Started request handling: Wed Sep 10 04:26:15 +0300 2008
8757
+ ~ Params: {"format"=>nil, "action"=>"bar", "id"=>"54", "controller"=>"foo"}
8758
+ ~ {:dispatch_time=>0.000393, :after_filters_time=>6.0e-06, :action_time=>0.000219, :before_filters_time=>4.0e-06}
8759
+ ~ Loaded TEST Environment...
8760
+ ~ Compiling routes...
8761
+ ~ Starting Merb server listening at 0.0.0.0:4000
8762
+ ~ Started request handling: Wed Sep 10 04:45:17 +0300 2008
8763
+ ~ Params: {"format"=>nil, "action"=>"bar", "id"=>"54", "controller"=>"foo"}
8764
+ ~ {:dispatch_time=>0.000818, :after_filters_time=>2.0e-05, :action_time=>0.000543, :before_filters_time=>2.0e-05}
8765
+ ~ Started request handling: Wed Sep 10 04:45:17 +0300 2008
8766
+ ~ Params: {"format"=>nil, "action"=>"bar", "id"=>"54", "controller"=>"foo"}
8767
+ ~ {:dispatch_time=>0.000427, :after_filters_time=>1.0e-05, :action_time=>0.000247, :before_filters_time=>8.0e-06}
8768
+ ~ Loaded TEST Environment...
8769
+ ~ Compiling routes...
8770
+ ~ Starting Merb server listening at 0.0.0.0:4000
8771
+ ~ Started request handling: Thu Sep 11 17:59:15 +0300 2008
8772
+ ~ Params: {"format"=>nil, "action"=>"bar", "id"=>"54", "controller"=>"foo"}
8773
+ ~ {:dispatch_time=>0.000774, :after_filters_time=>1.7e-05, :action_time=>0.000504, :before_filters_time=>1.6e-05}
8774
+ ~ Started request handling: Thu Sep 11 17:59:15 +0300 2008
8775
+ ~ Params: {"format"=>nil, "action"=>"bar", "id"=>"54", "controller"=>"foo"}
8776
+ ~ {:dispatch_time=>0.000392, :after_filters_time=>6.0e-06, :action_time=>0.000228, :before_filters_time=>4.0e-06}
8777
+ ~ Loaded TEST Environment...
8778
+ ~ Compiling routes...
8779
+ ~ Starting Merb server listening at 0.0.0.0:4000
8780
+ ~ Started request handling: Sat Sep 13 03:29:37 +0300 2008
8781
+ ~ Params: {"format"=>nil, "action"=>"bar", "id"=>"54", "controller"=>"foo"}
8782
+ ~ {:after_filters_time=>1.5e-05, :action_time=>0.00052, :before_filters_time=>1.6e-05, :dispatch_time=>0.001015}
8783
+ ~ Started request handling: Sat Sep 13 03:29:37 +0300 2008
8784
+ ~ Params: {"format"=>nil, "action"=>"bar", "id"=>"54", "controller"=>"foo"}
8785
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000236, :before_filters_time=>6.0e-06, :dispatch_time=>0.000404}
8786
+ ~ Loaded TEST Environment...
8787
+ ~ Compiling routes...
8788
+ ~ Starting Merb server listening at 0.0.0.0:4000
8789
+ ~ Started request handling: Sat Sep 13 05:00:26 +0300 2008
8790
+ ~ Params: {"format"=>nil, "action"=>"bar", "id"=>"54", "controller"=>"foo"}
8791
+ ~ {:after_filters_time=>1.6e-05, :action_time=>0.000504, :before_filters_time=>1.5e-05, :dispatch_time=>0.0008}
8792
+ ~ Started request handling: Sat Sep 13 05:00:26 +0300 2008
8793
+ ~ Params: {"format"=>nil, "action"=>"bar", "id"=>"54", "controller"=>"foo"}
8794
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000229, :before_filters_time=>5.0e-06, :dispatch_time=>0.000391}
8795
+ ~ Loaded TEST Environment...
8796
+ ~ Compiling routes...
8797
+ ~ Starting Merb server listening at 0.0.0.0:4000
8798
+ ~ Started request handling: Sat Sep 13 05:01:25 +0300 2008
8799
+ ~ Params: {"format"=>nil, "action"=>"bar", "id"=>"54", "controller"=>"foo"}
8800
+ ~ {:after_filters_time=>1.6e-05, :action_time=>0.00056, :before_filters_time=>1.6e-05, :dispatch_time=>0.000824}
8801
+ ~ Started request handling: Sat Sep 13 05:01:25 +0300 2008
8802
+ ~ Params: {"format"=>nil, "action"=>"bar", "id"=>"54", "controller"=>"foo"}
8803
+ ~ {:after_filters_time=>5.0e-06, :action_time=>0.000232, :before_filters_time=>5.0e-06, :dispatch_time=>0.000396}
8804
+ ~ Loaded TEST Environment...
8805
+ ~ Compiling routes...
8806
+ ~ Starting Merb server listening at 0.0.0.0:4000
8807
+ ~ Started request handling: Sat Sep 13 18:50:19 +0300 2008
8808
+ ~ Params: {"format"=>nil, "action"=>"bar", "id"=>"54", "controller"=>"foo"}
8809
+ ~ {:dispatch_time=>0.000762, :after_filters_time=>1.6e-05, :action_time=>0.000499, :before_filters_time=>1.7e-05}
8810
+ ~ Started request handling: Sat Sep 13 18:50:19 +0300 2008
8811
+ ~ Params: {"format"=>nil, "action"=>"bar", "id"=>"54", "controller"=>"foo"}
8812
+ ~ {:dispatch_time=>0.000409, :after_filters_time=>5.0e-06, :action_time=>0.000253, :before_filters_time=>5.0e-06}
8813
+ ~ Loaded TEST Environment...
8814
+ ~ Compiling routes...
8815
+ ~ Starting Merb server listening at 0.0.0.0:4000
8816
+ ~ Started request handling: Sat Sep 13 18:51:49 +0300 2008
8817
+ ~ Params: {"format"=>nil, "action"=>"bar", "id"=>"54", "controller"=>"foo"}
8818
+ ~ {:dispatch_time=>0.000762, :after_filters_time=>1.5e-05, :action_time=>0.0005, :before_filters_time=>1.6e-05}
8819
+ ~ Started request handling: Sat Sep 13 18:51:49 +0300 2008
8820
+ ~ Params: {"format"=>nil, "action"=>"bar", "id"=>"54", "controller"=>"foo"}
8821
+ ~ {:dispatch_time=>0.000387, :after_filters_time=>5.0e-06, :action_time=>0.000228, :before_filters_time=>5.0e-06}
8822
+ ~ Loaded TEST Environment...
8823
+ ~ Compiling routes...
8824
+ ~ Starting Merb server listening at 0.0.0.0:4000
8825
+ ~ Started request handling: Sun Sep 14 00:12:16 +0300 2008
8826
+ ~ Params: {"format"=>nil, "action"=>"bar", "id"=>"54", "controller"=>"foo"}
8827
+ ~ {:dispatch_time=>0.000802, :after_filters_time=>1.7e-05, :action_time=>0.000538, :before_filters_time=>1.6e-05}
8828
+ ~ Started request handling: Sun Sep 14 00:12:16 +0300 2008
8829
+ ~ Params: {"format"=>nil, "action"=>"bar", "id"=>"54", "controller"=>"foo"}
8830
+ ~ {:dispatch_time=>0.000401, :after_filters_time=>5.0e-06, :action_time=>0.000225, :before_filters_time=>6.0e-06}
8831
+ ~ Loaded TEST Environment...
8832
+ ~ Compiling routes...
8833
+ ~ Starting Merb server listening at 0.0.0.0:4000
8834
+ ~ Started request handling: Sun Sep 14 00:52:07 +0300 2008
8835
+ ~ Params: {"format"=>nil, "action"=>"bar", "id"=>"54", "controller"=>"foo"}
8836
+ ~ {:dispatch_time=>0.000853, :after_filters_time=>1.8e-05, :action_time=>0.000582, :before_filters_time=>1.6e-05}
8837
+ ~ Started request handling: Sun Sep 14 00:52:07 +0300 2008
8838
+ ~ Params: {"format"=>nil, "action"=>"bar", "id"=>"54", "controller"=>"foo"}
8839
+ ~ {:dispatch_time=>0.00041, :after_filters_time=>5.0e-06, :action_time=>0.000227, :before_filters_time=>6.0e-06}