Feat: backend supports with cookies
All checks were successful
Invidious CI / build (push) Successful in 13m45s

This commit is contained in:
Fijxu 2024-09-15 14:42:06 -03:00
parent 8f46bd5751
commit 00bcf53d0f
Signed by: Fijxu
GPG key ID: 32C1DDF333EDA6A4
5 changed files with 44 additions and 0 deletions

View file

@ -167,6 +167,9 @@ class Config
# The max resolution the Instance can offer
property max_dash_resolution : Int32?
# List of names of the backends
property backends : Array(String) = [] of String
# Materialious redirects
property materialious_domain : String?

View file

@ -0,0 +1,18 @@
{% skip_file if flag?(:api_only) %}
module Invidious::Routes::BackendSwitcher
def self.switch(env)
referer = get_referer(env)
backend_id = env.params.query["backend_id"]
# Checks if there is any alternative domain, like a second domain name,
# TOR or I2P address
if alt = CONFIG.alternative_domains.index(env.request.headers["Host"])
env.response.cookies["SERVER_ID"] = Invidious::User::Cookies.server_id(CONFIG.alternative_domains[alt], backend_id)
else
env.response.cookies["SERVER_ID"] = Invidious::User::Cookies.server_id(CONFIG.domain, backend_id)
end
env.redirect referer
end
end

View file

@ -21,6 +21,7 @@ module Invidious::Routing
get "/privacy", Routes::Misc, :privacy
get "/licenses", Routes::Misc, :licenses
get "/redirect", Routes::Misc, :cross_instance_redirect
get "/switchbackend", Routes::BackendSwitcher, :switch
self.register_channel_routes
self.register_watch_routes

View file

@ -45,5 +45,18 @@ struct Invidious::User
samesite: HTTP::Cookie::SameSite::Lax
)
end
# Server ID (SERVER_ID) cookie used for Sticky Sessions
# Parameter "domain" comes from the global config
def server_id(domain : String?, server_id) : HTTP::Cookie
return HTTP::Cookie.new(
name: "SERVER_ID",
domain: domain,
value: server_id,
secure: false,
http_only: true,
samesite: HTTP::Cookie::SameSite::Lax
)
end
end
end

View file

@ -104,6 +104,15 @@
</div>
</div>
<% if CONFIG.backends %>
<div class="h-box">
Change backend:
<% CONFIG.backends.each do | backend | %>
<a href="/switchbackend?backend_id=<%= backend %>">Backend<%= backend %></a>
<% end %>
</div>
<% end %>
<% if CONFIG.banner %>
<div class="h-box">
<h3><%= CONFIG.banner %></h3>