From a17db68a6bb29b6f7a731b678fcda9315e769115 Mon Sep 17 00:00:00 2001 From: video-prize-ranch Date: Tue, 14 Mar 2023 19:08:19 -0400 Subject: [PATCH] Move to redirects.go --- server/upstream/redirects.go | 56 ++++++++++++++++++++++++++++++++++-- server/upstream/upstream.go | 50 ++------------------------------ 2 files changed, 56 insertions(+), 50 deletions(-) diff --git a/server/upstream/redirects.go b/server/upstream/redirects.go index 26ecf3f..295212f 100644 --- a/server/upstream/redirects.go +++ b/server/upstream/redirects.go @@ -6,6 +6,7 @@ import ( "time" "codeberg.org/codeberg/pages/server/cache" + "codeberg.org/codeberg/pages/server/context" "codeberg.org/codeberg/pages/server/gitea" "github.com/rs/zerolog/log" ) @@ -21,12 +22,13 @@ var redirectsCacheTimeout = 10 * time.Minute const redirectsConfig = "_redirects" -// GetRedirects returns redirects specified in the _redirects file. -func (o *Options) GetRedirects(giteaClient *gitea.Client, redirectsCache cache.SetGetKey) []Redirect { +// getRedirects returns redirects specified in the _redirects file. +func (o *Options) getRedirects(giteaClient *gitea.Client, redirectsCache cache.SetGetKey) []Redirect { var redirects []Redirect + cacheKey := o.TargetOwner + "/" + o.TargetRepo + "/" + o.TargetBranch // Check for cached redirects - if cachedValue, ok := redirectsCache.Get(o.TargetOwner + "/" + o.TargetRepo + "/" + o.TargetBranch); ok { + if cachedValue, ok := redirectsCache.Get(cacheKey); ok { redirects = cachedValue.([]Redirect) } else { // Get _redirects file and parse @@ -60,3 +62,51 @@ func (o *Options) GetRedirects(giteaClient *gitea.Client, redirectsCache cache.S } return redirects } + +func (o *Options) matchRedirects(ctx *context.Context, giteaClient *gitea.Client, redirects []Redirect, redirectsCache cache.SetGetKey) { + if len(redirects) > 0 { + for _, redirect := range redirects { + reqUrl := ctx.Req.RequestURI + + // check if from url matches request url + if strings.TrimSuffix(redirect.From, "/") == strings.TrimSuffix(reqUrl, "/") { + // do rewrite if status code is 200 + if redirect.StatusCode == 200 { + o.TargetPath = redirect.To + o.Upstream(ctx, giteaClient, redirectsCache) + return + } else { + ctx.Redirect(redirect.To, redirect.StatusCode) + return + } + } + + // handle wildcard redirects + trimmedFromUrl := strings.TrimSuffix(redirect.From, "/*") + 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)) + // do rewrite if status code is 200 + if redirect.StatusCode == 200 { + o.TargetPath = splatUrl + o.Upstream(ctx, giteaClient, redirectsCache) + return + } else { + ctx.Redirect(splatUrl, redirect.StatusCode) + return + } + } else { + // do rewrite if status code is 200 + if redirect.StatusCode == 200 { + o.TargetPath = redirect.To + o.Upstream(ctx, giteaClient, redirectsCache) + return + } else { + ctx.Redirect(redirect.To, redirect.StatusCode) + return + } + } + } + } + } +} \ No newline at end of file diff --git a/server/upstream/upstream.go b/server/upstream/upstream.go index 38dc6c8..137781d 100644 --- a/server/upstream/upstream.go +++ b/server/upstream/upstream.go @@ -138,53 +138,9 @@ func (o *Options) Upstream(ctx *context.Context, giteaClient *gitea.Client, redi } } - // Check for redirects - redirects := o.GetRedirects(giteaClient, redirectsCache) - if len(redirects) > 0 { - for _, redirect := range redirects { - reqUrl := ctx.Req.RequestURI - - // check if from url matches request url - if strings.TrimSuffix(redirect.From, "/") == strings.TrimSuffix(reqUrl, "/") { - // do rewrite if status code is 200 - if redirect.StatusCode == 200 { - o.TargetPath = redirect.To - o.Upstream(ctx, giteaClient, redirectsCache) - return true - } else { - ctx.Redirect(redirect.To, redirect.StatusCode) - return true - } - } - - // handle wildcard redirects - trimmedFromUrl := strings.TrimSuffix(redirect.From, "/*") - 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)) - // do rewrite if status code is 200 - if redirect.StatusCode == 200 { - o.TargetPath = splatUrl - o.Upstream(ctx, giteaClient, redirectsCache) - return true - } else { - ctx.Redirect(splatUrl, redirect.StatusCode) - return true - } - } else { - // do rewrite if status code is 200 - if redirect.StatusCode == 200 { - o.TargetPath = redirect.To - o.Upstream(ctx, giteaClient, redirectsCache) - return true - } else { - ctx.Redirect(redirect.To, redirect.StatusCode) - return true - } - } - } - } - } + // Get and match redirects + redirects := o.getRedirects(giteaClient, redirectsCache) + o.matchRedirects(ctx, giteaClient, redirects, redirectsCache) return false }