From 686cbdf330a87f725a8082a687dea5174df4816c Mon Sep 17 00:00:00 2001 From: Georg Hopp Date: Tue, 2 Oct 2018 06:24:24 +0200 Subject: [PATCH] Add some more server code... --- main.go | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 55 insertions(+), 5 deletions(-) diff --git a/main.go b/main.go index be16cc5..bd50a52 100644 --- a/main.go +++ b/main.go @@ -25,14 +25,21 @@ along with this program. If not, see . package test import ( + "context" "encoding/json" + "io" "net/http" + "os" + "os/signal" "strings" - //"os" - "io" + "syscall" + + "gitlab.weird-web-workers.org/golang/logger" ) -type ApiHandler struct {} +type ApiHandler struct { + log *logger.Logger +} type version struct { Version string `json:"Version"` @@ -40,6 +47,12 @@ type version struct { BuildTime string `json:"BuildTimestamp"` } +type Server struct { + server *http.Server + log *logger.Logger + Stop chan bool +} + func (handler *ApiHandler) ServeHTTP( response http.ResponseWriter, request *http.Request, @@ -65,10 +78,47 @@ func (handler *ApiHandler) ServeHTTP( } } -func router() { - handler := ApiHandler{} +func NewServer(addr string, log *logger.Logger) (server *Server) { + handler := ApiHandler{log: log} http.Handle("/api/0.0.1/", http.StripPrefix("/api/0.0.1/", &handler)) + + server = &Server{ + server: &http.Server{Addr: addr}, + log: log, + Stop: make(chan bool), + } + go func() { + server.log.Info("Listening on %s", addr) + if err := server.server.ListenAndServe(); + err != http.ErrServerClosed { + logger.Default.LogError(err, "Stop listening") + } + }() + + interrupt := make(chan os.Signal, 1) + signal.Notify(interrupt, os.Interrupt, syscall.SIGTERM, syscall.SIGINT) + go func() { + for run, ok := true, true; run && ok; { + select { + case <-interrupt: + server.log.Info("API service Interrupted by signal") + run = false + case run, ok = <-server.Stop: + server.log.Info("API service stopped") + } + } + + ctx := context.Background() + if err := server.server.Shutdown(ctx); err != nil { + server.log.LogError(err, "Unclean server shutdown") + } else { + server.log.Info("Server stopped") + } + server.Stop <- true + }() + + return } // vim: ts=4 sts=4 sw=4 noet tw=72: