Merge branch 'main' into std-http

This commit is contained in:
6543 2022-07-15 21:27:28 +02:00
commit b377efbbda
No known key found for this signature in database
GPG key ID: C99B82E40B027BAE
6 changed files with 22 additions and 7 deletions

View file

@ -21,6 +21,10 @@ lint: tool-golangci tool-gofumpt
fmt: tool-gofumpt fmt: tool-gofumpt
gofumpt -w --extra . gofumpt -w --extra .
clean:
go clean ./...
rm -rf build/
tool-golangci: tool-golangci:
@hash golangci-lint> /dev/null 2>&1; if [ $? -ne 0 ]; then \ @hash golangci-lint> /dev/null 2>&1; if [ $? -ne 0 ]; then \
go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest; \ go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest; \

View file

@ -23,11 +23,11 @@
<body> <body>
<i class="fa fa-search text-primary" style="font-size: 96px;"></i> <i class="fa fa-search text-primary" style="font-size: 96px;"></i>
<h1 class="mb-0 text-primary"> <h1 class="mb-0 text-primary">
This page was not found! Page not found!
</h1> </h1>
<h5 class="text-center" style="max-width: 25em;"> <h5 class="text-center" style="max-width: 25em;">
Sorry, this page doesn't exist or is inaccessible for other reasons (%status).<br/> Sorry, but this page couldn't be found or is inaccessible (%status).<br/>
We hope this is not our fault ;) - Make sure to check the <a href="https://docs.codeberg.org/codeberg-pages/troubleshooting/" target="_blank">troubleshooting section in the Docs</a>! We hope this isn't a problem on our end ;) - Make sure to check the <a href="https://docs.codeberg.org/codeberg-pages/troubleshooting/" target="_blank">troubleshooting section in the Docs</a>!
</h5> </h5>
<small class="text-muted"> <small class="text-muted">
<img src="https://design.codeberg.org/logo-kit/icon.svg" class="align-top"> <img src="https://design.codeberg.org/logo-kit/icon.svg" class="align-top">

View file

@ -59,6 +59,8 @@ func TestGetContent(t *testing.T) {
assert.EqualValues(t, "text/html; charset=utf-8", resp.Header.Get("Content-Type")) assert.EqualValues(t, "text/html; charset=utf-8", resp.Header.Get("Content-Type"))
assert.True(t, getSize(resp.Body) > 100) assert.True(t, getSize(resp.Body) > 100)
assert.Len(t, resp.Header.Get("ETag"), 42) assert.Len(t, resp.Header.Get("ETag"), 42)
// TODO: test get of non cachable content (content size > fileCacheSizeLimit)
} }
func TestCustomDomain(t *testing.T) { func TestCustomDomain(t *testing.T) {

View file

@ -59,9 +59,6 @@ func (client *Client) ServeRawContent(uri string) (*fasthttp.Response, error) {
return nil, err return nil, err
} }
// fasthttp else will set "Content-Length: 0"
resp.SetBodyStream(&strings.Reader{}, -1)
switch res.StatusCode() { switch res.StatusCode() {
case fasthttp.StatusOK: case fasthttp.StatusOK:
return res, nil return res, nil

View file

@ -7,12 +7,20 @@ import (
"net/http" "net/http"
"time" "time"
"github.com/rs/zerolog/log"
"github.com/valyala/fasthttp" "github.com/valyala/fasthttp"
"codeberg.org/codeberg/pages/server/cache" "codeberg.org/codeberg/pages/server/cache"
"codeberg.org/codeberg/pages/server/utils" "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 { func SetupServer(handler fasthttp.RequestHandler) *fasthttp.Server {
// Enable compression by wrapping the handler with the compression function provided by FastHTTP // Enable compression by wrapping the handler with the compression function provided by FastHTTP
compressedHandler := fasthttp.CompressHandlerBrotliLevel(handler, fasthttp.CompressBrotliBestSpeed, fasthttp.CompressBestSpeed) compressedHandler := fasthttp.CompressHandlerBrotliLevel(handler, fasthttp.CompressBrotliBestSpeed, fasthttp.CompressBestSpeed)
@ -23,6 +31,7 @@ func SetupServer(handler fasthttp.RequestHandler) *fasthttp.Server {
NoDefaultServerHeader: true, NoDefaultServerHeader: true,
NoDefaultDate: true, NoDefaultDate: true,
ReadTimeout: 30 * time.Second, // needs to be this high for ACME certificates with ZeroSSL & HTTP-01 challenge ReadTimeout: 30 * time.Second, // needs to be this high for ACME certificates with ZeroSSL & HTTP-01 challenge
Logger: fasthttpLogger{},
} }
} }

View file

@ -181,6 +181,9 @@ func (o *Options) Upstream(ctx *fasthttp.RequestCtx, giteaClient *gitea.Client,
var cacheBodyWriter bytes.Buffer var cacheBodyWriter bytes.Buffer
if res != nil { if res != nil {
if res.Header.ContentLength() > fileCacheSizeLimit { if res.Header.ContentLength() > fileCacheSizeLimit {
// fasthttp else will set "Content-Length: 0"
ctx.Response.SetBodyStream(&strings.Reader{}, -1)
err = res.BodyWriteTo(ctx.Response.BodyWriter()) err = res.BodyWriteTo(ctx.Response.BodyWriter())
} else { } else {
// TODO: cache is half-empty if request is cancelled - does the ctx.Err() below do the trick? // 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") log.Debug().Msg("response")
if res != nil && ctx.Err() == nil { if res != nil && res.Header.ContentLength() > fileCacheSizeLimit && ctx.Err() == nil {
cachedResponse.Exists = true cachedResponse.Exists = true
cachedResponse.MimeType = mimeType cachedResponse.MimeType = mimeType
cachedResponse.Body = cacheBodyWriter.Bytes() cachedResponse.Body = cacheBodyWriter.Bytes()