Initial _redirects implementation

This commit is contained in:
video-prize-ranch 2022-12-19 15:50:03 -05:00
parent 9d769aeee7
commit 4b873a4792
No known key found for this signature in database
8 changed files with 106 additions and 15 deletions

View file

@ -18,6 +18,7 @@ func tryUpstream(ctx *context.Context, giteaClient *gitea.Client,
mainDomainSuffix, trimmedHost string,
options *upstream.Options,
canonicalDomainCache cache.SetGetKey,
redirectsCache cache.SetGetKey,
) {
// check if a canonical domain exists on a request on MainDomain
if strings.HasSuffix(trimmedHost, mainDomainSuffix) {
@ -38,6 +39,41 @@ func tryUpstream(ctx *context.Context, giteaClient *gitea.Client,
// Add host for debugging.
options.Host = trimmedHost
// Check for redirects
redirects := options.GetRedirects(giteaClient, redirectsCache)
if len(redirects) > 0 {
for _, redirect := range redirects {
reqUrl := ctx.Req.RequestURI
trimmedFromUrl := strings.TrimSuffix(redirect.From, "/*")
if strings.TrimSuffix(redirect.From, "/") == strings.TrimSuffix(reqUrl, "/") {
if redirect.StatusCode == 200 {
options.TargetPath = redirect.To
} else {
ctx.Redirect(redirect.To, redirect.StatusCode)
return
}
}
if strings.HasSuffix(redirect.From, "/*") && strings.HasPrefix(reqUrl, trimmedFromUrl) {
if strings.Contains(redirect.To, ":splat") {
splatUrl := strings.ReplaceAll(redirect.To, ":splat", strings.TrimPrefix(reqUrl, trimmedFromUrl))
if redirect.StatusCode == 200 {
options.TargetPath = splatUrl
} else {
ctx.Redirect(splatUrl, redirect.StatusCode)
return
}
} else {
if redirect.StatusCode == 200 {
options.TargetPath = redirect.To
} else {
ctx.Redirect(redirect.To, redirect.StatusCode)
return
}
}
}
}
}
// Try to request the file from the Gitea API
if !options.Upstream(ctx, giteaClient) {
html.ReturnErrorPage(ctx, "", ctx.StatusCode)