From 31ffadd2cfb20c05984fd9b73f3a179409b7c735 Mon Sep 17 00:00:00 2001 From: Mike Shoup Date: Sun, 30 Sep 2018 12:24:00 -0600 Subject: [PATCH] Add web server --- web.go | 53 +++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 49 insertions(+), 4 deletions(-) diff --git a/web.go b/web.go index 489bd25..f3c4a2a 100644 --- a/web.go +++ b/web.go @@ -1,13 +1,36 @@ package main import ( + "context" + "log" + "net/http" "sync" + "time" + + "github.com/gin-gonic/gin" ) -// RunWeb launches a web server -func RunWeb(sc <-chan State, done <-chan bool, wg *sync.WaitGroup) { - states := make(map[string]State) +// PingHandler responds to get requests with the message "pong". +func PingHandler(c *gin.Context) { + c.String(http.StatusOK, "pong") +} +// SetupRouter initializes the gin router. +func SetupRouter() *gin.Engine { + r := gin.Default() + + gin.SetMode(gin.ReleaseMode) + + // Ping + r.GET("/ping", PingHandler) + + return r +} + +// RunWeb launches a web server. sc is used to update the states from the Thermostats. +func RunWeb(sc <-chan State, done <-chan bool, wg *sync.WaitGroup) { + // Update sensor states when a new state comes back from the thermostat. + states := make(map[string]State) go func() { for { s := <-sc @@ -15,7 +38,29 @@ func RunWeb(sc <-chan State, done <-chan bool, wg *sync.WaitGroup) { } }() - <-done + // Launch the web server + r := SetupRouter() + srv := &http.Server{ + Addr: ":8080", + Handler: r, + } + go func() { + // service connections + if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed { + log.Fatalf("listen: %s\n", err) + } + }() + + // Wait for the done signal + <-done + log.Println("Shutdown Server ...") + + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + defer cancel() + if err := srv.Shutdown(ctx); err != nil { + log.Fatal("Server Shutdown:", err) + } + log.Println("Server exiting") wg.Done() }