85 lines
2.0 KiB
Go
85 lines
2.0 KiB
Go
package main
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"io"
|
|
"log"
|
|
"net"
|
|
"net/http"
|
|
"os"
|
|
|
|
"github.com/gorilla/handlers"
|
|
"github.com/gorilla/mux"
|
|
)
|
|
|
|
// Basic HTTP server structure.
|
|
type HTTPServer struct {
|
|
server *http.Server
|
|
mux *mux.Router
|
|
config *HTTPConfig
|
|
}
|
|
|
|
// This functions starts the HTTP server.
|
|
func NewHTTPServer() *HTTPServer {
|
|
s := new(HTTPServer)
|
|
// Update config reference.
|
|
s.config = &app.config.HTTP
|
|
s.server = &http.Server{}
|
|
s.server.Addr = fmt.Sprintf("%s:%d", s.config.BindAddr, s.config.Port)
|
|
|
|
// Setup router.
|
|
r := mux.NewRouter()
|
|
s.mux = r
|
|
// Register API routes.
|
|
s.RegisterAPIRoutes(r)
|
|
// Default to notice of service being online.
|
|
r.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
|
|
io.WriteString(w, "Srvice Notifications is available\n")
|
|
})
|
|
|
|
s.server.Handler = r
|
|
// If the debug log is enabled, we'll add a middleware handler to log then pass the request to mux router.
|
|
if app.config.HTTP.Debug {
|
|
s.server.Handler = handlers.CombinedLoggingHandler(os.Stdout, r)
|
|
}
|
|
|
|
return s
|
|
}
|
|
|
|
// Start the HTTP server.
|
|
func (s *HTTPServer) Start(ctx context.Context) {
|
|
isListening := make(chan bool)
|
|
// Start server.
|
|
go s.StartWithIsListening(ctx, isListening)
|
|
// Allow the http server to initialize.
|
|
<-isListening
|
|
}
|
|
|
|
// Starts the HTTP server with a listening channel.
|
|
func (s *HTTPServer) StartWithIsListening(ctx context.Context, isListening chan bool) {
|
|
// Watch the background context for when we need to shutdown.
|
|
go func() {
|
|
<-ctx.Done()
|
|
err := s.server.Shutdown(context.Background())
|
|
if err != nil {
|
|
// Error from closing listeners, or context timeout:
|
|
log.Println("Error shutting down http server:", err)
|
|
}
|
|
}()
|
|
|
|
// Start the server.
|
|
log.Println("Starting http server:", s.server.Addr)
|
|
l, err := net.Listen("tcp", s.server.Addr)
|
|
if err != nil {
|
|
log.Fatal("Listen: ", err)
|
|
}
|
|
// Now notify we are listening.
|
|
isListening <- true
|
|
// Serve http server on the listening port.
|
|
err = s.server.Serve(l)
|
|
if err != nil {
|
|
log.Println("HTTP server failure:", err)
|
|
}
|
|
}
|