diff options
author | Adam Jacob <adam@hjksolutions.com> | 2008-05-30 09:09:18 -0700 |
---|---|---|
committer | Adam Jacob <adam@hjksolutions.com> | 2008-05-30 09:09:18 -0700 |
commit | d373915a1ac9ea25fcb52ac8468e4670425e3376 (patch) | |
tree | 6273a88ff4c37f42bb817c95db177bc41133c64a | |
parent | 900e8372d8232cf5b2c3489065b4568670e0e487 (diff) | |
download | chef-d373915a1ac9ea25fcb52ac8468e4670425e3376.tar.gz |
Cleaning up openid, starting client support
30 files changed, 1636 insertions, 114 deletions
diff --git a/examples/sample_recipe.rb b/examples/sample_recipe.rb index 4b8548cb90..6abb31bfcd 100644 --- a/examples/sample_recipe.rb +++ b/examples/sample_recipe.rb @@ -4,6 +4,12 @@ require_recipe "openldap::server" require_recipe "resolver" require_recipe "base" +exec "restart-apache" do + path "/usr/bin:/usr/local/bin" + command "/etc/init.d/apache2 restart" + action :nothing +end + service "apache2" do insure "running" has_restart true diff --git a/lib/chef/file_store.rb b/lib/chef/file_store.rb index b834624090..1c2b02ed2f 100644 --- a/lib/chef/file_store.rb +++ b/lib/chef/file_store.rb @@ -77,6 +77,25 @@ class Chef keys end + def has_key?(obj_type, name) + validate( + { + :obj_type => obj_type, + :name => name, + }, + { + :obj_type => { :kind_of => String }, + :name => { :kind_of => String }, + } + ) + Dir[File.join(Chef::Config[:file_store_path], obj_type, '**', '*')].each do |f| + if File.file?(f) + return true if File.basename(f) == name + end + end + return false + end + def create_store_path(obj_type, key) shadigest = Digest::SHA2.hexdigest("#{obj_type}#{key}") diff --git a/lib/chef/rest.rb b/lib/chef/rest.rb new file mode 100644 index 0000000000..1ca18e4ef5 --- /dev/null +++ b/lib/chef/rest.rb @@ -0,0 +1,33 @@ +# +# Author:: Adam Jacob (<adam@hjksolutions.com>) +# Copyright:: Copyright (c) 2008 HJK Solutions, LLC +# License:: GNU General Public License version 2 or later +# +# This program and entire repository is free software; you can +# redistribute it and/or modify it under the terms of the GNU +# General Public License as published by the Free Software +# Foundation; either version 2 of the License, or any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# + +require File.join(File.dirname(__FILE__), "mixin", "params_validate") +require 'net/https' +require 'uri' +require 'json' + +class Chef + class REST + + def initialize(url, username) + end + + end +end
\ No newline at end of file diff --git a/packages/chef-server/app/controllers/nodes.rb b/packages/chef-server/app/controllers/nodes.rb index f9af3fdc57..340a981899 100644 --- a/packages/chef-server/app/controllers/nodes.rb +++ b/packages/chef-server/app/controllers/nodes.rb @@ -67,6 +67,7 @@ class Nodes < Application stored_node.recipes.each do |r| compile.node.recipes << r unless compile.node.recipes.detect { |h| r == h } end + Chef::FileStore.store("node", params[:id], compile.node) compile.load_definitions compile.load_recipes @output = { diff --git a/packages/chef-server/app/controllers/openid_consumer.rb b/packages/chef-server/app/controllers/openid_consumer.rb index 5b3142262e..58f18445e1 100644 --- a/packages/chef-server/app/controllers/openid_consumer.rb +++ b/packages/chef-server/app/controllers/openid_consumer.rb @@ -4,60 +4,59 @@ require "openid" require 'openid/store/filesystem' class OpenidConsumer < Application - layout nil def index - # render an openid form + render end def start begin oidreq = consumer.begin(params[:openid_identifier]) rescue OpenID::OpenIDError => e - flash[:error] = "Discovery failed for #{params[:openid_identifier]}: #{e}" - redirect_to :action => 'index' - return + session[:error] = "Discovery failed for #{params[:openid_identifier]}: #{e}" + return redirect(url(:openid_consumer)) end - return_to = url_for :action => 'complete', :only_path => false - realm = url_for :action => 'index', :only_path => false + return_to = absolute_url(:openid_consumer_complete) + realm = absolute_url(:openid_consumer) if oidreq.send_redirect?(realm, return_to, params[:immediate]) - redirect_to oidreq.redirect_url(realm, return_to, params[:immediate]) + return redirect(oidreq.redirect_url(realm, return_to, params[:immediate])) else @form_text = oidreq.form_markup(realm, return_to, params[:immediate], {'id' => 'openid_form'}) + render end end def complete # FIXME - url_for some action is not necessarily the current URL. - current_url = url_for(:action => 'complete', :only_path => false) - parameters = params.reject{|k,v|request.path_parameters[k]} + current_url = absolute_url(:openid_consumer_complete) + parameters = params.reject{|k,v| k == "controller" || k == "action"} oidresp = consumer.complete(parameters, current_url) case oidresp.status when OpenID::Consumer::FAILURE if oidresp.display_identifier - flash[:error] = ("Verification of #{oidresp.display_identifier}"\ + session[:error] = ("Verification of #{oidresp.display_identifier}"\ " failed: #{oidresp.message}") else - flash[:error] = "Verification failed: #{oidresp.message}" + session[:error] = "Verification failed: #{oidresp.message}" end when OpenID::Consumer::SUCCESS - flash[:success] = ("Verification of #{oidresp.display_identifier}"\ + session[:success] = ("Verification of #{oidresp.display_identifier}"\ " succeeded.") when OpenID::Consumer::SETUP_NEEDED - flash[:alert] = "Immediate request failed - Setup Needed" + session[:alert] = "Immediate request failed - Setup Needed" when OpenID::Consumer::CANCEL - flash[:alert] = "OpenID transaction cancelled." + session[:alert] = "OpenID transaction cancelled." else end - redirect_to :action => 'index' + redirect url(:openid_consumer) end private def consumer if @consumer.nil? - dir = Pathname.new(RAILS_ROOT).join('db').join('cstore') + dir = Pathname.new(Merb.root).join('db').join('cstore') store = OpenID::Store::Filesystem.new(dir) @consumer = OpenID::Consumer.new(session, store) end diff --git a/packages/chef-server/app/controllers/openid_login.rb b/packages/chef-server/app/controllers/openid_login.rb deleted file mode 100644 index dfb621ca5c..0000000000 --- a/packages/chef-server/app/controllers/openid_login.rb +++ /dev/null @@ -1,42 +0,0 @@ -# Controller for handling the login, logout process for "users" of our -# little server. Users have no password. This is just an example. - -require 'openid' - -class OpenidLogin < Application - - provides :html, :json - - def index - @headers['X-XRDS-Location'] = url(:controller => "server", - :action => "idp_xrds", - :only_path => false) - display({ }) - end - - def submit - user = params[:username] - - # if we get a user, log them in by putting their username in - # the session hash. - unless user.nil? - session[:username] = user unless user.nil? - session[:approvals] = [] - session[:notice] = "Your OpenID URL is <b> - #{url(:controller => "openid_server", :action => "user_page", :username => params[:username])} - </b><br/><br/>Proceed to step 2 below." - else - session[:error] = "Sorry, couldn't log you in. Try again." - end - - redirect url(:controller => "openid_login") - end - - def logout - # delete the username from the session hash - session[:username] = nil - session[:approvals] = nil - redirect url(:controller => "openid_login") - end - -end diff --git a/packages/chef-server/app/controllers/openid_register.rb b/packages/chef-server/app/controllers/openid_register.rb new file mode 100644 index 0000000000..2636524a2d --- /dev/null +++ b/packages/chef-server/app/controllers/openid_register.rb @@ -0,0 +1,93 @@ +# Controller for handling the login, logout process for "users" of our +# little server. Users have no password. This is just an example. + +require 'openid' + +class OpenidRegister < Application + + provides :html, :json + + def index + @headers['X-XRDS-Location'] = absolute_url(:controller => "server", :action => "idp_xrds") + @registered_nodes = Chef::FileStore.list("openid_node") + display @registered_nodes + end + + def show + begin + @registered_node = Chef::FileStore.load("openid_node", params[:id]) + rescue RuntimeError => e + raise NotFound, "Cannot load node registration for #{params[:id]}" + end + display @registered_node + end + + def create + params.has_key?(:id) or raise BadRequest, "You must provide an id to register" + params.has_key?(:password) or raise BadRequest, "You must provide a password to register" + if Chef::FileStore.has_key?("openid_node", params[:id]) + raise BadRequest, "You cannot re-register #{params[:id]}!" + end + salt = generate_salt + @registered_node = { + :id => params[:id], + :salt => salt, + :password => encrypt_password(salt, params[:password]) + } + Chef::FileStore.store( + "openid_node", + params[:id], + @registered_node + ) + display @registered_node + end + + def update + raise BadRequest, "You cannot update your registration -- delete #{params[:id]} and re-register" + end + + def destroy + unless Chef::FileStore.has_key?("openid_node", params[:id]) + raise BadRequest, "Cannot find the registration for #{params[:id]}" + end + Chef::FileStore.delete("openid_node", params[:id]) + display({ :message => "Deleted registration for #{params[:id]}"}) + end + + def submit + user = params[:username] + + # if we get a user, log them in by putting their username in + # the session hash. + unless user.nil? + session[:username] = user unless user.nil? + session[:approvals] = [] + session[:notice] = "Your OpenID URL is <b> + #{url(:controller => "openid_server", :action => "user_page", :username => params[:username])} + </b><br/><br/>Proceed to step 2 below." + else + session[:error] = "Sorry, couldn't log you in. Try again." + end + + redirect url(:openid_login) + end + + def logout + # delete the username from the session hash + session[:username] = nil + session[:approvals] = nil + redirect url(:openid_login) + end + + private + def generate_salt + salt = Time.now.to_s + chars = ("a".."z").to_a + ("A".."Z").to_a + ("0".."9").to_a + 1.upto(30) { |i| salt << chars[rand(chars.size-1)] } + salt + end + + def encrypt_password(salt, password) + Digest::SHA1.hexdigest("--#{salt}--#{password}--") + end +end diff --git a/packages/chef-server/app/controllers/openid_server.rb b/packages/chef-server/app/controllers/openid_server.rb index aa0d59ab61..cfdb4c4169 100644 --- a/packages/chef-server/app/controllers/openid_server.rb +++ b/packages/chef-server/app/controllers/openid_server.rb @@ -14,15 +14,16 @@ class OpenidServer < Application include Merb::OpenidServerHelper include OpenID::Server + layout nil def index + oidreq = server.decode_request(params) # no openid.mode was given unless oidreq - render :text => "This is an OpenID server endpoint." - return + return "This is the Chef OpenID server endpoint." end oidresp = nil @@ -36,8 +37,7 @@ class OpenidServer < Application oidresp = oidreq.answer(false) elsif session[:username].nil? # The user hasn't logged in. - show_decision_page(oidreq) - return + return show_decision_page(oidreq) else # Else, set the identity to the one the user is using. identity = url_for_user @@ -49,11 +49,10 @@ class OpenidServer < Application elsif self.is_authorized(identity, oidreq.trust_root) oidresp = oidreq.answer(true, nil, identity) elsif oidreq.immediate - server_url = url_for :action => 'index' + server_url = url :openid_server oidresp = oidreq.answer(false, server_url) else - show_decision_page(oidreq) - return + return show_decision_page(oidreq) end else @@ -68,10 +67,10 @@ class OpenidServer < Application @oidreq = oidreq if message - flash[:notice] = message + session[:notice] = message end - render :template => 'server/decide', :layout => 'server' + render :template => 'openid_server/decide' end def user_page @@ -82,24 +81,23 @@ class OpenidServer < Application # to do real Accept header parsing and logic. Though I expect it will work # 99% of the time. if accept and accept.include?('application/xrds+xml') - user_xrds - return + return user_xrds end # content negotiation failed, so just render the user page - xrds_url = url_for(:controller=>'user',:action=>params[:username])+'/xrds' + xrds_url = url(:openid_user_xrds, :username => params[:username]) identity_page = <<EOS <html><head> <meta http-equiv="X-XRDS-Location" content="#{xrds_url}" /> -<link rel="openid.server" href="#{url_for :action => 'index'}" /> +<link rel="openid.server" href="#{absolute_url :openid_user, :username}" /> </head><body><p>OpenID identity page for #{params[:username]}</p> </body></html> EOS # Also add the Yadis location header, so that they don't have # to parse the html unless absolutely necessary. - response.headers['X-XRDS-Location'] = xrds_url - render :text => identity_page + @headers['X-XRDS-Location'] = xrds_url + render identity_page end def user_xrds @@ -125,7 +123,7 @@ EOS session[:last_oidreq] = nil if params[:yes].nil? - redirect_to oidreq.cancel_url + redirect oidreq.cancel_url return else id_to_send = params[:id_to_send] @@ -139,8 +137,7 @@ EOS else msg = "You must enter a username to in order to send " + "an identifier to the Relying Party." - show_decision_page(oidreq, msg) - return + return show_decision_page(oidreq, msg) end end @@ -150,8 +147,6 @@ EOS session[:approvals] = [oidreq.trust_root] end oidresp = oidreq.answer(true, nil, identity) - add_sreg(oidreq, oidresp) - add_pape(oidreq, oidresp) return self.render_response(oidresp) end end @@ -160,8 +155,8 @@ EOS def server if @server.nil? - server_url = url_for :action => 'index', :only_path => false - dir = Pathname.new(RAILS_ROOT).join('db').join('openid-store') + server_url = absolute_url(:openid_server) + dir = Pathname.new(Merb.root).join('db').join('openid-store') store = OpenID::Store::Filesystem.new(dir) @server = Server.new(store, server_url) end @@ -192,14 +187,14 @@ EOS <XRD> <Service priority="0"> #{type_str} - <URI>#{url_for(:controller => 'server', :only_path => false)}</URI> + <URI>#{absolute_url(:openid_server)}</URI> </Service> </XRD> </xrds:XRDS> EOS - response.headers['content-type'] = 'application/xrds+xml' - render :text => yadis + @headers['content-type'] = 'application/xrds+xml' + render yadis end def render_response(oidresp) @@ -210,13 +205,13 @@ EOS case web_response.code when HTTP_OK - render :text => web_response.body, :status => 200 - + @status = 200 + render web_response.body when HTTP_REDIRECT - redirect_to web_response.headers['location'] - + redirect web_response.headers['location'] else - render :text => web_response.body, :status => 400 + @status = 400 + render web_response.body end end diff --git a/packages/chef-server/app/helpers/openid_server_helpers.rb b/packages/chef-server/app/helpers/openid_server_helpers.rb index 466287ac1a..8e595ead01 100644 --- a/packages/chef-server/app/helpers/openid_server_helpers.rb +++ b/packages/chef-server/app/helpers/openid_server_helpers.rb @@ -2,7 +2,7 @@ module Merb module OpenidServerHelper def url_for_user - url :controller => 'user', :action => session[:username] + url(:openid_user, :username => session[:username]) end end diff --git a/packages/chef-server/app/views/layout/application.html.haml b/packages/chef-server/app/views/layout/application.html.haml index 074c55ce0f..ea9d378ad4 100644 --- a/packages/chef-server/app/views/layout/application.html.haml +++ b/packages/chef-server/app/views/layout/application.html.haml @@ -9,7 +9,7 @@ = catch_content :for_layout .footer - if session[:username] - %a{:href => url(:controller => "openid_login", :action => "logout")}= "Log Out #{session[:username]}" + %a{:href => url(:openid_logout)}= "Log Out #{session[:username]}" %br/ - = url(:controller => "openid_server", :action => "user_page", :username => session[:username]) + = absolute_url(:openid_user, :username => session[:username])
\ No newline at end of file diff --git a/packages/chef-server/app/views/nodes/_action.html.haml b/packages/chef-server/app/views/nodes/_action.html.haml new file mode 100644 index 0000000000..a809a6d70c --- /dev/null +++ b/packages/chef-server/app/views/nodes/_action.html.haml @@ -0,0 +1,13 @@ +%table + - actions.each do |action, resource_hash| + %tr + %td.action_name= action.to_s + %td.action_resources + %table + - resource_hash.keys.sort{ |a,b| a.to_s <=> b.to_s }.each do |rk| + %tr + %td.action_when= rk.to_s + %td + - resource_hash[rk].each do |resource| + = partial(:resource, :resource => resource) +
\ No newline at end of file diff --git a/packages/chef-server/app/views/nodes/_resource.html.haml b/packages/chef-server/app/views/nodes/_resource.html.haml index bc7b55f91f..7b9776b816 100644 --- a/packages/chef-server/app/views/nodes/_resource.html.haml +++ b/packages/chef-server/app/views/nodes/_resource.html.haml @@ -7,17 +7,16 @@ %tr.attr_group %td.attr_name = "#{h attr_name}" - - value = resource.instance_variable_get(v) - - if value.kind_of?(String) - %td.attr_value + %td.attr_value + - value = resource.instance_variable_get(v) + - if value.kind_of?(String) = "#{h value}" - - elsif value.kind_of?(Array) - %td.attr_value + - elsif value.kind_of?(Array) = "#{h value.join(", ")}" - - elsif value.kind_of?(Symbol) - %td.attr_value + - elsif value.kind_of?(Symbol) = "#{h value.to_s}" - - else - %td.attr_value + - elsif attr_name == "actions" + = partial(:action, :actions => value) + - else = "#{h value.inspect}" diff --git a/packages/chef-server/app/views/openid_consumer/index.html.haml b/packages/chef-server/app/views/openid_consumer/index.html.haml new file mode 100644 index 0000000000..576ef8d787 --- /dev/null +++ b/packages/chef-server/app/views/openid_consumer/index.html.haml @@ -0,0 +1,25 @@ +%h1 OpenID Relying Party +-if session[:alert] + .alert= h session[:alert] +-if session[:error] + .error= h session[:error] +-if session[:success] + .success= h session[:success] +#verify-form + %form{ :method => "get", "accept-charset" => "UTF-8", :action => url(:openid_consumer_start) } + Identifier: + %input.openid{ :type => "text", :name => "openid_identifier" }/ + %input{ :type => "submit", :value => "Verify"}/ + %br + %input#immediate{ :name => "immediate", :type => "checkbox" }/ + %label{:for => "immediate"} Use immediate mode + %br + %input#immediate{ :name => "use_sreg", :type => "checkbox" }/ + %label{:for => "use_sreg"} Request registration data + %br + %input#immediate{ :name => "use_pape", :type => "checkbox" }/ + %label{:for => "use_pape"} Request phishing-resistent auth policy + %br + %input#immediate{ :name => "force_post", :type => "checkbox" }/ + %label{:for => "force_post"} Force the transaction to POST + %br diff --git a/packages/chef-server/app/views/openid_consumer/start.htmlhaml b/packages/chef-server/app/views/openid_consumer/start.htmlhaml new file mode 100644 index 0000000000..75ed9a9257 --- /dev/null +++ b/packages/chef-server/app/views/openid_consumer/start.htmlhaml @@ -0,0 +1,4 @@ +<%= @form_text %> +<script type="text/javascript"> +document.getElementById('openid_form').submit(); +</script>
\ No newline at end of file diff --git a/packages/chef-server/app/views/openid_login/index.html.haml b/packages/chef-server/app/views/openid_login/index.html.haml index 2bc2ef7c65..17ae69017a 100644 --- a/packages/chef-server/app/views/openid_login/index.html.haml +++ b/packages/chef-server/app/views/openid_login/index.html.haml @@ -1,6 +1,6 @@ %h1 Login #login-form - %form{ :method => "get", :action => url(:controller => "openid_login", :action => 'submit') } + %form{ :method => "get", :action => url(:openid_login_submit) } %input{ :type => "text", :name => "username" }/ %input{ :type => "submit", :value => "Log In"}/
\ No newline at end of file diff --git a/packages/chef-server/app/views/openid_server/decide.html.haml b/packages/chef-server/app/views/openid_server/decide.html.haml new file mode 100644 index 0000000000..78b0b60881 --- /dev/null +++ b/packages/chef-server/app/views/openid_server/decide.html.haml @@ -0,0 +1,21 @@ +%form{:method => "post", :action => url(:openid_server_decision)} + %table + %tr + %td Site: + %td= @oidreq.trust_root + - if @oidreq.id_select + %tr + %td{:colspan => "2"} + You entered the server identifier at the relying party. + You will need to send an identifier of your choosing. + Enter a username below. + %tr + %td Identity to send: + %td + %input{:type => "text", :name => "id_to_send", :size => "25"} + - else + %tr + %td Identity: + %td= @oidreq.identity + %input{:type => "submit", :name => "yes", :value => "yes"} + %input{:type => "submit", :name => "no", :value => "no"}
\ No newline at end of file diff --git a/packages/chef-server/config/init.rb b/packages/chef-server/config/init.rb index bdd6d3f8ce..258690f7c8 100644 --- a/packages/chef-server/config/init.rb +++ b/packages/chef-server/config/init.rb @@ -150,3 +150,8 @@ end # And the result is: # irb> "wife".plural # => wives + +begin + require File.join(File.dirname(__FILE__), '..', 'lib', 'authenticated_system/authenticated_dependencies') +rescue LoadError +end diff --git a/packages/chef-server/config/router.rb b/packages/chef-server/config/router.rb index 500154be33..9cf5725c44 100644 --- a/packages/chef-server/config/router.rb +++ b/packages/chef-server/config/router.rb @@ -31,20 +31,29 @@ Merb::Router.prepare do |r| r.resources :nodes r.resources :nodes, :member => { :compile => :get } + + r.resources :openid do |res| + res.resources :register, :controller => "openid_register" + end - r.match("/openid_server").to(:controller => "openid_server", :action => "index") - r.match("/openid_server/server/xrds"). - to(:controller => "openid_server", :action => 'idp_xrds') - r.match("/openid_server/user/:username"). - to(:controller => "openid_server", :action => 'user_page') - r.match('/openid_server/user/:username/xrds'). - to(:controller => 'openid_server', :action => 'user_xrds') - r.match('/openid_login').to(:controller => 'openid_login', :action => 'index') - r.match('/openid_login/submit').to(:controller => 'openid_login', :action => 'submit') - r.match('/openid_login/logout').to(:controller => 'openid_login', :action => 'logout') + r.match("/openid/server").to(:controller => "openid_server", :action => "index").name(:openid_server) + r.match("/openid/server/server/xrds"). + to(:controller => "openid_server", :action => 'idp_xrds').name(:openid_server_xrds) + r.match("/openid/server/user/:username"). + to(:controller => "openid_server", :action => 'user_page').name(:openid_user) + r.match('/openid/server/user/:username/xrds'). + to(:controller => 'openid_server', :action => 'user_xrds').name(:openid_user_xrds) + r.match('/openid/server/decision').to(:controller => "openid_server", :action => "decision").name(:openid_server_decision) + r.match('/openid/login').to(:controller => 'openid_login', :action => 'index').name(:openid_login) + r.match('/openid/login/submit').to(:controller => 'openid_login', :action => 'submit').name(:openid_login_submit) + r.match('/openid/login/logout').to(:controller => 'openid_login', :action => 'logout').name(:openid_logout) + r.match('/openid/consumer').to(:controller => 'openid_consumer', :action => 'index').name(:openid_consumer) + r.match('/openid/consumer/start').to(:controller => 'openid_consumer', :action => 'start').name(:openid_consumer_start) + r.match('/openid/consumer/complete').to(:controller => 'openid_consumer', :action => 'complete').name(:openid_consumer_complete) #r.default_routes # Change this for your home page to be available at / # r.match('/').to(:controller => 'whatever', :action =>'index') -end
\ No newline at end of file +end + diff --git a/packages/chef-server/log/merb_test.log b/packages/chef-server/log/merb_test.log index d56430f23a..b60074d0ae 100644 --- a/packages/chef-server/log/merb_test.log +++ b/packages/chef-server/log/merb_test.log @@ -3857,3 +3857,809 @@ undefined method `connect' for #<Merb::Router::Behavior:0x1830e7c> - (NoMethodEr ~ {:after_filters_time=>6.0e-06, :action_time=>0.000325, :before_filters_time=>7.7e-05} ~ {:after_filters_time=>5.0e-06, :action_time=>0.000327, :before_filters_time=>7.5e-05} ~ {:after_filters_time=>5.0e-06, :action_time=>0.000348, :before_filters_time=>7.8e-05} + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ {:after_filters_time=>9.0e-06, :action_time=>0.001767, :before_filters_time=>0.0001} + ~ {:after_filters_time=>8.0e-06, :action_time=>0.000325, :before_filters_time=>7.8e-05} + ~ {:after_filters_time=>9.0e-06, :action_time=>0.000404, :before_filters_time=>0.000133} + ~ {:after_filters_time=>8.0e-06, :action_time=>0.000318, :before_filters_time=>0.00011} + ~ {:after_filters_time=>8.0e-06, :action_time=>0.000328, :before_filters_time=>5.0e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000282, :before_filters_time=>4.0e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000306, :before_filters_time=>0.0001} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.000265, :before_filters_time=>8.1e-05} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.000281, :before_filters_time=>8.1e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000279, :before_filters_time=>7.9e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000263, :before_filters_time=>7.9e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000358, :before_filters_time=>8.4e-05} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.000359, :before_filters_time=>7.8e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000327, :before_filters_time=>7.8e-05} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.000328, :before_filters_time=>7.5e-05} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.000333, :before_filters_time=>7.6e-05} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.000335, :before_filters_time=>7.8e-05} + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ {:after_filters_time=>6.0e-06, :action_time=>0.001247, :before_filters_time=>7.7e-05} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.000234, :before_filters_time=>6.3e-05} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.000279, :before_filters_time=>9.9e-05} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.00023, :before_filters_time=>8.1e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000238, :before_filters_time=>3.2e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000275, :before_filters_time=>4.1e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000277, :before_filters_time=>8.9e-05} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.000247, :before_filters_time=>7.6e-05} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.00026, :before_filters_time=>7.6e-05} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.000261, :before_filters_time=>7.5e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000246, :before_filters_time=>7.8e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000368, :before_filters_time=>8.4e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000361, :before_filters_time=>7.8e-05} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.000354, :before_filters_time=>8.2e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000384, :before_filters_time=>9.0e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000376, :before_filters_time=>9.1e-05} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.000351, :before_filters_time=>8.1e-05} + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ {:after_filters_time=>6.0e-06, :action_time=>0.001175, :before_filters_time=>7.8e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000243, :before_filters_time=>7.0e-05} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.000267, :before_filters_time=>9.2e-05} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.000216, :before_filters_time=>7.5e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000251, :before_filters_time=>3.6e-05} + ~ {:after_filters_time=>2.7e-05, :action_time=>0.000257, :before_filters_time=>3.1e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.00034, :before_filters_time=>0.000118} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.000322, :before_filters_time=>9.5e-05} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.000269, :before_filters_time=>7.7e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000302, :before_filters_time=>0.00011} + ~ {:after_filters_time=>7.0e-06, :action_time=>0.000254, :before_filters_time=>7.9e-05} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.000396, :before_filters_time=>9.3e-05} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.00038, :before_filters_time=>8.2e-05} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.000345, :before_filters_time=>8.2e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000332, :before_filters_time=>7.8e-05} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.000329, :before_filters_time=>7.5e-05} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.000353, :before_filters_time=>8.3e-05} + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ {:after_filters_time=>6.0e-06, :action_time=>0.001155, :before_filters_time=>7.1e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.0002, :before_filters_time=>5.2e-05} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.000288, :before_filters_time=>0.000112} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.000215, :before_filters_time=>7.5e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000247, :before_filters_time=>3.2e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000245, :before_filters_time=>3.6e-05} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.000264, :before_filters_time=>8.4e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000268, :before_filters_time=>7.7e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000262, :before_filters_time=>7.4e-05} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.000259, :before_filters_time=>7.5e-05} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.000244, :before_filters_time=>7.5e-05} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.000365, :before_filters_time=>8.3e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000358, :before_filters_time=>7.7e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000392, :before_filters_time=>8.5e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000345, :before_filters_time=>8.1e-05} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.000335, :before_filters_time=>7.7e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000346, :before_filters_time=>8.0e-05} + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ {:after_filters_time=>7.0e-06, :action_time=>0.001156, :before_filters_time=>7.1e-05} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.000207, :before_filters_time=>5.7e-05} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.000264, :before_filters_time=>9.2e-05} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.000227, :before_filters_time=>7.5e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000235, :before_filters_time=>3.3e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000269, :before_filters_time=>3.8e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000285, :before_filters_time=>8.9e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000305, :before_filters_time=>0.000121} + ~ {:after_filters_time=>7.0e-06, :action_time=>0.00058, :before_filters_time=>0.000338} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000262, :before_filters_time=>7.8e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000308, :before_filters_time=>8.3e-05} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.000372, :before_filters_time=>8.7e-05} + ~ {:after_filters_time=>7.0e-06, :action_time=>0.000364, :before_filters_time=>7.9e-05} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.000337, :before_filters_time=>8.0e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000341, :before_filters_time=>7.8e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000331, :before_filters_time=>7.6e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000337, :before_filters_time=>7.9e-05} + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ {:after_filters_time=>5.0e-06, :action_time=>0.001132, :before_filters_time=>7.0e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000202, :before_filters_time=>5.6e-05} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.000265, :before_filters_time=>9.2e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000235, :before_filters_time=>8.2e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000246, :before_filters_time=>3.6e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000235, :before_filters_time=>3.2e-05} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.000282, :before_filters_time=>8.8e-05} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.000247, :before_filters_time=>7.6e-05} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.000273, :before_filters_time=>7.9e-05} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.000259, :before_filters_time=>7.6e-05} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.000243, :before_filters_time=>7.6e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000369, :before_filters_time=>8.6e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000361, :before_filters_time=>7.9e-05} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.000334, :before_filters_time=>7.9e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000328, :before_filters_time=>7.8e-05} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.000347, :before_filters_time=>8.2e-05} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.000381, :before_filters_time=>9.0e-05} + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ {:after_filters_time=>6.0e-06, :action_time=>0.001131, :before_filters_time=>7.3e-05} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.000211, :before_filters_time=>5.8e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000291, :before_filters_time=>9.8e-05} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.000215, :before_filters_time=>7.6e-05} + ~ {:after_filters_time=>7.0e-06, :action_time=>0.000288, :before_filters_time=>4.5e-05} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.000285, :before_filters_time=>4.3e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.00034, :before_filters_time=>0.000106} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000288, :before_filters_time=>8.6e-05} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.000305, :before_filters_time=>8.8e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.00027, :before_filters_time=>8.0e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000246, :before_filters_time=>7.7e-05} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.000398, :before_filters_time=>9.3e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000373, :before_filters_time=>8.1e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000341, :before_filters_time=>8.1e-05} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.000327, :before_filters_time=>7.7e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000339, :before_filters_time=>7.7e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000328, :before_filters_time=>7.6e-05} + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ {:after_filters_time=>7.0e-06, :action_time=>0.001415, :before_filters_time=>8.8e-05} + ~ {:after_filters_time=>7.0e-06, :action_time=>0.00024, :before_filters_time=>6.6e-05} + ~ {:after_filters_time=>7.0e-06, :action_time=>0.00032, :before_filters_time=>0.000107} + ~ {:after_filters_time=>7.0e-06, :action_time=>0.00026, :before_filters_time=>9.1e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000263, :before_filters_time=>3.8e-05} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.000244, :before_filters_time=>3.4e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000265, :before_filters_time=>8.6e-05} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.000246, :before_filters_time=>7.7e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.00026, :before_filters_time=>7.5e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.00028, :before_filters_time=>8.3e-05} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.000244, :before_filters_time=>7.7e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000372, :before_filters_time=>8.7e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000373, :before_filters_time=>8.1e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000328, :before_filters_time=>7.7e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000335, :before_filters_time=>7.5e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000344, :before_filters_time=>8.0e-05} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.000326, :before_filters_time=>7.7e-05} + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ {:after_filters_time=>6.0e-06, :action_time=>0.001192, :before_filters_time=>8.0e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000268, :before_filters_time=>8.5e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000279, :before_filters_time=>9.5e-05} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.000218, :before_filters_time=>7.6e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000238, :before_filters_time=>3.2e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000245, :before_filters_time=>3.4e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000269, :before_filters_time=>8.6e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000247, :before_filters_time=>7.7e-05} + ~ {:after_filters_time=>7.0e-06, :action_time=>0.000261, :before_filters_time=>7.5e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000259, :before_filters_time=>7.6e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000242, :before_filters_time=>7.5e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000371, :before_filters_time=>8.6e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000448, :before_filters_time=>9.6e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000347, :before_filters_time=>8.3e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000329, :before_filters_time=>7.7e-05} + ~ {:after_filters_time=>7.0e-06, :action_time=>0.000336, :before_filters_time=>7.6e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000336, :before_filters_time=>7.8e-05} + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ {:after_filters_time=>6.0e-06, :action_time=>0.001128, :before_filters_time=>7.3e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000368, :before_filters_time=>5.6e-05} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.000278, :before_filters_time=>9.8e-05} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.000224, :before_filters_time=>7.7e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000266, :before_filters_time=>3.6e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000253, :before_filters_time=>3.6e-05} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.000264, :before_filters_time=>8.5e-05} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.000254, :before_filters_time=>8.2e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000268, :before_filters_time=>7.5e-05} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.000261, :before_filters_time=>7.6e-05} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.000242, :before_filters_time=>7.5e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000373, :before_filters_time=>8.6e-05} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.00036, :before_filters_time=>7.7e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000329, :before_filters_time=>7.6e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000325, :before_filters_time=>7.4e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000333, :before_filters_time=>7.7e-05} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.00033, :before_filters_time=>7.6e-05} + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ {:after_filters_time=>7.0e-06, :action_time=>0.001236, :before_filters_time=>7.5e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.0002, :before_filters_time=>5.3e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000295, :before_filters_time=>0.0001} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.000217, :before_filters_time=>7.6e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000307, :before_filters_time=>4.8e-05} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.000273, :before_filters_time=>3.8e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000267, :before_filters_time=>8.5e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000277, :before_filters_time=>8.3e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000313, :before_filters_time=>9.1e-05} + ~ {:after_filters_time=>7.0e-06, :action_time=>0.000297, :before_filters_time=>8.6e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000276, :before_filters_time=>8.4e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000437, :before_filters_time=>0.000102} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.000364, :before_filters_time=>7.9e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000376, :before_filters_time=>8.5e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000347, :before_filters_time=>8.2e-05} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.00033, :before_filters_time=>7.4e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000392, :before_filters_time=>7.4e-05} + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ {:after_filters_time=>6.0e-06, :action_time=>0.001106, :before_filters_time=>7.2e-05} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.000407, :before_filters_time=>5.9e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000264, :before_filters_time=>9.2e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000253, :before_filters_time=>9.7e-05} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.000248, :before_filters_time=>3.5e-05} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.000233, :before_filters_time=>3.2e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000261, :before_filters_time=>8.2e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000471, :before_filters_time=>7.6e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000278, :before_filters_time=>8.4e-05} + ~ {:after_filters_time=>7.0e-06, :action_time=>0.000279, :before_filters_time=>7.9e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000264, :before_filters_time=>8.7e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000366, :before_filters_time=>8.5e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000378, :before_filters_time=>8.0e-05} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.000346, :before_filters_time=>8.1e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000328, :before_filters_time=>7.6e-05} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.000331, :before_filters_time=>7.5e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000334, :before_filters_time=>7.7e-05} + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ {:after_filters_time=>6.0e-06, :action_time=>0.001271, :before_filters_time=>8.2e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000423, :before_filters_time=>5.9e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000297, :before_filters_time=>0.000105} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000257, :before_filters_time=>8.8e-05} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.000288, :before_filters_time=>4.5e-05} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.000279, :before_filters_time=>4.1e-05} + ~ {:after_filters_time=>7.0e-06, :action_time=>0.000321, :before_filters_time=>0.000103} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000304, :before_filters_time=>9.4e-05} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.000283, :before_filters_time=>8.3e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000282, :before_filters_time=>8.1e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000257, :before_filters_time=>8.1e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000409, :before_filters_time=>9.8e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000397, :before_filters_time=>8.8e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.00036, :before_filters_time=>8.3e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000339, :before_filters_time=>8.2e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000354, :before_filters_time=>8.0e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.002329, :before_filters_time=>8.8e-05} + ~ Compiling routes... + ~ Compiling routes... + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ {:after_filters_time=>6.0e-06, :action_time=>0.001102, :before_filters_time=>7.1e-05} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.000202, :before_filters_time=>5.4e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000263, :before_filters_time=>9.2e-05} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.000223, :before_filters_time=>8.0e-05} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.000237, :before_filters_time=>3.2e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000243, :before_filters_time=>3.2e-05} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.000265, :before_filters_time=>8.3e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000264, :before_filters_time=>8.1e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000272, :before_filters_time=>7.9e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000284, :before_filters_time=>8.3e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000244, :before_filters_time=>7.6e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000364, :before_filters_time=>8.3e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000366, :before_filters_time=>7.9e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000393, :before_filters_time=>9.3e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.00033, :before_filters_time=>7.8e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000334, :before_filters_time=>7.6e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000351, :before_filters_time=>8.1e-05} + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ {:after_filters_time=>7.0e-06, :action_time=>0.001126, :before_filters_time=>7.1e-05} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.000185, :before_filters_time=>5.1e-05} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.000256, :before_filters_time=>8.9e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000215, :before_filters_time=>7.5e-05} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.000231, :before_filters_time=>3.0e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000297, :before_filters_time=>4.5e-05} + ~ {:after_filters_time=>1.0e-05, :action_time=>0.00108, :before_filters_time=>0.000704} + ~ {:after_filters_time=>9.0e-06, :action_time=>0.000436, :before_filters_time=>0.00014} + ~ {:after_filters_time=>9.0e-06, :action_time=>0.000414, :before_filters_time=>0.00012} + ~ {:after_filters_time=>8.0e-06, :action_time=>0.000394, :before_filters_time=>0.000114} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000265, :before_filters_time=>8.3e-05} + ~ {:after_filters_time=>8.0e-06, :action_time=>0.002102, :before_filters_time=>8.6e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000693, :before_filters_time=>9.1e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000643, :before_filters_time=>8.8e-05} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.000572, :before_filters_time=>7.9e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000597, :before_filters_time=>7.8e-05} + ~ {:after_filters_time=>7.0e-06, :action_time=>0.000948, :before_filters_time=>9.4e-05} + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ {:after_filters_time=>6.0e-06, :action_time=>0.001129, :before_filters_time=>7.4e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000211, :before_filters_time=>5.7e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000265, :before_filters_time=>9.3e-05} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.000219, :before_filters_time=>7.7e-05} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.000236, :before_filters_time=>3.2e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000238, :before_filters_time=>3.3e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000261, :before_filters_time=>8.4e-05} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.000244, :before_filters_time=>7.5e-05} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.000261, :before_filters_time=>7.5e-05} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.000259, :before_filters_time=>7.6e-05} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.000268, :before_filters_time=>8.5e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000433, :before_filters_time=>0.000118} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000417, :before_filters_time=>8.5e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000385, :before_filters_time=>8.7e-05} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.000401, :before_filters_time=>8.1e-05} + ~ {:after_filters_time=>8.0e-06, :action_time=>0.001825, :before_filters_time=>8.5e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000446, :before_filters_time=>8.8e-05} + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ {:after_filters_time=>1.2e-05, :action_time=>0.023814, :before_filters_time=>0.000147} + ~ {:after_filters_time=>1.6e-05, :action_time=>0.000572, :before_filters_time=>0.000151} + ~ {:after_filters_time=>9.0e-06, :action_time=>0.000443, :before_filters_time=>0.000151} + ~ {:after_filters_time=>9.0e-06, :action_time=>0.000388, :before_filters_time=>0.00014} + ~ {:after_filters_time=>9.0e-06, :action_time=>0.000466, :before_filters_time=>5.9e-05} + ~ {:after_filters_time=>8.0e-06, :action_time=>0.000352, :before_filters_time=>4.9e-05} + ~ {:after_filters_time=>7.0e-06, :action_time=>0.000346, :before_filters_time=>0.00011} + ~ {:after_filters_time=>7.0e-06, :action_time=>0.000294, :before_filters_time=>8.9e-05} + ~ {:after_filters_time=>7.0e-06, :action_time=>0.00031, :before_filters_time=>8.9e-05} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.000257, :before_filters_time=>7.6e-05} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.000243, :before_filters_time=>7.5e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000431, :before_filters_time=>8.9e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000388, :before_filters_time=>7.6e-05} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.000359, :before_filters_time=>7.7e-05} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.000355, :before_filters_time=>7.6e-05} + ~ {:after_filters_time=>1.0e-05, :action_time=>0.001889, :before_filters_time=>7.7e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000411, :before_filters_time=>9.1e-05} + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ {:after_filters_time=>6.0e-06, :action_time=>0.001137, :before_filters_time=>7.3e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000214, :before_filters_time=>5.7e-05} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.000273, :before_filters_time=>9.4e-05} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.000218, :before_filters_time=>7.6e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000241, :before_filters_time=>3.2e-05} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.000233, :before_filters_time=>3.2e-05} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.000263, :before_filters_time=>8.4e-05} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.000241, :before_filters_time=>7.3e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.00027, :before_filters_time=>7.7e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000261, :before_filters_time=>7.6e-05} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.000243, :before_filters_time=>7.5e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.0004, :before_filters_time=>8.7e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000387, :before_filters_time=>7.6e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000392, :before_filters_time=>7.8e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000359, :before_filters_time=>7.8e-05} + ~ {:after_filters_time=>7.0e-06, :action_time=>0.00178, :before_filters_time=>7.8e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000442, :before_filters_time=>0.000138} + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ Compiling routes... + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ Compiling routes... + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ {:after_filters_time=>9.0e-06, :action_time=>0.001771, :before_filters_time=>0.000106} + ~ {:after_filters_time=>1.0e-05, :action_time=>0.000332, :before_filters_time=>9.1e-05} + ~ {:after_filters_time=>9.0e-06, :action_time=>0.000448, :before_filters_time=>0.000153} + ~ {:after_filters_time=>9.0e-06, :action_time=>0.000367, :before_filters_time=>0.000129} + ~ {:after_filters_time=>1.0e-05, :action_time=>0.000517, :before_filters_time=>5.6e-05} + ~ {:after_filters_time=>9.0e-06, :action_time=>0.000393, :before_filters_time=>5.3e-05} + ~ {:after_filters_time=>9.0e-06, :action_time=>0.000459, :before_filters_time=>0.000145} + ~ {:after_filters_time=>9.0e-06, :action_time=>0.000433, :before_filters_time=>0.000134} + ~ {:after_filters_time=>1.0e-05, :action_time=>0.000444, :before_filters_time=>0.000129} + ~ {:after_filters_time=>1.0e-05, :action_time=>0.000442, :before_filters_time=>0.00013} + ~ {:after_filters_time=>8.0e-06, :action_time=>0.000362, :before_filters_time=>0.000113} + ~ {:after_filters_time=>7.0e-06, :action_time=>0.000525, :before_filters_time=>0.000113} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000456, :before_filters_time=>9.1e-05} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.000356, :before_filters_time=>7.7e-05} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.000352, :before_filters_time=>7.6e-05} + ~ {:after_filters_time=>8.0e-06, :action_time=>0.001721, :before_filters_time=>7.9e-05} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.000374, :before_filters_time=>8.5e-05} + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ {:after_filters_time=>6.0e-06, :action_time=>0.001082, :before_filters_time=>6.8e-05} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.00021, :before_filters_time=>5.4e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000273, :before_filters_time=>9.5e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000216, :before_filters_time=>7.6e-05} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.000236, :before_filters_time=>3.3e-05} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.000243, :before_filters_time=>3.1e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000264, :before_filters_time=>8.3e-05} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.000251, :before_filters_time=>7.7e-05} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.000261, :before_filters_time=>7.6e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000596, :before_filters_time=>0.000381} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.000253, :before_filters_time=>8.0e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.00042, :before_filters_time=>8.9e-05} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.000398, :before_filters_time=>7.7e-05} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.000353, :before_filters_time=>7.6e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000357, :before_filters_time=>7.6e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.00175, :before_filters_time=>7.6e-05} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.000385, :before_filters_time=>8.7e-05} + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ {:before_filters_time=>7.0e-05, :after_filters_time=>6.0e-06, :action_time=>0.001103} + ~ {:before_filters_time=>5.5e-05, :after_filters_time=>6.0e-06, :action_time=>0.000201} + ~ {:before_filters_time=>9.0e-05, :after_filters_time=>5.0e-06, :action_time=>0.000258} + ~ {:before_filters_time=>7.5e-05, :after_filters_time=>5.0e-06, :action_time=>0.000215} + ~ {:before_filters_time=>3.1e-05, :after_filters_time=>6.0e-06, :action_time=>0.000237} + ~ {:before_filters_time=>3.3e-05, :after_filters_time=>5.0e-06, :action_time=>0.000244} + ~ {:before_filters_time=>8.5e-05, :after_filters_time=>6.0e-06, :action_time=>0.000268} + ~ {:before_filters_time=>8.4e-05, :after_filters_time=>5.0e-06, :action_time=>0.000267} + ~ {:before_filters_time=>7.6e-05, :after_filters_time=>5.0e-06, :action_time=>0.000261} + ~ {:before_filters_time=>7.4e-05, :after_filters_time=>5.0e-06, :action_time=>0.000257} + ~ {:before_filters_time=>7.4e-05, :after_filters_time=>5.0e-06, :action_time=>0.000242} + ~ {:before_filters_time=>8.8e-05, :after_filters_time=>5.0e-06, :action_time=>0.000405} + ~ {:before_filters_time=>8.4e-05, :after_filters_time=>5.0e-06, :action_time=>0.000394} + ~ {:before_filters_time=>7.6e-05, :after_filters_time=>5.0e-06, :action_time=>0.000356} + ~ {:before_filters_time=>0.0001, :after_filters_time=>5.0e-06, :action_time=>0.000393} + ~ {:before_filters_time=>7.6e-05, :after_filters_time=>8.0e-06, :action_time=>0.001782} + ~ {:before_filters_time=>8.6e-05, :after_filters_time=>5.0e-06, :action_time=>0.000374} + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ {:before_filters_time=>7.0e-05, :after_filters_time=>6.0e-06, :action_time=>0.001082} + ~ {:before_filters_time=>8.2e-05, :after_filters_time=>6.0e-06, :action_time=>0.000229} + ~ {:before_filters_time=>9.2e-05, :after_filters_time=>5.0e-06, :action_time=>0.000271} + ~ {:before_filters_time=>7.8e-05, :after_filters_time=>5.0e-06, :action_time=>0.000224} + ~ {:before_filters_time=>3.1e-05, :after_filters_time=>6.0e-06, :action_time=>0.000235} + ~ {:before_filters_time=>3.0e-05, :after_filters_time=>5.0e-06, :action_time=>0.000235} + ~ {:before_filters_time=>8.9e-05, :after_filters_time=>8.0e-06, :action_time=>0.000283} + ~ {:before_filters_time=>7.5e-05, :after_filters_time=>6.0e-06, :action_time=>0.00025} + ~ {:before_filters_time=>7.9e-05, :after_filters_time=>5.0e-06, :action_time=>0.000274} + ~ {:before_filters_time=>7.7e-05, :after_filters_time=>6.0e-06, :action_time=>0.000265} + ~ {:before_filters_time=>8.0e-05, :after_filters_time=>5.0e-06, :action_time=>0.000262} + ~ {:before_filters_time=>8.8e-05, :after_filters_time=>6.0e-06, :action_time=>0.000408} + ~ {:before_filters_time=>7.5e-05, :after_filters_time=>5.0e-06, :action_time=>0.00038} + ~ {:before_filters_time=>7.9e-05, :after_filters_time=>6.0e-06, :action_time=>0.000369} + ~ {:before_filters_time=>7.7e-05, :after_filters_time=>5.0e-06, :action_time=>0.000362} + ~ {:before_filters_time=>8.4e-05, :after_filters_time=>1.9e-05, :action_time=>0.093813} + ~ {:before_filters_time=>0.000278, :after_filters_time=>1.0e-05, :action_time=>0.000793} + ~ Compiling routes... + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ {:after_filters_time=>1.1e-05, :action_time=>0.018998, :before_filters_time=>0.000118} + ~ {:after_filters_time=>9.0e-06, :action_time=>0.000337, :before_filters_time=>9.1e-05} + ~ {:after_filters_time=>9.0e-06, :action_time=>0.000543, :before_filters_time=>0.000152} + ~ {:after_filters_time=>9.0e-06, :action_time=>0.000368, :before_filters_time=>0.000127} + ~ {:after_filters_time=>7.0e-06, :action_time=>0.000331, :before_filters_time=>4.1e-05} + ~ {:after_filters_time=>7.0e-06, :action_time=>0.000309, :before_filters_time=>4.3e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000265, :before_filters_time=>8.2e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000264, :before_filters_time=>7.9e-05} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.000264, :before_filters_time=>7.6e-05} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.000255, :before_filters_time=>7.5e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000243, :before_filters_time=>7.5e-05} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.00043, :before_filters_time=>8.3e-05} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.000388, :before_filters_time=>7.5e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000374, :before_filters_time=>8.2e-05} + ~ {:after_filters_time=>5.0e-06, :action_time=>0.000357, :before_filters_time=>7.7e-05} + ~ {:after_filters_time=>1.4e-05, :action_time=>0.011019, :before_filters_time=>7.5e-05} + ~ {:after_filters_time=>1.0e-05, :action_time=>0.000678, :before_filters_time=>0.000157} + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ {:action_time=>0.001096, :before_filters_time=>7.0e-05, :after_filters_time=>7.0e-06} + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ {:action_time=>0.001103, :before_filters_time=>6.9e-05, :after_filters_time=>7.0e-06} + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ {:action_time=>0.001071, :before_filters_time=>6.8e-05, :after_filters_time=>6.0e-06} + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ {:action_time=>0.001121, :before_filters_time=>6.8e-05, :after_filters_time=>6.0e-06} + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ {:action_time=>0.001196, :before_filters_time=>7.3e-05, :after_filters_time=>7.0e-06} + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ {:action_time=>0.001087, :before_filters_time=>6.8e-05, :after_filters_time=>7.0e-06} + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ {:action_time=>0.001087, :before_filters_time=>6.8e-05, :after_filters_time=>7.0e-06} + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ {:action_time=>0.0011, :before_filters_time=>6.8e-05, :after_filters_time=>8.0e-06} + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ {:action_time=>0.00112, :before_filters_time=>7.7e-05, :after_filters_time=>8.0e-06} + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ {:action_time=>0.001218, :before_filters_time=>7.5e-05, :after_filters_time=>7.0e-06} + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ {:action_time=>0.001219, :before_filters_time=>7.0e-05, :after_filters_time=>7.0e-06} + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ {:action_time=>0.001112, :before_filters_time=>6.8e-05, :after_filters_time=>6.0e-06} + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ {:action_time=>0.001286, :before_filters_time=>7.2e-05, :after_filters_time=>6.0e-06} + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ {:action_time=>0.001077, :before_filters_time=>7.0e-05, :after_filters_time=>6.0e-06} + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ {:action_time=>0.001078, :before_filters_time=>6.8e-05, :after_filters_time=>6.0e-06} + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ {:action_time=>0.001124, :before_filters_time=>7.3e-05, :after_filters_time=>6.0e-06} + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ {:action_time=>0.001176, :before_filters_time=>7.2e-05, :after_filters_time=>7.0e-06} + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ {:action_time=>0.001078, :before_filters_time=>6.9e-05, :after_filters_time=>7.0e-06} + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ {:action_time=>0.001078, :before_filters_time=>6.8e-05, :after_filters_time=>7.0e-06} + ~ {:action_time=>0.000428, :before_filters_time=>6.0e-06, :after_filters_time=>6.0e-06} + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ {:after_filters_time=>7.0e-06, :action_time=>0.001178, :before_filters_time=>8.1e-05} + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ {:after_filters_time=>6.0e-06, :action_time=>0.001267, :before_filters_time=>7.3e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000439, :before_filters_time=>6.0e-06} + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ {:after_filters_time=>9.0e-06, :action_time=>0.001688, :before_filters_time=>9.9e-05} + ~ {:after_filters_time=>7.0e-06, :action_time=>0.000473, :before_filters_time=>7.0e-06} + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ {:after_filters_time=>7.0e-06, :action_time=>0.001556, :before_filters_time=>0.000127} + ~ {:after_filters_time=>9.0e-06, :action_time=>0.000524, :before_filters_time=>7.0e-06} + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ {:after_filters_time=>5.0e-06, :action_time=>0.001082, :before_filters_time=>7.1e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000442, :before_filters_time=>7.0e-06} + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ {:after_filters_time=>6.0e-06, :action_time=>0.00044, :before_filters_time=>6.0e-06} + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ {:action_time=>0.0011, :before_filters_time=>8.0e-06, :after_filters_time=>7.0e-06} + ~ {:action_time=>0.000436, :before_filters_time=>6.0e-06, :after_filters_time=>7.0e-06} + ~ Compiling routes... + ~ Compiling routes... + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ {:action_time=>0.001106, :before_filters_time=>8.0e-06, :after_filters_time=>7.0e-06} + ~ {:action_time=>0.000432, :before_filters_time=>6.0e-06, :after_filters_time=>6.0e-06} + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ {:action_time=>0.00111, :before_filters_time=>8.0e-06, :after_filters_time=>7.0e-06} + ~ {:action_time=>0.000551, :before_filters_time=>6.0e-06, :after_filters_time=>9.0e-06} + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ {:action_time=>0.001126, :before_filters_time=>8.0e-06, :after_filters_time=>7.0e-06} + ~ {:action_time=>0.00044, :before_filters_time=>6.0e-06, :after_filters_time=>8.0e-06} + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ {:action_time=>0.001264, :before_filters_time=>8.0e-06, :after_filters_time=>6.0e-06} + ~ {:action_time=>0.000459, :before_filters_time=>6.0e-06, :after_filters_time=>6.0e-06} + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ {:action_time=>0.001127, :before_filters_time=>8.0e-06, :after_filters_time=>6.0e-06} + ~ {:action_time=>0.000428, :before_filters_time=>7.0e-06, :after_filters_time=>6.0e-06} + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ {:action_time=>0.001495, :before_filters_time=>9.0e-06, :after_filters_time=>7.0e-06} + ~ {:action_time=>0.00045, :before_filters_time=>7.0e-06, :after_filters_time=>6.0e-06} + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ {:action_time=>0.001143, :before_filters_time=>9.0e-06, :after_filters_time=>7.0e-06} + ~ {:action_time=>0.000421, :before_filters_time=>6.0e-06, :after_filters_time=>6.0e-06} + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ {:action_time=>0.001445, :before_filters_time=>1.1e-05, :after_filters_time=>7.0e-06} + ~ {:action_time=>0.000521, :before_filters_time=>7.0e-06, :after_filters_time=>7.0e-06} + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ {:action_time=>0.00117, :before_filters_time=>8.0e-06, :after_filters_time=>7.0e-06} + ~ {:action_time=>0.00043, :before_filters_time=>6.0e-06, :after_filters_time=>6.0e-06} + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ {:action_time=>0.001098, :before_filters_time=>8.0e-06, :after_filters_time=>7.0e-06} + ~ {:action_time=>0.000426, :before_filters_time=>6.0e-06, :after_filters_time=>6.0e-06} + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ {:action_time=>0.001114, :before_filters_time=>8.0e-06, :after_filters_time=>6.0e-06} + ~ {:action_time=>0.000433, :before_filters_time=>6.0e-06, :after_filters_time=>7.0e-06} + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ {:action_time=>0.001599, :before_filters_time=>1.2e-05, :after_filters_time=>8.0e-06} + ~ {:action_time=>0.000498, :before_filters_time=>8.0e-06, :after_filters_time=>7.0e-06} + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ {:action_time=>0.001155, :before_filters_time=>1.0e-05, :after_filters_time=>7.0e-06} + ~ {:action_time=>0.000423, :before_filters_time=>6.0e-06, :after_filters_time=>6.0e-06} + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ {:action_time=>0.001107, :before_filters_time=>8.0e-06, :after_filters_time=>6.0e-06} + ~ {:action_time=>0.000464, :before_filters_time=>7.0e-06, :after_filters_time=>5.0e-06} + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ {:action_time=>0.001109, :before_filters_time=>7.0e-06, :after_filters_time=>6.0e-06} + ~ {:action_time=>0.00046, :before_filters_time=>6.0e-06, :after_filters_time=>6.0e-06} + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ {:action_time=>0.001118, :before_filters_time=>8.0e-06, :after_filters_time=>6.0e-06} + ~ {:action_time=>0.000425, :before_filters_time=>7.0e-06, :after_filters_time=>6.0e-06} + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ {:action_time=>0.001099, :before_filters_time=>8.0e-06, :after_filters_time=>7.0e-06} + ~ {:action_time=>0.000421, :before_filters_time=>6.0e-06, :after_filters_time=>6.0e-06} + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ {:action_time=>0.00113, :before_filters_time=>8.0e-06, :after_filters_time=>6.0e-06} + ~ {:action_time=>0.000433, :before_filters_time=>6.0e-06, :after_filters_time=>6.0e-06} + ~ Compiling routes... + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ {:action_time=>0.001459, :before_filters_time=>1.0e-05, :after_filters_time=>8.0e-06} + ~ {:action_time=>0.000527, :before_filters_time=>8.0e-06, :after_filters_time=>6.0e-06} + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ {:after_filters_time=>7.0e-06, :action_time=>0.001208, :before_filters_time=>8.0e-06} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000485, :before_filters_time=>7.0e-06} + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ {:after_filters_time=>8.0e-06, :action_time=>0.001511, :before_filters_time=>1.0e-05} + ~ {:after_filters_time=>7.0e-06, :action_time=>0.00043, :before_filters_time=>7.0e-06} + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ {:after_filters_time=>6.0e-06, :action_time=>0.001232, :before_filters_time=>8.0e-06} + ~ {:after_filters_time=>7.0e-06, :action_time=>0.000426, :before_filters_time=>6.0e-06} + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ {:after_filters_time=>6.0e-06, :action_time=>0.001143, :before_filters_time=>8.0e-06} + ~ {:after_filters_time=>7.0e-06, :action_time=>0.000428, :before_filters_time=>7.0e-06} + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ {:after_filters_time=>6.0e-06, :action_time=>0.001344, :before_filters_time=>1.0e-05} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000432, :before_filters_time=>6.0e-06} + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ {:after_filters_time=>6.0e-06, :action_time=>0.00115, :before_filters_time=>9.0e-06} + ~ {:after_filters_time=>6.0e-06, :action_time=>0.000437, :before_filters_time=>6.0e-06} + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ {:before_filters_time=>9.0e-06, :after_filters_time=>7.0e-06, :action_time=>0.001157} + ~ {:before_filters_time=>9.0e-06, :after_filters_time=>9.0e-06, :action_time=>0.000538} + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ {:before_filters_time=>1.0e-05, :after_filters_time=>7.0e-06, :action_time=>0.001235} + ~ {:before_filters_time=>7.0e-06, :after_filters_time=>7.0e-06, :action_time=>0.000898} + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ {:before_filters_time=>1.2e-05, :after_filters_time=>9.0e-06, :action_time=>0.00151} + ~ {:before_filters_time=>6.0e-06, :after_filters_time=>7.0e-06, :action_time=>0.000435} + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ {:before_filters_time=>9.0e-06, :after_filters_time=>7.0e-06, :action_time=>0.001131} + ~ {:before_filters_time=>7.0e-06, :after_filters_time=>7.0e-06, :action_time=>0.000456} + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ {:before_filters_time=>1.0e-05, :after_filters_time=>7.0e-06, :action_time=>0.001146} + ~ {:before_filters_time=>7.0e-06, :after_filters_time=>7.0e-06, :action_time=>0.000436} + ~ {:before_filters_time=>7.0e-06, :after_filters_time=>6.0e-06, :action_time=>0.000193} + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ {:before_filters_time=>9.0e-06, :after_filters_time=>6.0e-06, :action_time=>0.001138} + ~ {:before_filters_time=>7.0e-06, :after_filters_time=>6.0e-06, :action_time=>0.000423} + ~ {:before_filters_time=>7.0e-06, :after_filters_time=>6.0e-06, :action_time=>0.000242} + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ {:before_filters_time=>8.0e-06, :after_filters_time=>8.0e-06, :action_time=>0.001145} + ~ {:before_filters_time=>6.0e-06, :after_filters_time=>6.0e-06, :action_time=>0.000426} + ~ {:before_filters_time=>7.0e-06, :after_filters_time=>6.0e-06, :action_time=>0.000234} + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ {:before_filters_time=>1.1e-05, :after_filters_time=>6.0e-06, :action_time=>0.001343} + ~ {:before_filters_time=>6.0e-06, :after_filters_time=>6.0e-06, :action_time=>0.000433} + ~ {:before_filters_time=>6.0e-06, :after_filters_time=>6.0e-06, :action_time=>0.000297} + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ {:before_filters_time=>1.1e-05, :after_filters_time=>7.0e-06, :action_time=>0.00119} + ~ {:before_filters_time=>7.0e-06, :after_filters_time=>6.0e-06, :action_time=>0.000437} + ~ {:before_filters_time=>7.0e-06, :after_filters_time=>6.0e-06, :action_time=>0.000225} + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ {:before_filters_time=>1.0e-05, :after_filters_time=>6.0e-06, :action_time=>0.001123} + ~ {:before_filters_time=>1.0e-05, :after_filters_time=>1.0e-05, :action_time=>0.001585} + ~ {:before_filters_time=>7.0e-06, :after_filters_time=>6.0e-06, :action_time=>0.000378} + ~ {:before_filters_time=>6.0e-06, :after_filters_time=>8.0e-06, :action_time=>0.000266} + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ {:before_filters_time=>9.0e-06, :after_filters_time=>7.0e-06, :action_time=>0.001215} + ~ {:before_filters_time=>9.0e-06, :after_filters_time=>9.0e-06, :action_time=>0.001497} + ~ {:before_filters_time=>6.0e-06, :after_filters_time=>6.0e-06, :action_time=>0.000378} + ~ {:before_filters_time=>7.0e-06, :after_filters_time=>7.0e-06, :action_time=>0.000254} + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ {:before_filters_time=>1.2e-05, :after_filters_time=>8.0e-06, :action_time=>0.001513} + ~ {:before_filters_time=>1.4e-05, :after_filters_time=>1.2e-05, :action_time=>0.001781} + ~ {:before_filters_time=>8.0e-06, :after_filters_time=>7.0e-06, :action_time=>0.000447} + ~ {:before_filters_time=>7.0e-06, :after_filters_time=>7.0e-06, :action_time=>0.000279} + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ {:before_filters_time=>9.0e-06, :after_filters_time=>7.0e-06, :action_time=>0.001134} + ~ {:before_filters_time=>1.0e-05, :after_filters_time=>1.1e-05, :action_time=>0.001625} + ~ {:before_filters_time=>7.0e-06, :after_filters_time=>7.0e-06, :action_time=>0.000402} + ~ {:before_filters_time=>6.0e-06, :after_filters_time=>7.0e-06, :action_time=>0.00023} + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ {:before_filters_time=>1.2e-05, :after_filters_time=>1.0e-05, :action_time=>0.001618} + ~ {:before_filters_time=>8.0e-06, :after_filters_time=>2.0e-05, :action_time=>0.000471} + ~ {:before_filters_time=>8.0e-06, :after_filters_time=>7.0e-06, :action_time=>0.000271} + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ {:before_filters_time=>9.0e-06, :after_filters_time=>7.0e-06, :action_time=>0.001246} + ~ {:before_filters_time=>6.0e-06, :after_filters_time=>6.0e-06, :action_time=>0.000458} + ~ {:before_filters_time=>7.0e-06, :after_filters_time=>6.0e-06, :action_time=>0.000255} + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ {:action_time=>0.001124, :before_filters_time=>8.0e-06, :after_filters_time=>6.0e-06} + ~ {:action_time=>0.000426, :before_filters_time=>7.0e-06, :after_filters_time=>7.0e-06} + ~ {:action_time=>0.000224, :before_filters_time=>7.0e-06, :after_filters_time=>6.0e-06} + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ {:action_time=>0.023019, :before_filters_time=>1.9e-05, :after_filters_time=>1.3e-05} + ~ {:action_time=>0.000733, :before_filters_time=>1.1e-05, :after_filters_time=>1.1e-05} + ~ {:action_time=>0.000404, :before_filters_time=>1.1e-05, :after_filters_time=>1.2e-05} + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ {:action_time=>0.001142, :before_filters_time=>9.0e-06, :after_filters_time=>7.0e-06} + ~ {:action_time=>0.000427, :before_filters_time=>6.0e-06, :after_filters_time=>6.0e-06} + ~ {:action_time=>0.000225, :before_filters_time=>7.0e-06, :after_filters_time=>6.0e-06} + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ {:action_time=>0.00115, :before_filters_time=>8.0e-06, :after_filters_time=>7.0e-06} + ~ {:action_time=>0.000427, :before_filters_time=>7.0e-06, :after_filters_time=>6.0e-06} + ~ {:action_time=>0.000231, :before_filters_time=>6.0e-06, :after_filters_time=>7.0e-06} + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ {:action_time=>0.001186, :before_filters_time=>9.0e-06, :after_filters_time=>6.0e-06} + ~ {:action_time=>0.000203, :before_filters_time=>7.0e-06, :after_filters_time=>5.0e-06} + ~ {:action_time=>0.000427, :before_filters_time=>7.0e-06, :after_filters_time=>6.0e-06} + ~ {:action_time=>0.000225, :before_filters_time=>7.0e-06, :after_filters_time=>6.0e-06} + ~ Compiling routes... + ~ Using 'share-nothing' cookie sessions (4kb limit per client) + ~ {:action_time=>0.0016, :before_filters_time=>1.0e-05, :after_filters_time=>6.0e-06} + ~ {:action_time=>0.000213, :before_filters_time=>6.0e-06, :after_filters_time=>6.0e-06} + ~ {:action_time=>0.00045, :before_filters_time=>7.0e-06, :after_filters_time=>5.0e-06} + ~ {:action_time=>0.000228, :before_filters_time=>7.0e-06, :after_filters_time=>6.0e-06} diff --git a/packages/chef-server/spec/authenticated_system_spec_helper.rb b/packages/chef-server/spec/authenticated_system_spec_helper.rb new file mode 100644 index 0000000000..a1a484da0f --- /dev/null +++ b/packages/chef-server/spec/authenticated_system_spec_helper.rb @@ -0,0 +1,16 @@ +Merb::Config.use do |c| + c[:session_store] = "memory" +end + + +class Hash + + def with( opts ) + self.merge(opts) + end + + def without(*args) + self.dup.delete_if{ |k,v| args.include?(k)} + end + +end
\ No newline at end of file diff --git a/packages/chef-server/spec/controllers/log/merb_test.log b/packages/chef-server/spec/controllers/log/merb_test.log new file mode 100644 index 0000000000..646c8bb701 --- /dev/null +++ b/packages/chef-server/spec/controllers/log/merb_test.log @@ -0,0 +1,3 @@ +Tue, 27 May 2008 00:52:34 GMT ~ info ~ Logfile created + ~ Not Using Sessions + ~ Not Using Sessions diff --git a/packages/chef-server/spec/controllers/nodes_spec.rb b/packages/chef-server/spec/controllers/nodes_spec.rb index b28714cc40..3cf48fdbe2 100644 --- a/packages/chef-server/spec/controllers/nodes_spec.rb +++ b/packages/chef-server/spec/controllers/nodes_spec.rb @@ -150,6 +150,7 @@ describe Nodes, "compile action" do end def do_compile + Chef::FileStore.stub!(:store).and_return(true) Chef::FileStore.stub!(:load).and_return(@stored_node) Chef::Compile.stub!(:new).and_return(@compile) dispatch_to(Nodes, :compile, { :id => "one" }) do |c| diff --git a/packages/chef-server/spec/controllers/openid_register_spec.rb b/packages/chef-server/spec/controllers/openid_register_spec.rb new file mode 100644 index 0000000000..2f3a58b287 --- /dev/null +++ b/packages/chef-server/spec/controllers/openid_register_spec.rb @@ -0,0 +1,88 @@ +require File.join(File.dirname(__FILE__), "..", 'spec_helper.rb') + +describe OpenidRegister, "index action" do + it "should get a list of all registered nodes" do + Chef::FileStore.should_receive(:list).with("openid_node").and_return(["one"]) + dispatch_to(OpenidRegister, :index) do |c| + c.stub!(:display) + end + end +end + +describe OpenidRegister, "show action" do + it "should raise a 404 if the nodes registration is not found" do + Chef::FileStore.should_receive(:load).with("openid_node", "foo").and_raise(RuntimeError) + lambda { + dispatch_to(OpenidRegister, :show, { :id => "foo" }) + }.should raise_error(Merb::ControllerExceptions::NotFound) + end + + it "should call display on the node registration" do + Chef::FileStore.stub!(:load).and_return(true) + dispatch_to(OpenidRegister, :show, { :id => "foo" }) do |c| + c.should_receive(:display).with(true) + end + end +end + +describe OpenidRegister, "create action" do + def do_create + dispatch_to(OpenidRegister, :create, { :id => "foo", :password => "beck" }) do |c| + c.stub!(:display) + end + end + + it "should require an id to register" do + lambda { + dispatch_to(OpenidRegister, :create, { :password => "beck" }) + }.should raise_error(Merb::ControllerExceptions::BadRequest) + end + + it "should require a password to register" do + lambda { + dispatch_to(OpenidRegister, :create, { :id => "foo" }) + }.should raise_error(Merb::ControllerExceptions::BadRequest) + end + + it "should return 400 if a node is already registered" do + Chef::FileStore.should_receive(:has_key?).with("openid_node", "foo").and_return(true) + lambda { + dispatch_to(OpenidRegister, :create, { :id => "foo", :password => "beck" }) + }.should raise_error(Merb::ControllerExceptions::BadRequest) + end + + it "should store the registered node in the file store" do + Chef::FileStore.stub!(:has_key?).and_return(false) + Chef::FileStore.should_receive(:store).and_return(true) + do_create + end +end + +describe OpenidRegister, "update action" do + it "should raise a 400 error" do + lambda { + dispatch_to(OpenidRegister, :update) + } + end +end + +describe OpenidRegister, "destroy action" do + def do_destroy + dispatch_to(OpenidRegister, :destroy, { :id => "foo" }) do |c| + c.stub!(:display) + end + end + + it "should return 400 if it cannot find the registration" do + Chef::FileStore.should_receive(:has_key?).with("openid_node", "foo").and_return(false) + lambda { + do_destroy + }.should raise_error(Merb::ControllerExceptions::BadRequest) + end + + it "should delete the registration from the store" do + Chef::FileStore.stub!(:has_key?).and_return(true) + Chef::FileStore.should_receive(:delete).with("openid_node", "foo").and_return(true) + do_destroy + end +end
\ No newline at end of file diff --git a/packages/chef-server/spec/controllers/sessions_spec.rb b/packages/chef-server/spec/controllers/sessions_spec.rb new file mode 100644 index 0000000000..afec8f7ab1 --- /dev/null +++ b/packages/chef-server/spec/controllers/sessions_spec.rb @@ -0,0 +1,97 @@ +require File.join(File.dirname(__FILE__), '..', 'spec_helper.rb') +require File.join( File.dirname(__FILE__), "..", "ident_spec_helper") +require File.join( File.dirname(__FILE__), "..", "authenticated_system_spec_helper") +require 'cgi' + +describe "Sessions Controller", "index action" do + include IdentSpecHelper + + before(:each) do + Ident.clear_database_table + @quentin = Ident.create(valid_ident_hash.with(:login => "quentin", :password => "test", :password_confirmation => "test")) + @controller = Sessions.new(fake_request) + end + + it "should have a route to Sessions#new from '/login'" do + request_to("/login") do |params| + params[:controller].should == "Sessions" + params[:action].should == "create" + end + end + + it "should route to Sessions#create from '/login' via post" do + request_to("/login", :post) do |params| + params[:controller].should == "Sessions" + params[:action].should == "create" + end + end + + it "should have a named route :login" do + @controller.url(:login).should == "/login" + end + + it "should have route to Sessions#destroy from '/logout' via delete" do + request_to("/logout", :delete) do |params| + params[:controller].should == "Sessions" + params[:action].should == "destroy" + end + end + + it "should route to Sessions#destroy from '/logout' via get" do + request_to("/logout") do |params| + params[:controller].should == "Sessions" + params[:action].should == "destroy" + end + end + + it 'logins and redirects' do + controller = post "/login", :login => 'quentin', :password => 'test' + controller.session[:ident].should_not be_nil + controller.session[:ident].should == @quentin.id + controller.should redirect_to("/") + end + + it 'fails login and does not redirect' do + controller = post "/login", :login => 'quentin', :password => 'bad password' + controller.session[:ident].should be_nil + controller.should be_successful + end + + it 'logs out' do + controller = get("/logout"){|controller| controller.stub!(:current_ident).and_return(@quentin) } + controller.session[:ident].should be_nil + controller.should redirect + end + + it 'remembers me' do + controller = post "/login", :login => 'quentin', :password => 'test', :remember_me => "1" + controller.cookies["auth_token"].should_not be_nil + end + + it 'does not remember me' do + controller = post "/login", :login => 'quentin', :password => 'test', :remember_me => "0" + controller.cookies["auth_token"].should be_nil + end + + it 'deletes token on logout' do + controller = get("/logout") {|request| request.stub!(:current_ident).and_return(@quentin) } + controller.cookies["auth_token"].should == nil + end + + + it 'logs in with cookie' do + @quentin.remember_me + controller = get "/login" do |c| + c.request.env[Merb::Const::HTTP_COOKIE] = "auth_token=#{@quentin.remember_token}" + end + controller.should be_logged_in + end + + def auth_token(token) + CGI::Cookie.new('name' => 'auth_token', 'value' => token) + end + + def cookie_for(ident) + auth_token ident.remember_token + end +end
\ No newline at end of file diff --git a/packages/chef-server/spec/ident_spec_helper.rb b/packages/chef-server/spec/ident_spec_helper.rb new file mode 100644 index 0000000000..17fad80004 --- /dev/null +++ b/packages/chef-server/spec/ident_spec_helper.rb @@ -0,0 +1,8 @@ +module IdentSpecHelper + def valid_ident_hash + { :login => "daniel", + :email => "daniel@example.com", + :password => "sekret", + :password_confirmation => "sekret"} + end +end
\ No newline at end of file diff --git a/packages/chef-server/spec/log/merb_test.log b/packages/chef-server/spec/log/merb_test.log new file mode 100644 index 0000000000..dbd7cd0dce --- /dev/null +++ b/packages/chef-server/spec/log/merb_test.log @@ -0,0 +1,2 @@ +Tue, 27 May 2008 00:52:46 GMT ~ info ~ Logfile created + ~ Not Using Sessions diff --git a/packages/chef-server/spec/models/ident_spec.rb b/packages/chef-server/spec/models/ident_spec.rb new file mode 100644 index 0000000000..5dd15288bf --- /dev/null +++ b/packages/chef-server/spec/models/ident_spec.rb @@ -0,0 +1,258 @@ +require File.join( File.dirname(__FILE__), "..", "spec_helper" ) +require File.join( File.dirname(__FILE__), "..", "ident_spec_helper") +require File.join( File.dirname(__FILE__), "..", "authenticated_system_spec_helper") + +describe Ident do + include IdentSpecHelper + + before(:each) do + Ident.clear_database_table + end + + it "should have a login field" do + ident = Ident.new + ident.should respond_to(:login) + ident.valid? + ident.errors.on(:login).should_not be_nil + end + + it "should fail login if there are less than 3 chars" do + ident = Ident.new + ident.login = "AB" + ident.valid? + ident.errors.on(:login).should_not be_nil + end + + it "should not fail login with between 3 and 40 chars" do + ident = Ident.new + [3,40].each do |num| + ident.login = "a" * num + ident.valid? + ident.errors.on(:login).should be_nil + end + end + + it "should fail login with over 90 chars" do + ident = Ident.new + ident.login = "A" * 41 + ident.valid? + ident.errors.on(:login).should_not be_nil + end + + it "should make a valid ident" do + ident = Ident.new(valid_ident_hash) + ident.save + ident.errors.should be_empty + + end + + it "should make sure login is unique" do + ident = Ident.new( valid_ident_hash.with(:login => "Daniel") ) + ident2 = Ident.new( valid_ident_hash.with(:login => "Daniel")) + ident.save.should be_true + ident.login = "Daniel" + ident2.save.should be_false + ident2.errors.on(:login).should_not be_nil + end + + it "should make sure login is unique regardless of case" do + Ident.find_with_conditions(:login => "Daniel").should be_nil + ident = Ident.new( valid_ident_hash.with(:login => "Daniel") ) + ident2 = Ident.new( valid_ident_hash.with(:login => "daniel")) + ident.save.should be_true + ident.login = "Daniel" + ident2.save.should be_false + ident2.errors.on(:login).should_not be_nil + end + + it "should downcase logins" do + ident = Ident.new( valid_ident_hash.with(:login => "DaNieL")) + ident.login.should == "daniel" + end + + it "should authenticate a ident using a class method" do + ident = Ident.new(valid_ident_hash) + ident.save + Ident.authenticate(valid_ident_hash[:login], valid_ident_hash[:password]).should_not be_nil + end + + it "should not authenticate a ident using the wrong password" do + ident = Ident.new(valid_ident_hash) + ident.save + Ident.authenticate(valid_ident_hash[:login], "not_the_password").should be_nil + end + + it "should not authenticate a ident using the wrong login" do + ident = Ident.create(valid_ident_hash) + Ident.authenticate("not_the_login", valid_ident_hash[:password]).should be_nil + end + + it "should not authenticate a ident that does not exist" do + Ident.authenticate("i_dont_exist", "password").should be_nil + end + + +end + +describe Ident, "the password fields for Ident" do + include IdentSpecHelper + + before(:each) do + Ident.clear_database_table + @ident = Ident.new( valid_ident_hash ) + end + + it "should respond to password" do + @ident.should respond_to(:password) + end + + it "should respond to password_confirmation" do + @ident.should respond_to(:password_confirmation) + end + + it "should have a protected password_required method" do + @ident.protected_methods.should include("password_required?") + end + + it "should respond to crypted_password" do + @ident.should respond_to(:crypted_password) + end + + it "should require password if password is required" do + ident = Ident.new( valid_ident_hash.without(:password)) + ident.stub!(:password_required?).and_return(true) + ident.valid? + ident.errors.on(:password).should_not be_nil + ident.errors.on(:password).should_not be_empty + end + + it "should set the salt" do + ident = Ident.new(valid_ident_hash) + ident.salt.should be_nil + ident.send(:encrypt_password) + ident.salt.should_not be_nil + end + + it "should require the password on create" do + ident = Ident.new(valid_ident_hash.without(:password)) + ident.save + ident.errors.on(:password).should_not be_nil + ident.errors.on(:password).should_not be_empty + end + + it "should require password_confirmation if the password_required?" do + ident = Ident.new(valid_ident_hash.without(:password_confirmation)) + ident.save + (ident.errors.on(:password) || ident.errors.on(:password_confirmation)).should_not be_nil + end + + it "should fail when password is outside 4 and 40 chars" do + [3,41].each do |num| + ident = Ident.new(valid_ident_hash.with(:password => ("a" * num))) + ident.valid? + ident.errors.on(:password).should_not be_nil + end + end + + it "should pass when password is within 4 and 40 chars" do + [4,30,40].each do |num| + ident = Ident.new(valid_ident_hash.with(:password => ("a" * num), :password_confirmation => ("a" * num))) + ident.valid? + ident.errors.on(:password).should be_nil + end + end + + it "should autenticate against a password" do + ident = Ident.new(valid_ident_hash) + ident.save + ident.should be_authenticated(valid_ident_hash[:password]) + end + + it "should not require a password when saving an existing ident" do + ident = Ident.create(valid_ident_hash) + ident = Ident.find_with_conditions(:login => valid_ident_hash[:login]) + ident.password.should be_nil + ident.password_confirmation.should be_nil + ident.login = "some_different_login_to_allow_saving" + (ident.save).should be_true + end + +end + + +describe Ident, "remember_me" do + include IdentSpecHelper + + predicate_matchers[:remember_token] = :remember_token? + + before do + Ident.clear_database_table + @ident = Ident.new(valid_ident_hash) + end + + it "should have a remember_token_expires_at attribute" do + @ident.attributes.keys.any?{|a| a.to_s == "remember_token_expires_at"}.should_not be_nil + end + + it "should respond to remember_token?" do + @ident.should respond_to(:remember_token?) + end + + it "should return true if remember_token_expires_at is set and is in the future" do + @ident.remember_token_expires_at = DateTime.now + 3600 + @ident.should remember_token + end + + it "should set remember_token_expires_at to a specific date" do + time = Time.mktime(2009,12,25) + @ident.remember_me_until(time) + @ident.remember_token_expires_at.should == time + end + + it "should set the remember_me token when remembering" do + time = Time.mktime(2009,12,25) + @ident.remember_me_until(time) + @ident.remember_token.should_not be_nil + @ident.save + Ident.find_with_conditions(:login => valid_ident_hash[:login]).remember_token.should_not be_nil + end + + it "should remember me for" do + t = Time.now + Time.stub!(:now).and_return(t) + today = Time.now + remember_until = today + (2* Merb::Const::WEEK) + @ident.remember_me_for( Merb::Const::WEEK * 2) + @ident.remember_token_expires_at.should == (remember_until) + end + + it "should remember_me for two weeks" do + t = Time.now + Time.stub!(:now).and_return(t) + @ident.remember_me + @ident.remember_token_expires_at.should == (Time.now + (2 * Merb::Const::WEEK )) + end + + it "should forget me" do + @ident.remember_me + @ident.save + @ident.forget_me + @ident.remember_token.should be_nil + @ident.remember_token_expires_at.should be_nil + end + + it "should persist the forget me to the database" do + @ident.remember_me + @ident.save + + @ident = Ident.find_with_conditions(:login => valid_ident_hash[:login]) + @ident.remember_token.should_not be_nil + + @ident.forget_me + + @ident = Ident.find_with_conditions(:login => valid_ident_hash[:login]) + @ident.remember_token.should be_nil + @ident.remember_token_expires_at.should be_nil + end + +end
\ No newline at end of file diff --git a/packages/chef-server/spec/views/nodes/edit.html.erb_spec.rb b/packages/chef-server/spec/views/nodes/edit.html.erb_spec.rb index 33a0c3631f..a931e8e519 100644 --- a/packages/chef-server/spec/views/nodes/edit.html.erb_spec.rb +++ b/packages/chef-server/spec/views/nodes/edit.html.erb_spec.rb @@ -1 +1 @@ -require File.join(File.dirname(__FILE__), "../..", 'spec_helper.rb')
\ No newline at end of file +require File.join(File.dirname(__FILE__), "../..", 'spec_helper.rb') diff --git a/spec/unit/file_store_spec.rb b/spec/unit/file_store_spec.rb index f2f1070f2d..e7371653f1 100644 --- a/spec/unit/file_store_spec.rb +++ b/spec/unit/file_store_spec.rb @@ -91,5 +91,16 @@ describe Chef::FileStore do File.should_receive(:file?).with("pool").and_return(true) Chef::FileStore.list("node").should eql(["pool"]) end + + it "should let you test whether a key exists for an object type with has_key?" do + Dir.should_receive(:[]).with("/tmp/chef-test/node/**/*").and_return(["pool"]) + File.should_receive(:file?).with("pool").and_return(true) + Chef::FileStore.has_key?("node", "pool").should eql(true) + end + it "should let you test whether a key doesnt exist for an object type with has_key?" do + Dir.should_receive(:[]).with("/tmp/chef-test/node/**/*").and_return(["pool"]) + File.should_receive(:file?).with("pool").and_return(true) + Chef::FileStore.has_key?("node", "snake").should eql(false) + end end
\ No newline at end of file diff --git a/spec/unit/rest_spec.rb b/spec/unit/rest_spec.rb new file mode 100644 index 0000000000..df77d163e9 --- /dev/null +++ b/spec/unit/rest_spec.rb @@ -0,0 +1,52 @@ +# +# Author:: Adam Jacob (<adam@hjksolutions.com>) +# Copyright:: Copyright (c) 2008 HJK Solutions, LLC +# License:: GNU General Public License version 2 or later +# +# This program and entire repository is free software; you can +# redistribute it and/or modify it under the terms of the GNU +# General Public License as published by the Free Software +# Foundation; either version 2 of the License, or any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# + +require File.expand_path(File.join(File.dirname(__FILE__), "..", "spec_helper")) + +describe Chef::REST do + + it "should make a connection to an http server" do + + end + + it "should make a connection to an https server" do + end + + it "should authenticate if given a redirect" do + + end + + it "should GET a URL" do + + end + + it "should PUT to an URL " do + + end + + it "should POST to an URL" do + + end + + it "should DELETE an URL" do + + end + +end
\ No newline at end of file |