merb-core 0.9.6 → 0.9.7

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 +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}