Add a timeout to the change list pages
authorTom Hughes <tom@compton.nu>
Fri, 21 May 2010 19:21:41 +0000 (20:21 +0100)
committerTom Hughes <tom@compton.nu>
Fri, 21 May 2010 19:21:41 +0000 (20:21 +0100)
app/controllers/application_controller.rb
app/controllers/browse_controller.rb
app/controllers/changeset_controller.rb
app/views/changeset/timeout.atom.builder [new file with mode: 0644]
app/views/changeset/timeout.html.erb [new file with mode: 0644]
config/application.yml
config/locales/en.yml

index a53fb5374b06d02415ff8c0285590388e344398a..c7c6c4add92af7ea747edd9a033c689d3c56d129 100644 (file)
@@ -216,6 +216,8 @@ class ApplicationController < ActionController::Base
     raise OSM::APIBadMethodError.new(method) unless ok
   end
 
+  ##
+  # wrap an api call in a timeout
   def api_call_timeout
     SystemTimer.timeout_after(APP_CONFIG['api_timeout']) do
       yield
@@ -224,6 +226,22 @@ class ApplicationController < ActionController::Base
     raise OSM::APITimeoutError
   end
 
+  ##
+  # wrap a web page in a timeout
+  def web_timeout
+    SystemTimer.timeout_after(APP_CONFIG['web_timeout']) do
+      yield
+    end
+  rescue ActionView::TemplateError => ex
+    if ex.original_exception.is_a?(Timeout::Error)
+      render :action => "timeout"
+    else
+      raise
+    end
+  rescue Timeout::Error
+    render :action => "timeout"
+  end
+
   ##
   # extend caches_action to include the parameters, locale and logged in
   # status in all cache keys
index a511d67d35fb54cc558ff124a894abf03469540f..9aec1060a19b3c836e455c0abcc0dd36c79ec8cc 100644 (file)
@@ -4,7 +4,7 @@ class BrowseController < ApplicationController
   before_filter :authorize_web  
   before_filter :set_locale 
   before_filter { |c| c.check_database_readable(true) }
-  around_filter :timeout, :except => [:start]
+  around_filter :web_timeout, :except => [:start]
 
   def start 
   end
@@ -77,20 +77,4 @@ class BrowseController < ApplicationController
   rescue ActiveRecord::RecordNotFound
     render :action => "not_found", :status => :not_found
   end
-
-private
-
-  def timeout
-    SystemTimer.timeout_after(30) do
-      yield
-    end
-  rescue ActionView::TemplateError => ex
-    if ex.original_exception.is_a?(Timeout::Error)
-      render :action => "timeout"
-    else
-      raise
-    end
-  rescue Timeout::Error
-    render :action => "timeout"
-  end
 end
index e17d652ad262c58ac7eab65257c44d69412664e7..1b77d48ee00771cd4c09e7d4e3e33aac4ddb7498 100644 (file)
@@ -12,7 +12,8 @@ class ChangesetController < ApplicationController
   before_filter :check_api_writable, :only => [:create, :update, :delete, :upload, :include]
   before_filter :check_api_readable, :except => [:create, :update, :delete, :upload, :download, :query]
   after_filter :compress_output
-  around_filter :api_call_handle_error
+  around_filter :api_call_handle_error, :except => [:list, :list_user, :list_bbox]
+  around_filter :web_timeout, :only => [:list, :list_user, :list_bbox]
 
   filter_parameter_logging "<osmChange version"
 
diff --git a/app/views/changeset/timeout.atom.builder b/app/views/changeset/timeout.atom.builder
new file mode 100644 (file)
index 0000000..a4faeb3
--- /dev/null
@@ -0,0 +1,12 @@
+atom_feed(:language => I18n.locale, :schema_date => 2009,
+          :id => url_for(params.merge({ :only_path => false })),
+          :root_url => url_for(params.merge({ :only_path => false, :format => nil })),
+          "xmlns:georss" => "http://www.georss.org/georss") do |feed|
+  feed.title @title
+
+  feed.subtitle :type => 'xhtml' do |xhtml|
+    xhtml.p do |p|
+      p << t('changeset.timeout.sorry')
+    end
+  end
+end
diff --git a/app/views/changeset/timeout.html.erb b/app/views/changeset/timeout.html.erb
new file mode 100644 (file)
index 0000000..a522557
--- /dev/null
@@ -0,0 +1 @@
+<p><%= t'changeset.timeout.sorry' %></p>
index d405709657166f85a59903e359d1da4269dbc199..1b38f8f746e8108a879c9ccde97a95f89defe6a2 100644 (file)
@@ -13,6 +13,8 @@ standard_settings: &standard_settings
   geonames_zoom: 12
   # Timeout for API calls in seconds
   api_timeout: 300
+  # Timeout for web pages in seconds
+  web_timeout: 30
   # Periods (in hours) which are allowed for user blocks
   user_block_periods: [0, 1, 3, 6, 12, 24, 48, 96]
   # Rate limit for message sending
index a92a7fe19792b9d4a5a5a0c8b2cfdf8aa5a06c58..e4b0ee21489ad5ea23b910a1e7ccf2ead7cdb22c 100644 (file)
@@ -297,6 +297,8 @@ en:
       description_user: "Changesets by {{user}}"
       description_bbox: "Changesets within {{bbox}}"
       description_user_bbox: "Changesets by {{user}} within {{bbox}}"
+    timeout:
+      sorry: "Sorry, the list of changesets you requested took too long to retrieve."
   diary_entry:
     new:
       title: New Diary Entry