From 714f4cfd287be7007fec24cc60cc0b226bf38430 Mon Sep 17 00:00:00 2001 From: Simon Martens Date: Wed, 13 Nov 2024 12:57:00 +0100 Subject: [PATCH] using fiber --- app/kgpz.go | 4 +-- controllers/controller.go | 4 +-- go.mod | 13 +++++++- go.sum | 24 +++++++++++++++ kgpz_web.go | 8 ++--- providers/config.go | 2 +- server/middleware.go | 5 ---- server/mux.go | 17 ----------- server/server.go | 63 ++++++++++++++++++++++++++------------- 9 files changed, 88 insertions(+), 52 deletions(-) delete mode 100644 server/middleware.go delete mode 100644 server/mux.go diff --git a/app/kgpz.go b/app/kgpz.go index f4a4cb9..3a94be8 100644 --- a/app/kgpz.go +++ b/app/kgpz.go @@ -5,8 +5,8 @@ import ( "path/filepath" "sync" - "githib.com/Theodor-Springmann-Stiftung/kgpz_web/helpers" - "githib.com/Theodor-Springmann-Stiftung/kgpz_web/providers" + "github.com/Theodor-Springmann-Stiftung/kgpz_web/helpers" + "github.com/Theodor-Springmann-Stiftung/kgpz_web/providers" ) const ( diff --git a/controllers/controller.go b/controllers/controller.go index 1fad205..a6b366f 100644 --- a/controllers/controller.go +++ b/controllers/controller.go @@ -3,8 +3,8 @@ package controller import ( "net/http" - "githib.com/Theodor-Springmann-Stiftung/kgpz_web/app" - "githib.com/Theodor-Springmann-Stiftung/kgpz_web/templating" + "github.com/Theodor-Springmann-Stiftung/kgpz_web/app" + "github.com/Theodor-Springmann-Stiftung/kgpz_web/templating" ) // ControllerFunc is a function that get injected all dependencies and returns a http.HandlerFunc diff --git a/go.mod b/go.mod index fc973c7..1c4ce36 100644 --- a/go.mod +++ b/go.mod @@ -1,9 +1,10 @@ -module githib.com/Theodor-Springmann-Stiftung/kgpz_web +module github.com/Theodor-Springmann-Stiftung/kgpz_web go 1.23.2 require ( github.com/go-git/go-git/v5 v5.12.0 + github.com/gofiber/fiber/v2 v2.52.5 github.com/kelseyhightower/envconfig v1.4.0 github.com/yalue/merged_fs v1.3.0 ) @@ -12,17 +13,27 @@ require ( dario.cat/mergo v1.0.0 // indirect github.com/Microsoft/go-winio v0.6.1 // indirect github.com/ProtonMail/go-crypto v1.0.0 // indirect + github.com/andybalholm/brotli v1.0.5 // indirect github.com/cloudflare/circl v1.3.7 // indirect github.com/cyphar/filepath-securejoin v0.2.4 // indirect github.com/emirpasic/gods v1.18.1 // indirect github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect github.com/go-git/go-billy/v5 v5.5.0 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect + github.com/google/uuid v1.5.0 // indirect github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect github.com/kevinburke/ssh_config v1.2.0 // indirect + github.com/klauspost/compress v1.17.0 // indirect + github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/mattn/go-runewidth v0.0.15 // indirect github.com/pjbgf/sha1cd v0.3.0 // indirect + github.com/rivo/uniseg v0.2.0 // indirect github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 // indirect github.com/skeema/knownhosts v1.2.2 // indirect + github.com/valyala/bytebufferpool v1.0.0 // indirect + github.com/valyala/fasthttp v1.51.0 // indirect + github.com/valyala/tcplisten v1.0.0 // indirect github.com/xanzy/ssh-agent v0.3.3 // indirect golang.org/x/crypto v0.21.0 // indirect golang.org/x/mod v0.12.0 // indirect diff --git a/go.sum b/go.sum index 3464c70..0c51794 100644 --- a/go.sum +++ b/go.sum @@ -5,6 +5,8 @@ github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migc github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= github.com/ProtonMail/go-crypto v1.0.0 h1:LRuvITjQWX+WIfr930YHG2HNfjR1uOfyf5vE0kC2U78= github.com/ProtonMail/go-crypto v1.0.0/go.mod h1:EjAoLdwvbIOoOQr3ihjnSoLZRtE8azugULFRteWMNc0= +github.com/andybalholm/brotli v1.0.5 h1:8uQZIdzKmjc/iuPu7O2ioW48L81FgatrcpfFmiq/cCs= +github.com/andybalholm/brotli v1.0.5/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be h1:9AeTilPcZAjCFIImctFaOjnTIavg87rW78vTPkQqLI8= github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuWl6zY27l47sB3qLNK6tF2fkHG55UZxx8oIVo4= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= @@ -32,16 +34,22 @@ github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399 h1:eMj github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399/go.mod h1:1OCfN199q1Jm3HZlxleg+Dw/mwps2Wbk9frAWm+4FII= github.com/go-git/go-git/v5 v5.12.0 h1:7Md+ndsjrzZxbddRDZjF14qK+NN56sy6wkqaVrjZtys= github.com/go-git/go-git/v5 v5.12.0/go.mod h1:FTM9VKtnI2m65hNI/TenDDDnUf2Q9FHnXYjuz9i5OEY= +github.com/gofiber/fiber/v2 v2.52.5 h1:tWoP1MJQjGEe4GB5TUGOi7P2E0ZMMRx5ZTG4rT+yGMo= +github.com/gofiber/fiber/v2 v2.52.5/go.mod h1:KEOE+cXMhXG0zHc9d8+E38hoX+ZN7bhOtgeF2oT6jrQ= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/uuid v1.5.0 h1:1p67kYwdtXjb0gL0BPiP1Av9wiZPo5A8z2cWkTZ+eyU= +github.com/google/uuid v1.5.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= github.com/kelseyhightower/envconfig v1.4.0 h1:Im6hONhd3pLkfDFsbRgu68RDNkGF1r3dvMUtDTo2cv8= github.com/kelseyhightower/envconfig v1.4.0/go.mod h1:cccZRl6mQpaq41TPp5QxidR+Sa3axMbJDNb//FQX6Gg= github.com/kevinburke/ssh_config v1.2.0 h1:x584FjTGwHzMwvHx18PXxbBVzfnxogHaAReU4gf13a4= github.com/kevinburke/ssh_config v1.2.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= +github.com/klauspost/compress v1.17.0 h1:Rnbp4K9EjcDuVuHtd0dgA4qNuv9yKDYKK1ulpJwgrqM= +github.com/klauspost/compress v1.17.0/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= @@ -49,6 +57,13 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= +github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI= github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M= github.com/pjbgf/sha1cd v0.3.0 h1:4D5XXmUUBUl/xQ6IjCkEAbqXskkq/4O7LmGn0AqMDs4= @@ -57,6 +72,8 @@ github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 h1:n661drycOFuPLCN3Uc8sB6B/s6Z4t2xvBgU1htSHuq8= @@ -69,6 +86,12 @@ github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXf github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= +github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/valyala/fasthttp v1.51.0 h1:8b30A5JlZ6C7AS81RsWjYMQmrZG6feChmgAolCl1SqA= +github.com/valyala/fasthttp v1.51.0/go.mod h1:oI2XroL+lI7vdXyYoQk03bXBThfFl2cVdIA3Xl7cH8g= +github.com/valyala/tcplisten v1.0.0 h1:rBHj/Xf+E1tRGZyWIWwJDiRY0zc1Js+CV5DqwacVSA8= +github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc= github.com/xanzy/ssh-agent v0.3.3 h1:+/15pJfg/RsTxqYcX6fHqOXZwwMP+2VyYWJeWM2qQFM= github.com/xanzy/ssh-agent v0.3.3/go.mod h1:6dzNDKs0J9rVPHPhaGCukekBHKqfl+L3KghI1Bc68Uw= github.com/yalue/merged_fs v1.3.0 h1:qCeh9tMPNy/i8cwDsQTJ5bLr6IRxbs6meakNE5O+wyY= @@ -108,6 +131,7 @@ golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= diff --git a/kgpz_web.go b/kgpz_web.go index 0dde4bb..65ba7b7 100644 --- a/kgpz_web.go +++ b/kgpz_web.go @@ -6,10 +6,10 @@ import ( "os/signal" "syscall" - "githib.com/Theodor-Springmann-Stiftung/kgpz_web/app" - "githib.com/Theodor-Springmann-Stiftung/kgpz_web/helpers" - "githib.com/Theodor-Springmann-Stiftung/kgpz_web/providers" - "githib.com/Theodor-Springmann-Stiftung/kgpz_web/server" + "github.com/Theodor-Springmann-Stiftung/kgpz_web/app" + "github.com/Theodor-Springmann-Stiftung/kgpz_web/helpers" + "github.com/Theodor-Springmann-Stiftung/kgpz_web/providers" + "github.com/Theodor-Springmann-Stiftung/kgpz_web/server" ) const ( diff --git a/providers/config.go b/providers/config.go index 64ed22b..ddf325f 100644 --- a/providers/config.go +++ b/providers/config.go @@ -6,7 +6,7 @@ import ( "os" "strings" - "githib.com/Theodor-Springmann-Stiftung/kgpz_web/helpers" + "github.com/Theodor-Springmann-Stiftung/kgpz_web/helpers" "github.com/kelseyhightower/envconfig" ) diff --git a/server/middleware.go b/server/middleware.go deleted file mode 100644 index dee5451..0000000 --- a/server/middleware.go +++ /dev/null @@ -1,5 +0,0 @@ -package server - -import "net/http" - -type Middleware func(http.Handler) http.Handler diff --git a/server/mux.go b/server/mux.go deleted file mode 100644 index 5591e2a..0000000 --- a/server/mux.go +++ /dev/null @@ -1,17 +0,0 @@ -package server - -import "net/http" - -type Mux struct { - sm http.ServeMux -} - -func NewMux() *Mux { - return &Mux{ - sm: http.ServeMux{}, - } -} - -func (m *Mux) Router() *http.ServeMux { - return &m.sm -} diff --git a/server/server.go b/server/server.go index 0b4296d..dc0e8a2 100644 --- a/server/server.go +++ b/server/server.go @@ -1,15 +1,21 @@ package server import ( - "context" "fmt" - "io" - "net/http" "sync" "time" - "githib.com/Theodor-Springmann-Stiftung/kgpz_web/app" - "githib.com/Theodor-Springmann-Stiftung/kgpz_web/providers" + "github.com/Theodor-Springmann-Stiftung/kgpz_web/app" + "github.com/Theodor-Springmann-Stiftung/kgpz_web/providers" + + "github.com/gofiber/fiber/v2" + "github.com/gofiber/fiber/v2/middleware/logger" + "github.com/gofiber/fiber/v2/middleware/recover" +) + +const ( + REQUEST_TIMEOUT = 8 * time.Second + SERVER_TIMEOUT = 8 * time.Second ) // INFO: Server is a meta-package that handles the current router, which it starts in a goroutine. @@ -19,6 +25,7 @@ import ( // - we invalidate all caches if data is valid // - we reload all clients // - if data validity catastrophically fails, we restart the router to map error pages. +// TODO: Use fiber type Server struct { Config *providers.ConfigProvider running chan bool @@ -32,7 +39,31 @@ func Start(k *app.KGPZ, c *providers.ConfigProvider) *Server { } func (s *Server) Start() { - srv := &http.Server{Addr: s.Config.Address + ":" + s.Config.Port} + srv := fiber.New(fiber.Config{ + AppName: s.Config.Address, + CaseSensitive: false, + StrictRouting: true, + EnableIPValidation: true, + EnablePrintRoutes: s.Config.Debug, + // TODO: Error handler, which sadly, is global: + ErrorHandler: fiber.DefaultErrorHandler, + // WARNING: The app must be run in a console, since this uses environment variables: + // Prefork: true, + StreamRequestBody: false, + WriteTimeout: REQUEST_TIMEOUT, + ReadTimeout: REQUEST_TIMEOUT, + }) + + if s.Config.Debug { + srv.Use(logger.New()) + } + + srv.Use(recover.New()) + + srv.Get("/", func(c *fiber.Ctx) error { + return c.SendString("I'm a GET request!") + }) + s.runner(srv) } @@ -59,7 +90,7 @@ func (s *Server) Restart() { s.Start() } -func (s *Server) runner(srv *http.Server) { +func (s *Server) runner(srv *fiber.App) { s.running = make(chan bool) s.shutdown = &sync.WaitGroup{} @@ -70,15 +101,7 @@ func (s *Server) runner(srv *http.Server) { go func() { defer s.shutdown.Done() - // EXAMPLE: - mux := http.NewServeMux() - mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { - io.WriteString(w, "hello world\n") - }) - - srv.Handler = mux - - if err := srv.ListenAndServe(); err != http.ErrServerClosed { + if err := srv.Listen(s.Config.Address + ":" + s.Config.Port); err != nil { fmt.Println(err) fmt.Println("Error starting server") return @@ -91,15 +114,15 @@ func (s *Server) runner(srv *http.Server) { defer cleanup.Done() clean := <-s.running + srv.Server().CloseOnShutdown = true + if clean { - ctx, cancel := context.WithDeadline(context.Background(), time.Now().Add(8*time.Second)) - defer cancel() - if err := srv.Shutdown(ctx); err != nil { + if err := srv.ShutdownWithTimeout(SERVER_TIMEOUT); err != nil { fmt.Println(err) fmt.Println("Error shutting down server") } } else { - if err := srv.Close(); err != nil { + if err := srv.ShutdownWithTimeout(0); err != nil { fmt.Println(err) fmt.Println("Error closing server") }