mirror of
https://github.com/dcarrillo/whatismyip.git
synced 2025-07-01 19:49:27 +00:00
Initial server handling refactor (#9)
This commit is contained in:
@ -2,30 +2,18 @@ package main
|
||||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"flag"
|
||||
"fmt"
|
||||
"log"
|
||||
"net/http"
|
||||
"os"
|
||||
"os/signal"
|
||||
"syscall"
|
||||
|
||||
"github.com/dcarrillo/whatismyip/internal/httputils"
|
||||
"github.com/dcarrillo/whatismyip/internal/setting"
|
||||
"github.com/dcarrillo/whatismyip/server"
|
||||
"github.com/gin-contrib/secure"
|
||||
|
||||
"github.com/dcarrillo/whatismyip/models"
|
||||
"github.com/dcarrillo/whatismyip/router"
|
||||
"github.com/gin-gonic/gin"
|
||||
http3 "github.com/quic-go/quic-go/http3"
|
||||
)
|
||||
|
||||
var (
|
||||
tcpServer *http.Server
|
||||
tlsServer *http.Server
|
||||
h3Server *http3.Server
|
||||
engine *gin.Engine
|
||||
)
|
||||
|
||||
func main() {
|
||||
@ -39,149 +27,20 @@ func main() {
|
||||
}
|
||||
|
||||
models.Setup(setting.App.GeodbPath.City, setting.App.GeodbPath.ASN)
|
||||
setupEngine()
|
||||
engine := setupEngine()
|
||||
router.SetupTemplate(engine)
|
||||
router.Setup(engine)
|
||||
|
||||
if setting.App.BindAddress != "" {
|
||||
runTCPServer()
|
||||
}
|
||||
|
||||
if setting.App.TLSAddress != "" {
|
||||
runTLSServer()
|
||||
if setting.App.EnableHTTP3 {
|
||||
runQuicServer()
|
||||
}
|
||||
}
|
||||
|
||||
runHandler()
|
||||
whatismyip := server.Setup(context.Background(), engine.Handler())
|
||||
whatismyip.Run()
|
||||
}
|
||||
|
||||
func runHandler() {
|
||||
signalChan := make(chan os.Signal, 3)
|
||||
signal.Notify(signalChan, syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM)
|
||||
ctx := context.Background()
|
||||
var s os.Signal
|
||||
|
||||
for {
|
||||
s = <-signalChan
|
||||
|
||||
if s == syscall.SIGHUP {
|
||||
models.CloseDBs()
|
||||
models.Setup(setting.App.GeodbPath.City, setting.App.GeodbPath.ASN)
|
||||
router.SetupTemplate(engine)
|
||||
|
||||
if setting.App.BindAddress != "" {
|
||||
if err := tcpServer.Shutdown(ctx); err != nil {
|
||||
log.Printf("TCP server forced to shutdown: %s", err)
|
||||
}
|
||||
runTCPServer()
|
||||
}
|
||||
if setting.App.TLSAddress != "" {
|
||||
if setting.App.EnableHTTP3 {
|
||||
if err := h3Server.Close(); err != nil {
|
||||
log.Printf("QUIC server forced to shutdown")
|
||||
}
|
||||
}
|
||||
|
||||
if err := tlsServer.Shutdown(ctx); err != nil {
|
||||
log.Printf("TLS server forced to shutdown: %s", err)
|
||||
}
|
||||
runTLSServer()
|
||||
|
||||
if setting.App.EnableHTTP3 {
|
||||
runQuicServer()
|
||||
}
|
||||
}
|
||||
} else {
|
||||
log.Printf("Shutting down...")
|
||||
if setting.App.BindAddress != "" {
|
||||
if err := tcpServer.Shutdown(ctx); err != nil {
|
||||
log.Printf("TCP server forced to shutdown: %s", err)
|
||||
}
|
||||
}
|
||||
if setting.App.TLSAddress != "" {
|
||||
if setting.App.EnableHTTP3 {
|
||||
if err := h3Server.Close(); err != nil {
|
||||
log.Printf("QUIC server forced to shutdown: %s", err)
|
||||
}
|
||||
}
|
||||
if err := tlsServer.Shutdown(ctx); err != nil {
|
||||
log.Printf("TLS server forced to shutdown: %s", err)
|
||||
}
|
||||
}
|
||||
models.CloseDBs()
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func runTCPServer() {
|
||||
tcpServer = &http.Server{
|
||||
Addr: setting.App.BindAddress,
|
||||
Handler: engine,
|
||||
ReadTimeout: setting.App.Server.ReadTimeout,
|
||||
WriteTimeout: setting.App.Server.WriteTimeout,
|
||||
}
|
||||
|
||||
go func() {
|
||||
log.Printf("Starting TCP server listening on %s", setting.App.BindAddress)
|
||||
if err := tcpServer.ListenAndServe(); err != nil && !errors.Is(err, http.ErrServerClosed) {
|
||||
log.Fatal(err)
|
||||
}
|
||||
log.Printf("Stopping TCP server...")
|
||||
}()
|
||||
}
|
||||
|
||||
func runTLSServer() {
|
||||
tlsServer = &http.Server{
|
||||
Addr: setting.App.TLSAddress,
|
||||
Handler: engine,
|
||||
ReadTimeout: setting.App.Server.ReadTimeout,
|
||||
WriteTimeout: setting.App.Server.WriteTimeout,
|
||||
}
|
||||
|
||||
go func() {
|
||||
log.Printf("Starting TLS server listening on %s", setting.App.TLSAddress)
|
||||
if err := tlsServer.ListenAndServeTLS(setting.App.TLSCrtPath, setting.App.TLSKeyPath); err != nil &&
|
||||
!errors.Is(err, http.ErrServerClosed) {
|
||||
log.Fatal(err)
|
||||
}
|
||||
log.Printf("Stopping TLS server...")
|
||||
}()
|
||||
}
|
||||
|
||||
func runQuicServer() {
|
||||
h3Server = &http3.Server{
|
||||
Addr: setting.App.TLSAddress,
|
||||
Handler: tlsServer.Handler,
|
||||
}
|
||||
|
||||
previousHandler := tlsServer.Handler
|
||||
tlsServer.Handler = http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) {
|
||||
if err := h3Server.SetQuicHeaders(rw.Header()); err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
previousHandler.ServeHTTP(rw, req)
|
||||
})
|
||||
|
||||
go func() {
|
||||
log.Printf("Starting QUIC server listening on %s (udp)", setting.App.TLSAddress)
|
||||
if err := h3Server.ListenAndServeTLS(setting.App.TLSCrtPath, setting.App.TLSKeyPath); err != nil &&
|
||||
err.Error() != "quic: Server closed" {
|
||||
log.Fatal(err)
|
||||
}
|
||||
log.Printf("Stopping QUIC server...")
|
||||
}()
|
||||
}
|
||||
|
||||
func setupEngine() {
|
||||
func setupEngine() *gin.Engine {
|
||||
gin.DisableConsoleColor()
|
||||
if os.Getenv(gin.EnvGinMode) == "" {
|
||||
gin.SetMode(gin.ReleaseMode)
|
||||
}
|
||||
engine = gin.New()
|
||||
engine := gin.New()
|
||||
engine.Use(gin.LoggerWithFormatter(httputils.GetLogFormatter))
|
||||
engine.Use(gin.Recovery())
|
||||
if setting.App.EnableSecureHeaders {
|
||||
@ -193,4 +52,6 @@ func setupEngine() {
|
||||
}
|
||||
_ = engine.SetTrustedProxies(nil)
|
||||
engine.TrustedPlatform = setting.App.TrustedHeader
|
||||
|
||||
return engine
|
||||
}
|
||||
|
Reference in New Issue
Block a user