summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/invidious.cr30
-rw-r--r--src/invidious/helpers/handlers.cr1
2 files changed, 31 insertions, 0 deletions
diff --git a/src/invidious.cr b/src/invidious.cr
index 0cabd507..2fe2fb42 100644
--- a/src/invidious.cr
+++ b/src/invidious.cr
@@ -1792,6 +1792,36 @@ post "/data_control" do |env|
if user
user = user.as(User)
+ spawn do
+ # Since import can take a while, if we're not done after 20 seconds
+ # push out content to prevent timeout.
+
+ # Interesting to note is that Chrome will try to render before the content has finished loading,
+ # which is why we include a loading icon. Firefox and its derivatives will not see this page,
+ # instead redirecting immediately once the connection has closed.
+
+ # https://stackoverflow.com/q/2091239 is helpful but not directly applicable here.
+
+ sleep 20.seconds
+ env.response.puts %(<meta http-equiv="refresh" content="0; url=#{referer}">)
+ env.response.puts %(<link rel="stylesheet" href="/css/ionicons.min.css">)
+ env.response.puts %(<link rel="stylesheet" href="/css/default.css">)
+ if env.get("preferences").as(Preferences).dark_mode
+ env.response.puts %(<link rel="stylesheet" href="/css/darktheme.css">)
+ else
+ env.response.puts %(<link rel="stylesheet" href="/css/lighttheme.css">)
+ end
+ env.response.puts %(<h3><div class="loading"><i class="icon ion-ios-refresh"></i></div></h3>)
+ env.response.flush
+
+ loop do
+ env.response.puts %(<!-- keepalive #{Time.now.to_unix} -->)
+ env.response.flush
+
+ sleep (20 + rand(11)).seconds
+ end
+ end
+
HTTP::FormData.parse(env.request) do |part|
body = part.body.gets_to_end
if body.empty?
diff --git a/src/invidious/helpers/handlers.cr b/src/invidious/helpers/handlers.cr
index e1c43cfe..560ed670 100644
--- a/src/invidious/helpers/handlers.cr
+++ b/src/invidious/helpers/handlers.cr
@@ -58,6 +58,7 @@ end
class FilteredCompressHandler < Kemal::Handler
exclude ["/videoplayback", "/videoplayback/*", "/vi/*", "/ggpht/*", "/api/v1/auth/notifications"]
+ exclude ["/data_control"], "POST"
def call(env)
return call_next env if exclude_match? env