From c4f290b389a17566e313229bbb5e1ca10320a223 Mon Sep 17 00:00:00 2001 From: lbenedar Date: Thu, 19 Mar 2026 15:32:03 +0300 Subject: [PATCH] ch12.3 --- cmd/api/main.go | 19 +++---------------- cmd/api/server.go | 42 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+), 16 deletions(-) create mode 100644 cmd/api/server.go diff --git a/cmd/api/main.go b/cmd/api/main.go index bccab22..eb1e248 100644 --- a/cmd/api/main.go +++ b/cmd/api/main.go @@ -4,9 +4,6 @@ import ( "context" "database/sql" "flag" - "fmt" - "log" - "net/http" "os" "time" @@ -97,18 +94,8 @@ func main() { models: data.NewModels(db), } - srv := &http.Server{ - Addr: fmt.Sprintf(":%d", app.config.port), - Handler: app.routes(), - ErrorLog: log.New(logger, "", 0), - IdleTimeout: time.Minute, - ReadTimeout: 10 * time.Second, - WriteTimeout: 10 * time.Second, + err = app.serve() + if err != nil { + logger.PrintFatal(err, nil) } - logger.PrintInfo("starting server", map[string]string{ - "addr": srv.Addr, - "env": cfg.env, - }) - err = srv.ListenAndServe() - logger.PrintFatal(err, nil) } diff --git a/cmd/api/server.go b/cmd/api/server.go new file mode 100644 index 0000000..d2c3b92 --- /dev/null +++ b/cmd/api/server.go @@ -0,0 +1,42 @@ +package main + +import ( + "fmt" + "log" + "net/http" + "os" + "os/signal" + "syscall" + "time" +) + +func (app *application) serve() error { + srv := &http.Server{ + Addr: fmt.Sprintf(":%d", app.config.port), + Handler: app.routes(), + ErrorLog: log.New(app.logger, "", 0), + IdleTimeout: time.Minute, + ReadTimeout: 10 * time.Second, + WriteTimeout: 10 * time.Second, + } + + go func() { + quit := make(chan os.Signal, 1) + + signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM) + + s := <-quit + + app.logger.PrintInfo("caught signal", map[string]string{ + "signal": s.String(), + }) + + os.Exit(0) + }() + + app.logger.PrintInfo("starting server", map[string]string{ + "addr": srv.Addr, + "env": app.config.env, + }) + return srv.ListenAndServe() +}