summaryrefslogtreecommitdiff
path: root/internal/service/server.go
diff options
context:
space:
mode:
authorJames Elliott <james-d-elliott@users.noreply.github.com>2025-03-09 01:53:44 +1100
committerGitHub <noreply@github.com>2025-03-09 01:53:44 +1100
commit9241731a4dd5592b4a02b5352c903b4d06b6f4ab (patch)
tree5184b98751912a261ff70fd8721b9cd4f1c98f1e /internal/service/server.go
parentbbcb38ab9ff35e69d5d52a71ab56346749f5e8b1 (diff)
feat(embed): make authelia embedable (#8841)
This adds a highly experimental option for developers looking to embed Authelia within another go binary. Closes #5803 Signed-off-by: James Elliott <james-d-elliott@users.noreply.github.com>
Diffstat (limited to 'internal/service/server.go')
-rw-r--r--internal/service/server.go120
1 files changed, 120 insertions, 0 deletions
diff --git a/internal/service/server.go b/internal/service/server.go
new file mode 100644
index 000000000..15921af01
--- /dev/null
+++ b/internal/service/server.go
@@ -0,0 +1,120 @@
+package service
+
+import (
+ "context"
+ "net"
+ "strings"
+ "time"
+
+ "github.com/sirupsen/logrus"
+ "github.com/valyala/fasthttp"
+
+ "github.com/authelia/authelia/v4/internal/server"
+)
+
+func ProvisionServer(ctx Context) (service Provider, err error) {
+ var (
+ s *fasthttp.Server
+ listener net.Listener
+ paths []string
+ isTLS bool
+ )
+
+ switch s, listener, paths, isTLS, err = server.New(ctx.GetConfiguration(), ctx.GetProviders()); {
+ case err != nil:
+ return nil, err
+ case s != nil && listener != nil:
+ service = NewBaseServer("main", s, listener, paths, isTLS, ctx.GetLogger())
+ default:
+ return nil, nil
+ }
+
+ return service, nil
+}
+
+func ProvisionServerMetrics(ctx Context) (service Provider, err error) {
+ var (
+ s *fasthttp.Server
+ listener net.Listener
+ paths []string
+ isTLS bool
+ )
+
+ switch s, listener, paths, isTLS, err = server.NewMetrics(ctx.GetConfiguration(), ctx.GetProviders()); {
+ case err != nil:
+ return nil, err
+ case s != nil && listener != nil:
+ service = NewBaseServer("metrics", s, listener, paths, isTLS, ctx.GetLogger())
+ default:
+ return nil, nil
+ }
+
+ return service, nil
+}
+
+// NewBaseServer creates a new Server with the appropriate logger etc.
+func NewBaseServer(name string, server *fasthttp.Server, listener net.Listener, paths []string, isTLS bool, log *logrus.Entry) (service *Server) {
+ return &Server{
+ name: name,
+ server: server,
+ listener: listener,
+ paths: paths,
+ isTLS: isTLS,
+ log: log.WithFields(map[string]any{logFieldService: serviceTypeServer, serviceTypeServer: name}),
+ }
+}
+
+// Server is a Provider which runs a web server.
+type Server struct {
+ name string
+ server *fasthttp.Server
+ paths []string
+ isTLS bool
+ listener net.Listener
+ log *logrus.Entry
+}
+
+// ServiceType returns the service type for this service, which is always 'server'.
+func (service *Server) ServiceType() string {
+ return serviceTypeServer
+}
+
+// ServiceName returns the individual name for this service.
+func (service *Server) ServiceName() string {
+ return service.name
+}
+
+// Run the Server.
+func (service *Server) Run() (err error) {
+ defer func() {
+ if r := recover(); r != nil {
+ service.log.WithError(recoverErr(r)).Error("Critical error caught (recovered)")
+ }
+ }()
+
+ service.log.Infof(fmtLogServerListening, connectionType(service.isTLS), service.listener.Addr().String(), strings.Join(service.paths, "' and '"))
+
+ if err = service.server.Serve(service.listener); err != nil {
+ service.log.WithError(err).Error("Error returned attempting to serve requests")
+
+ return err
+ }
+
+ return nil
+}
+
+// Shutdown the Server.
+func (service *Server) Shutdown() {
+ ctx, cancel := context.WithTimeout(context.Background(), time.Second*10)
+
+ defer cancel()
+
+ if err := service.server.ShutdownWithContext(ctx); err != nil {
+ service.log.WithError(err).Error("Error occurred during shutdown")
+ }
+}
+
+// Log returns the *logrus.Entry of the Server.
+func (service *Server) Log() *logrus.Entry {
+ return service.log
+}