]> git.openstreetmap.org Git - rails.git/commitdiff
Handle timeouts inside a view for API calls
authorTom Hughes <tom@compton.nu>
Wed, 6 Sep 2023 23:32:11 +0000 (00:32 +0100)
committerTom Hughes <tom@compton.nu>
Wed, 6 Sep 2023 23:32:11 +0000 (00:32 +0100)
app/controllers/api_controller.rb

index a2d016c8c7fcd10c43b9f473819b30af9a8212e1..89388c0bbf044db798f9c2f2258a61ca1cd25258 100644 (file)
@@ -178,6 +178,16 @@ class ApiController < ApplicationController
   # wrap an api call in a timeout
   def api_call_timeout(&block)
     Timeout.timeout(Settings.api_timeout, Timeout::Error, &block)
+  rescue ActionView::Template::Error => e
+    e = e.cause
+
+    if e.is_a?(Timeout::Error) ||
+       (e.is_a?(ActiveRecord::StatementInvalid) && e.message.include?("execution expired"))
+      ActiveRecord::Base.connection.raw_connection.cancel
+      raise OSM::APITimeoutError
+    else
+      raise
+    end
   rescue Timeout::Error
     ActiveRecord::Base.connection.raw_connection.cancel
     raise OSM::APITimeoutError