diff options
| author | Omar Roth <omarroth@hotmail.com> | 2019-04-24 20:18:35 -0500 |
|---|---|---|
| committer | Omar Roth <omarroth@hotmail.com> | 2019-04-24 20:18:35 -0500 |
| commit | f15b7cebac9d9383340a33f4f091badc5d07d2ca (patch) | |
| tree | 1c340b979be33d93ddf17562c6a7dbe08416f112 | |
| parent | f6d8df1e836fee1f1c83c1bc5eef36d4a6c963cb (diff) | |
| download | invidious-f15b7cebac9d9383340a33f4f091badc5d07d2ca.tar.gz invidious-f15b7cebac9d9383340a33f4f091badc5d07d2ca.tar.bz2 invidious-f15b7cebac9d9383340a33f4f091badc5d07d2ca.zip | |
Try to prevent timeout in /data_control
| -rw-r--r-- | src/invidious.cr | 30 | ||||
| -rw-r--r-- | src/invidious/helpers/handlers.cr | 1 |
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 |
