fix(before_all): avoid double-write on halted responses to prevent HTTP/2 corruption

Store response body in env instead of writing directly; let halt() do the single
write+close in the before_all block, eliminating Closed stream errors and
ERR_HTTP2_PROTOCOL_ERROR on subsequent requests (e.g. /login).
This commit is contained in:
Richard Lora 2026-05-23 22:21:18 +00:00
parent 623f715a8c
commit 5ad8fcfc4d
2 changed files with 6 additions and 8 deletions

View File

@ -202,9 +202,9 @@ before_all do |env|
Invidious::Routes::BeforeAll.handle(env) Invidious::Routes::BeforeAll.handle(env)
# If before_all flagged a halt (e.g. disabled page), stop the route handler. # If before_all flagged a halt (e.g. disabled page), stop the route handler.
# Use halt with the already-set status code to prevent the route handler from running. if halted_status = env.get?("halted_status")
if env.get?("halted") body = env.get?("halted_body").try(&.as(String)) || ""
halt env, status_code: env.response.status_code halt env, status_code: halted_status.as(Int32), response: body
end end
end end

View File

@ -164,12 +164,9 @@ module Invidious::Routes::BeforeAll
end end
if page_key && !CONFIG.page_enabled?(page_key) if page_key && !CONFIG.page_enabled?(page_key)
env.response.status_code = 403
env.set "halted", true
if path.starts_with?("/api/") if path.starts_with?("/api/")
env.response.content_type = "application/json" env.response.content_type = "application/json"
env.response.print({error: "Administrator has disabled this endpoint."}.to_json) env.set "halted_body", {error: "Administrator has disabled this endpoint."}.to_json
else else
preferences = env.get("preferences").as(Preferences) preferences = env.get("preferences").as(Preferences)
locale = preferences.locale locale = preferences.locale
@ -178,7 +175,7 @@ module Invidious::Routes::BeforeAll
error_message = I18n.translate(locale, "#{page_key}_page_disabled") error_message = I18n.translate(locale, "#{page_key}_page_disabled")
env.response.content_type = "text/html" env.response.content_type = "text/html"
env.response.print <<-HTML env.set "halted_body", <<-HTML
<!DOCTYPE html> <!DOCTYPE html>
<html lang="#{locale}"> <html lang="#{locale}">
<head> <head>
@ -209,6 +206,7 @@ module Invidious::Routes::BeforeAll
HTML HTML
end end
env.set "halted_status", 403
return return
end end
end end