mirror of
https://codeberg.org/Codeberg/pages-server.git
synced 2024-09-30 12:13:39 +00:00
6c63b66ce4
we have big functions that handle all stuff ... we should split this into smaler chuncks so we could test them seperate and make clear cuts in what happens where Reviewed-on: https://codeberg.org/Codeberg/pages-server/pulls/135
71 lines
2.4 KiB
Go
71 lines
2.4 KiB
Go
package handler
|
|
|
|
import (
|
|
"net/http"
|
|
"path"
|
|
"strings"
|
|
|
|
"codeberg.org/codeberg/pages/html"
|
|
"codeberg.org/codeberg/pages/server/cache"
|
|
"codeberg.org/codeberg/pages/server/context"
|
|
"codeberg.org/codeberg/pages/server/dns"
|
|
"codeberg.org/codeberg/pages/server/gitea"
|
|
"codeberg.org/codeberg/pages/server/upstream"
|
|
"github.com/rs/zerolog"
|
|
)
|
|
|
|
func handleCustomDomain(log zerolog.Logger, ctx *context.Context, giteaClient *gitea.Client,
|
|
mainDomainSuffix string,
|
|
trimmedHost string,
|
|
pathElements []string,
|
|
dnsLookupCache, canonicalDomainCache cache.SetGetKey,
|
|
) {
|
|
// Serve pages from custom domains
|
|
targetOwner, targetRepo, targetBranch := dns.GetTargetFromDNS(trimmedHost, string(mainDomainSuffix), dnsLookupCache)
|
|
if targetOwner == "" {
|
|
html.ReturnErrorPage(ctx,
|
|
"could not obtain repo owner from custom domain",
|
|
http.StatusFailedDependency)
|
|
return
|
|
}
|
|
|
|
pathParts := pathElements
|
|
canonicalLink := false
|
|
if strings.HasPrefix(pathElements[0], "@") {
|
|
targetBranch = pathElements[0][1:]
|
|
pathParts = pathElements[1:]
|
|
canonicalLink = true
|
|
}
|
|
|
|
// Try to use the given repo on the given branch or the default branch
|
|
log.Debug().Msg("custom domain preparations, now trying with details from DNS")
|
|
if targetOpt, works := tryBranch(log, ctx, giteaClient, &upstream.Options{
|
|
TryIndexPages: true,
|
|
TargetOwner: targetOwner,
|
|
TargetRepo: targetRepo,
|
|
TargetBranch: targetBranch,
|
|
TargetPath: path.Join(pathParts...),
|
|
}, canonicalLink); works {
|
|
canonicalDomain, valid := targetOpt.CheckCanonicalDomain(giteaClient, trimmedHost, string(mainDomainSuffix), canonicalDomainCache)
|
|
if !valid {
|
|
html.ReturnErrorPage(ctx, "domain not specified in <code>.domains</code> file", http.StatusMisdirectedRequest)
|
|
return
|
|
} else if canonicalDomain != trimmedHost {
|
|
// only redirect if the target is also a codeberg page!
|
|
targetOwner, _, _ = dns.GetTargetFromDNS(strings.SplitN(canonicalDomain, "/", 2)[0], string(mainDomainSuffix), dnsLookupCache)
|
|
if targetOwner != "" {
|
|
ctx.Redirect("https://"+canonicalDomain+string(targetOpt.TargetPath), http.StatusTemporaryRedirect)
|
|
return
|
|
}
|
|
|
|
html.ReturnErrorPage(ctx, "target is no codeberg page", http.StatusFailedDependency)
|
|
return
|
|
}
|
|
|
|
log.Debug().Msg("tryBranch, now trying upstream 7")
|
|
tryUpstream(ctx, giteaClient, mainDomainSuffix, trimmedHost, targetOpt, canonicalDomainCache)
|
|
return
|
|
}
|
|
|
|
html.ReturnErrorPage(ctx, "could not find target for custom domain", http.StatusFailedDependency)
|
|
}
|