pages-server/server/try.go

77 lines
2.7 KiB
Go
Raw Normal View History

2021-12-05 17:17:28 +00:00
package server
import (
2022-07-27 15:25:08 +00:00
"net/http"
2021-12-05 17:17:28 +00:00
"strings"
2022-11-12 13:10:04 +00:00
"github.com/rs/zerolog"
2021-12-05 17:17:28 +00:00
"codeberg.org/codeberg/pages/html"
"codeberg.org/codeberg/pages/server/cache"
2022-07-27 15:25:08 +00:00
"codeberg.org/codeberg/pages/server/context"
"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.
2022-07-27 15:25:08 +00:00
func tryUpstream(ctx *context.Context, giteaClient *gitea.Client,
2022-08-28 14:21:37 +00:00
mainDomainSuffix, trimmedHost string,
options *upstream.Options,
2022-07-27 13:39:46 +00:00
canonicalDomainCache cache.SetGetKey,
) {
2021-12-05 17:17:28 +00:00
// check if a canonical domain exists on a request on MainDomain
2022-08-28 14:21:37 +00:00
if strings.HasSuffix(trimmedHost, mainDomainSuffix) {
canonicalDomain, _ := upstream.CheckCanonicalDomain(giteaClient, options.TargetOwner, options.TargetRepo, options.TargetBranch, "", string(mainDomainSuffix), canonicalDomainCache)
2021-12-05 17:17:28 +00:00
if !strings.HasSuffix(strings.SplitN(canonicalDomain, "/", 2)[0], string(mainDomainSuffix)) {
2022-07-27 15:25:08 +00:00
canonicalPath := ctx.Req.RequestURI
if options.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
}
2022-07-27 15:25:08 +00:00
ctx.Redirect("https://"+canonicalDomain+canonicalPath, http.StatusTemporaryRedirect)
2021-12-05 17:17:28 +00:00
return
}
}
// add host for debugging
options.Host = string(trimmedHost)
2021-12-05 17:17:28 +00:00
// Try to request the file from the Gitea API
if !options.Upstream(ctx, giteaClient) {
html.ReturnErrorPage(ctx, "", ctx.StatusCode)
2021-12-05 17:17:28 +00:00
}
}
2022-11-11 18:03:17 +00:00
2022-11-12 01:54:56 +00:00
// tryBranch checks if a branch exists and populates the target variables. If canonicalLink is non-empty,
// it will also disallow search indexing and add a Link header to the canonical URL.
func tryBranch(log zerolog.Logger, ctx *context.Context, giteaClient *gitea.Client,
targetOptions *upstream.Options, canonicalLink bool,
) (*upstream.Options, bool) {
if targetOptions.TargetOwner == "" || targetOptions.TargetRepo == "" {
log.Debug().Msg("tryBranch: owner or repo is empty")
2022-11-12 01:54:56 +00:00
return nil, false
2022-11-11 18:03:17 +00:00
}
// Replace "~" to "/" so we can access branch that contains slash character
// Branch name cannot contain "~" so doing this is okay
targetOptions.TargetBranch = strings.ReplaceAll(targetOptions.TargetBranch, "~", "/")
2022-11-11 18:03:17 +00:00
// Check if the branch exists, otherwise treat it as a file path
branchExist, _ := targetOptions.GetBranchTimestamp(giteaClient)
if !branchExist {
2022-11-11 18:03:17 +00:00
log.Debug().Msg("tryBranch: branch doesn't exist")
2022-11-12 01:54:56 +00:00
return nil, false
2022-11-11 18:03:17 +00:00
}
2022-11-12 01:54:56 +00:00
if canonicalLink {
2022-11-11 18:03:17 +00:00
// Hide from search machines & add canonical link
ctx.RespWriter.Header().Set("X-Robots-Tag", "noarchive, noindex")
ctx.RespWriter.Header().Set("Link", targetOptions.ContentWebLink(giteaClient)+"; rel=\"canonical\"")
2022-11-11 18:03:17 +00:00
}
log.Debug().Msg("tryBranch: true")
return targetOptions, true
2022-11-11 18:03:17 +00:00
}