diff --git a/Justfile b/Justfile index a908e7a..c824efa 100644 --- a/Justfile +++ b/Justfile @@ -21,6 +21,10 @@ lint: tool-golangci tool-gofumpt fmt: tool-gofumpt gofumpt -w --extra . +clean: + go clean ./... + rm -rf build/ + tool-golangci: @hash golangci-lint> /dev/null 2>&1; if [ $? -ne 0 ]; then \ go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest; \ diff --git a/html/404.html b/html/404.html index 08ab16d..b7ec96e 100644 --- a/html/404.html +++ b/html/404.html @@ -23,11 +23,11 @@

- This page was not found! + Page not found!

- Sorry, this page doesn't exist or is inaccessible for other reasons (%status).
- We hope this is not our fault ;) - Make sure to check the troubleshooting section in the Docs! + Sorry, but this page couldn't be found or is inaccessible (%status).
+ We hope this isn't a problem on our end ;) - Make sure to check the troubleshooting section in the Docs!
diff --git a/integration/get_test.go b/integration/get_test.go index 1997010..8af40f0 100644 --- a/integration/get_test.go +++ b/integration/get_test.go @@ -59,6 +59,8 @@ func TestGetContent(t *testing.T) { assert.EqualValues(t, "text/html; charset=utf-8", resp.Header.Get("Content-Type")) assert.True(t, getSize(resp.Body) > 100) assert.Len(t, resp.Header.Get("ETag"), 42) + + // TODO: test get of non cachable content (content size > fileCacheSizeLimit) } func TestCustomDomain(t *testing.T) { diff --git a/server/gitea/client_fasthttp.go b/server/gitea/client_fasthttp.go index cebe2cd..c667e0a 100644 --- a/server/gitea/client_fasthttp.go +++ b/server/gitea/client_fasthttp.go @@ -59,9 +59,6 @@ func (client *Client) ServeRawContent(uri string) (*fasthttp.Response, error) { return nil, err } - // fasthttp else will set "Content-Length: 0" - resp.SetBodyStream(&strings.Reader{}, -1) - switch res.StatusCode() { case fasthttp.StatusOK: return res, nil diff --git a/server/setup.go b/server/setup.go index 9a332aa..6476d41 100644 --- a/server/setup.go +++ b/server/setup.go @@ -7,12 +7,20 @@ import ( "net/http" "time" + "github.com/rs/zerolog/log" + "github.com/valyala/fasthttp" "codeberg.org/codeberg/pages/server/cache" "codeberg.org/codeberg/pages/server/utils" ) +type fasthttpLogger struct{} + +func (fasthttpLogger) Printf(format string, args ...interface{}) { + log.Printf("[FASTHTTP] "+format, args...) +} + func SetupServer(handler fasthttp.RequestHandler) *fasthttp.Server { // Enable compression by wrapping the handler with the compression function provided by FastHTTP compressedHandler := fasthttp.CompressHandlerBrotliLevel(handler, fasthttp.CompressBrotliBestSpeed, fasthttp.CompressBestSpeed) @@ -23,6 +31,7 @@ func SetupServer(handler fasthttp.RequestHandler) *fasthttp.Server { NoDefaultServerHeader: true, NoDefaultDate: true, ReadTimeout: 30 * time.Second, // needs to be this high for ACME certificates with ZeroSSL & HTTP-01 challenge + Logger: fasthttpLogger{}, } } diff --git a/server/upstream/upstream.go b/server/upstream/upstream.go index 7c9a035..5e888ac 100644 --- a/server/upstream/upstream.go +++ b/server/upstream/upstream.go @@ -181,6 +181,9 @@ func (o *Options) Upstream(ctx *fasthttp.RequestCtx, giteaClient *gitea.Client, var cacheBodyWriter bytes.Buffer if res != nil { if res.Header.ContentLength() > fileCacheSizeLimit { + // fasthttp else will set "Content-Length: 0" + ctx.Response.SetBodyStream(&strings.Reader{}, -1) + err = res.BodyWriteTo(ctx.Response.BodyWriter()) } else { // TODO: cache is half-empty if request is cancelled - does the ctx.Err() below do the trick? @@ -196,7 +199,7 @@ func (o *Options) Upstream(ctx *fasthttp.RequestCtx, giteaClient *gitea.Client, } log.Debug().Msg("response") - if res != nil && ctx.Err() == nil { + if res != nil && res.Header.ContentLength() > fileCacheSizeLimit && ctx.Err() == nil { cachedResponse.Exists = true cachedResponse.MimeType = mimeType cachedResponse.Body = cacheBodyWriter.Bytes()