pages-server/server/try.go

50 lines
1.6 KiB
Go
Raw Normal View History

2021-12-05 17:17:28 +00:00
package server
import (
"bytes"
"strings"
"github.com/valyala/fasthttp"
"codeberg.org/codeberg/pages/html"
"codeberg.org/codeberg/pages/server/cache"
"codeberg.org/codeberg/pages/server/gitea"
2021-12-05 17:17:28 +00:00
"codeberg.org/codeberg/pages/server/upstream"
)
// tryUpstream forwards the target request to the Gitea API, and shows an error page on failure.
func tryUpstream(ctx *fasthttp.RequestCtx, giteaClient *gitea.Client,
2021-12-05 17:17:28 +00:00
mainDomainSuffix, trimmedHost []byte,
targetOptions *upstream.Options,
targetOwner, targetRepo, targetBranch, targetPath string,
2021-12-05 17:17:28 +00:00
canonicalDomainCache, branchTimestampCache, fileResponseCache cache.SetGetKey,
) {
2021-12-05 17:17:28 +00:00
// check if a canonical domain exists on a request on MainDomain
if bytes.HasSuffix(trimmedHost, mainDomainSuffix) {
canonicalDomain, _ := upstream.CheckCanonicalDomain(giteaClient, targetOwner, targetRepo, targetBranch, "", string(mainDomainSuffix), canonicalDomainCache)
2021-12-05 17:17:28 +00:00
if !strings.HasSuffix(strings.SplitN(canonicalDomain, "/", 2)[0], string(mainDomainSuffix)) {
canonicalPath := string(ctx.RequestURI())
if targetRepo != "pages" {
2021-12-09 18:32:30 +00:00
path := strings.SplitN(canonicalPath, "/", 3)
if len(path) >= 3 {
2021-12-09 19:16:43 +00:00
canonicalPath = "/" + path[2]
2021-12-09 18:32:30 +00:00
}
2021-12-05 17:17:28 +00:00
}
ctx.Redirect("https://"+canonicalDomain+canonicalPath, fasthttp.StatusTemporaryRedirect)
return
}
}
targetOptions.TargetOwner = targetOwner
targetOptions.TargetRepo = targetRepo
targetOptions.TargetBranch = targetBranch
targetOptions.TargetPath = targetPath
2021-12-05 17:17:28 +00:00
// Try to request the file from the Gitea API
if !targetOptions.Upstream(ctx, giteaClient, branchTimestampCache, fileResponseCache) {
2021-12-05 17:17:28 +00:00
html.ReturnErrorPage(ctx, ctx.Response.StatusCode())
}
}