mirror of
https://codeberg.org/forgejo/forgejo.git
synced 2026-07-25 02:48:05 +00:00
First, why was this header here in the first place? Cloudflare! Cloudflare had a optimization setting called "auto-minfy" and would minify HTML,JS,CSS - this included removing extra whitespaces from `<code>` elements. That's a problem because files are shown per-line with a `<code>` element and thus results in indentation being completely gone. Gitea added a FAQ entry for this [1], but on the same day decided to add the workaround in Gitea, the `no-transform` header [2]. I can't find a reference of this option and some posts suggests it's been removed. Thus it no longer serves a need to be present in Forgejo. That wasn't my intentional motivation to remove this. This header is also causing that HAProxy will not compress responses [3] from Forgejo which is not ideal for Codeberg, this behavior cannot be turned off or be worked around. Potential risk, some other CDN or some other Cloudflare option might still do this removal of whitespace in `<code>` HTML tags, it seems better to disable the feature than to have Forgejo add a header which is also causing other side-effects. I'm not aware of this another CDN of Cloudflare option so I don't want to mark it as breaking. [1]: https://github.com/go-gitea/gitea/pull/20430 [2]: https://github.com/go-gitea/gitea/pull/20432 [3]: https://docs.haproxy.org/3.3/configuration.html#:~:text=the%20response%20contains%20the%20%22no-transform%22%20value%20in%20the%20%22Cache-control%22%20%20%20%20%20header Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/12905 Reviewed-by: Otto <otto@codeberg.org> Reviewed-by: Mathieu Fenniak <mfenniak@noreply.codeberg.org> Reviewed-by: 0ko <0ko@noreply.codeberg.org>
55 lines
1.9 KiB
Go
55 lines
1.9 KiB
Go
// Copyright 2023 The Gitea Authors. All rights reserved.
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
package common
|
|
|
|
import (
|
|
"fmt"
|
|
"net/http"
|
|
|
|
user_model "forgejo.org/models/user"
|
|
"forgejo.org/modules/base"
|
|
"forgejo.org/modules/httpcache"
|
|
"forgejo.org/modules/log"
|
|
"forgejo.org/modules/setting"
|
|
"forgejo.org/modules/templates"
|
|
"forgejo.org/modules/web/middleware"
|
|
"forgejo.org/modules/web/routing"
|
|
)
|
|
|
|
const tplStatus500 base.TplName = "status/500"
|
|
|
|
// RenderPanicErrorPage renders a 500 page, and it never panics
|
|
func RenderPanicErrorPage(w http.ResponseWriter, req *http.Request, err any) {
|
|
combinedErr := fmt.Sprintf("%v\n%s", err, log.Stack(2))
|
|
log.Error("PANIC: %s", combinedErr)
|
|
|
|
defer func() {
|
|
if err := recover(); err != nil {
|
|
log.Error("Panic occurs again when rendering error page: %v. Stack:\n%s", err, log.Stack(2))
|
|
}
|
|
}()
|
|
|
|
routing.UpdatePanicError(req.Context(), err)
|
|
|
|
httpcache.SetCacheControlInHeader(w.Header(), 0)
|
|
w.Header().Set(`X-Frame-Options`, setting.CORSConfig.XFrameOptions)
|
|
|
|
tmplCtx := templates.NewContext(req.Context())
|
|
tmplCtx.Locale = middleware.Locale(w, req)
|
|
ctxData := middleware.GetContextData(req.Context())
|
|
|
|
// This recovery handler could be called without Gitea's web context, so we shouldn't touch that context too much.
|
|
// Otherwise, the 500-page may cause new panics, eg: cache.GetContextWithData, it makes the developer&users couldn't find the original panic.
|
|
user, _ := ctxData[middleware.ContextDataKeySignedUser].(*user_model.User)
|
|
if !setting.IsProd || (user != nil && user.IsAdmin) {
|
|
ctxData["ErrorMsg"] = "PANIC: " + combinedErr
|
|
}
|
|
|
|
err = templates.HTMLRenderer().HTML(w, http.StatusInternalServerError, string(tplStatus500), ctxData, tmplCtx)
|
|
if err != nil {
|
|
log.Error("Error occurs again when rendering error page: %v", err)
|
|
w.WriteHeader(http.StatusInternalServerError)
|
|
_, _ = w.Write([]byte("Internal server error, please collect error logs and report to Gitea issue tracker"))
|
|
}
|
|
}
|