From 02abd4536488afbda3f08f1d3c9008fb79898dc6 Mon Sep 17 00:00:00 2001 From: Alex Malaszkiewicz Date: Tue, 4 Jun 2024 15:21:55 +0200 Subject: [PATCH] Initiate SOAP server for receiving data from SdI Co-authored-by: Alex Malaszkiewicz Co-authored-by: Grzeg Lisowski --- sdi/server.go | 66 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 sdi/server.go diff --git a/sdi/server.go b/sdi/server.go new file mode 100644 index 0000000..56ec1f4 --- /dev/null +++ b/sdi/server.go @@ -0,0 +1,66 @@ +package sdi + +import ( + "context" + "crypto/tls" + "crypto/x509" + "errors" + "log" + "net/http" + "os" + "os/signal" + "syscall" + "time" + + "golang.org/x/net/http2" +) + +// ServerConfig defines soap server configuration options +type ServerConfig struct { + Host string + Port string + Verbose bool + CACert *x509.CertPool + CertAuth tls.Certificate + ClientAuth tls.ClientAuthType +} + +// RunServer sets up a server for receiving invoices from SdI +func RunServer(config *ServerConfig, requestHandler http.HandlerFunc) error { + tlsConfig := &tls.Config{ + ClientAuth: config.ClientAuth, + ClientCAs: config.CACert, + Certificates: []tls.Certificate{config.CertAuth}, + } + + server := http.Server{ + Addr: config.Host + ":" + config.Port, + Handler: http.HandlerFunc(requestHandler), + TLSConfig: tlsConfig, + } + + if err := http2.ConfigureServer(&server, &http2.Server{}); err != nil { + log.Fatalf("Failed to configure HTTP/2: %v", err) + } + + go func() { + if err := server.ListenAndServeTLS("", ""); !errors.Is(err, http.ErrServerClosed) { + log.Fatalf("HTTP server error: %v", err) + } + log.Println("Stopped serving new connections.") + }() + + sigChan := make(chan os.Signal, 1) + signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM) + <-sigChan + + shutdownCtx, shutdownRelease := context.WithTimeout(context.Background(), 10*time.Second) + defer shutdownRelease() + + if err := server.Shutdown(shutdownCtx); err != nil { + log.Fatalf("HTTP shutdown error: %v", err) + } + log.Println("Graceful shutdown complete.") + + return nil +}