2021-12-05 15:09:21 +01:00
package server
import (
2021-12-05 15:45:22 +01:00
"bytes"
"net/http"
2021-12-05 15:09:21 +01:00
"time"
"github.com/valyala/fasthttp"
2021-12-05 15:45:22 +01:00
"codeberg.org/codeberg/pages/server/cache"
"codeberg.org/codeberg/pages/server/utils"
2021-12-05 15:09:21 +01:00
)
2021-12-05 15:45:22 +01:00
func SetupServer ( handler fasthttp . RequestHandler ) * fasthttp . Server {
2021-12-05 15:09:21 +01:00
// Enable compression by wrapping the handler with the compression function provided by FastHTTP
compressedHandler := fasthttp . CompressHandlerBrotliLevel ( handler , fasthttp . CompressBrotliBestSpeed , fasthttp . CompressBestSpeed )
2021-12-05 15:45:22 +01:00
return & fasthttp . Server {
2021-12-05 15:09:21 +01:00
Handler : compressedHandler ,
DisablePreParseMultipartForm : true ,
MaxRequestBodySize : 0 ,
NoDefaultServerHeader : true ,
NoDefaultDate : true ,
ReadTimeout : 30 * time . Second , // needs to be this high for ACME certificates with ZeroSSL & HTTP-01 challenge
Concurrency : 1024 * 32 , // TODO: adjust bottlenecks for best performance with Gitea!
MaxConnsPerIP : 100 ,
}
2021-12-05 15:45:22 +01:00
}
2021-12-05 15:09:21 +01:00
2021-12-05 17:57:54 +01:00
func SetupHTTPACMEChallengeServer ( challengeCache cache . SetGetKey ) * fasthttp . Server {
2021-12-05 15:45:22 +01:00
challengePath := [ ] byte ( "/.well-known/acme-challenge/" )
return & fasthttp . Server {
Handler : func ( ctx * fasthttp . RequestCtx ) {
if bytes . HasPrefix ( ctx . Path ( ) , challengePath ) {
challenge , ok := challengeCache . Get ( string ( utils . TrimHostPort ( ctx . Host ( ) ) ) + "/" + string ( bytes . TrimPrefix ( 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 )
}
} ,
}
2021-12-05 15:09:21 +01:00
}