//go:build fasthttp package server import ( "net/http" "strings" "time" "github.com/valyala/fasthttp" "codeberg.org/codeberg/pages/server/cache" "codeberg.org/codeberg/pages/server/utils" ) 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) return &fasthttp.Server{ Handler: compressedHandler, DisablePreParseMultipartForm: true, NoDefaultServerHeader: true, NoDefaultDate: true, ReadTimeout: 30 * time.Second, // needs to be this high for ACME certificates with ZeroSSL & HTTP-01 challenge } } func SetupHTTPACMEChallengeServer(challengeCache cache.SetGetKey) *fasthttp.Server { challengePath := "/.well-known/acme-challenge/" return &fasthttp.Server{ Handler: func(ctx *fasthttp.RequestCtx) { if strings.HasPrefix(string(ctx.Path()), challengePath) { challenge, ok := challengeCache.Get(utils.TrimHostPort(string(ctx.Host())) + "/" + strings.TrimPrefix(string(ctx.Path()), challengePath)) if !ok || challenge == nil { ctx.SetStatusCode(http.StatusNotFound) ctx.SetBodyString("no challenge for this token") } ctx.SetBodyString(challenge.(string)) } else { ctx.Redirect("https://"+string(ctx.Host())+string(ctx.RequestURI()), http.StatusMovedPermanently) } }, } }