From 05e075dd83307cd141224bc3a33037439de88c68 Mon Sep 17 00:00:00 2001 From: 6543 <6543@obermui.de> Date: Fri, 11 Nov 2022 05:21:05 +0100 Subject: [PATCH] wip --- server/context/context.go | 6 ++---- server/gitea/client.go | 1 + server/handler.go | 4 ++-- server/try.go | 2 +- server/upstream/upstream.go | 35 +++++++++++++++++++---------------- 5 files changed, 25 insertions(+), 23 deletions(-) diff --git a/server/context/context.go b/server/context/context.go index c84a953..6c75b26 100644 --- a/server/context/context.go +++ b/server/context/context.go @@ -10,6 +10,7 @@ import ( type Context struct { RespWriter http.ResponseWriter Req *http.Request + StatusCode int } func New(w http.ResponseWriter, r *http.Request) *Context { @@ -27,10 +28,7 @@ func (c *Context) Context() stdContext.Context { } func (c *Context) Response() *http.Response { - if c.Req != nil { - if c.Req.Response == nil { - c.Req.Response = &http.Response{Header: make(http.Header)} - } + if c.Req != nil && c.Req.Response != nil { return c.Req.Response } return nil diff --git a/server/gitea/client.go b/server/gitea/client.go index 87c936a..07302a1 100644 --- a/server/gitea/client.go +++ b/server/gitea/client.go @@ -243,6 +243,7 @@ func (client *Client) getMimeTypeByExtension(resource string) string { if client.forbiddenMimeTypes[mimeTypeSplit[0]] || mimeType == "" { mimeType = client.defaultMimeType } + log.Trace().Msgf("probe mime: %s", mimeType) return mimeType } diff --git a/server/handler.go b/server/handler.go index 1c92647..e36dbb4 100644 --- a/server/handler.go +++ b/server/handler.go @@ -119,8 +119,8 @@ func Handler(mainDomainSuffix, rawDomain string, if canonicalLink != "" { // Hide from search machines & add canonical link - ctx.Response().Header.Set("X-Robots-Tag", "noarchive, noindex") - ctx.Response().Header.Set("Link", + ctx.RespWriter.Header().Set("X-Robots-Tag", "noarchive, noindex") + ctx.RespWriter.Header().Set("Link", strings.NewReplacer("%b", targetBranch, "%p", targetPath).Replace(canonicalLink)+ "; rel=\"canonical\"", ) diff --git a/server/try.go b/server/try.go index c209d29..135c1e0 100644 --- a/server/try.go +++ b/server/try.go @@ -44,6 +44,6 @@ func tryUpstream(ctx *context.Context, giteaClient *gitea.Client, // Try to request the file from the Gitea API if !targetOptions.Upstream(ctx, giteaClient) { - html.ReturnErrorPage(ctx, "", ctx.Response().StatusCode) + html.ReturnErrorPage(ctx, "", ctx.StatusCode) } } diff --git a/server/upstream/upstream.go b/server/upstream/upstream.go index 38b7d1a..e793755 100644 --- a/server/upstream/upstream.go +++ b/server/upstream/upstream.go @@ -75,19 +75,22 @@ func (o *Options) Upstream(ctx *context.Context, giteaClient *gitea.Client) (fin } // Check if the browser has a cached version - if ifModifiedSince, err := time.Parse(time.RFC1123, string(ctx.Response().Header.Get(headerIfModifiedSince))); err == nil { - if !ifModifiedSince.Before(o.BranchTimestamp) { - ctx.RespWriter.WriteHeader(http.StatusNotModified) - return true + if ctx.Response() != nil { + if ifModifiedSince, err := time.Parse(time.RFC1123, string(ctx.Response().Header.Get(headerIfModifiedSince))); err == nil { + if !ifModifiedSince.Before(o.BranchTimestamp) { + ctx.RespWriter.WriteHeader(http.StatusNotModified) + return true + } } } log.Debug().Msg("Preparing") - reader, header, statusCode, err := giteaClient.ServeRawContent(o.TargetOwner, o.TargetRepo, o.TargetBranch, o.TargetPath) + reader, header, _statusCode, err := giteaClient.ServeRawContent(o.TargetOwner, o.TargetRepo, o.TargetBranch, o.TargetPath) if reader != nil { defer reader.Close() } + ctx.StatusCode = _statusCode log.Debug().Msg("Aquisting") @@ -113,7 +116,7 @@ func (o *Options) Upstream(ctx *context.Context, giteaClient *gitea.Client) (fin } } - ctx.Response().StatusCode = http.StatusNotFound + ctx.StatusCode = http.StatusNotFound if o.TryIndexPages { // copy the o struct & try if a not found page exists optionsForNotFoundPages := *o @@ -128,8 +131,8 @@ func (o *Options) Upstream(ctx *context.Context, giteaClient *gitea.Client) (fin } return false } - if reader != nil && (err != nil || statusCode != http.StatusOK) { - log.Printf("Couldn't fetch contents (status code %d): %v\n", statusCode, err) + if reader != nil && (err != nil || ctx.StatusCode != http.StatusOK) { + log.Printf("Couldn't fetch contents (status code %d): %v\n", ctx.StatusCode, err) html.ReturnErrorPage(ctx, fmt.Sprintf("%v", err), http.StatusInternalServerError) return true } @@ -152,20 +155,20 @@ func (o *Options) Upstream(ctx *context.Context, giteaClient *gitea.Client) (fin log.Debug().Msg("Handling error") // Set ETag & MIME - ctx.Response().Header.Set(gitea.ETagHeader, header.Get(gitea.ETagHeader)) - ctx.Response().Header.Set(gitea.PagesCacheIndicatorHeader, header.Get(gitea.PagesCacheIndicatorHeader)) - ctx.Response().Header.Set(gitea.ContentLengthHeader, header.Get(gitea.ContentLengthHeader)) + ctx.RespWriter.Header().Set(gitea.ETagHeader, header.Get(gitea.ETagHeader)) + ctx.RespWriter.Header().Set(gitea.PagesCacheIndicatorHeader, header.Get(gitea.PagesCacheIndicatorHeader)) + ctx.RespWriter.Header().Set(gitea.ContentLengthHeader, header.Get(gitea.ContentLengthHeader)) if o.ServeRaw { - ctx.Response().Header.Set(gitea.ContentTypeHeader, header.Get(gitea.ContentTypeHeader)) + ctx.RespWriter.Header().Set(gitea.ContentTypeHeader, header.Get(gitea.ContentTypeHeader)) } else { - ctx.Response().Header.Set(gitea.ContentTypeHeader, rawMime) + ctx.RespWriter.Header().Set(gitea.ContentTypeHeader, rawMime) } - if ctx.Response().StatusCode != http.StatusNotFound { + if ctx.StatusCode != http.StatusNotFound { // Everything's okay so far - ctx.Response().StatusCode = http.StatusOK + ctx.StatusCode = http.StatusOK } - ctx.Response().Header.Set(headerLastModified, o.BranchTimestamp.In(time.UTC).Format(time.RFC1123)) + ctx.RespWriter.Header().Set(headerLastModified, o.BranchTimestamp.In(time.UTC).Format(time.RFC1123)) log.Debug().Msg("Prepare response")