|
6 | 6 | "net/http"
|
7 | 7 | "os"
|
8 | 8 | "os/signal"
|
| 9 | + "sync" |
9 | 10 | "syscall"
|
10 | 11 | "time"
|
11 | 12 |
|
@@ -41,42 +42,62 @@ the address is defined in config file`,
|
41 | 42 | r := gin.New()
|
42 | 43 | r.Use(gin.LoggerWithWriter(log.StandardLogger().Out), gin.RecoveryWithWriter(log.StandardLogger().Out))
|
43 | 44 | server.Init(r)
|
44 |
| - base := fmt.Sprintf("%s:%d", conf.Conf.Address, conf.Conf.Port) |
45 |
| - utils.Log.Infof("start server @ %s", base) |
46 |
| - srv := &http.Server{Addr: base, Handler: r} |
47 |
| - go func() { |
48 |
| - var err error |
49 |
| - if conf.Conf.Scheme.Https { |
50 |
| - //err = r.RunTLS(base, conf.Conf.Scheme.CertFile, conf.Conf.Scheme.KeyFile) |
51 |
| - err = srv.ListenAndServeTLS(conf.Conf.Scheme.CertFile, conf.Conf.Scheme.KeyFile) |
52 |
| - } else { |
53 |
| - err = srv.ListenAndServe() |
54 |
| - } |
55 |
| - if err != nil && err != http.ErrServerClosed { |
56 |
| - utils.Log.Fatalf("failed to start: %s", err.Error()) |
57 |
| - } |
58 |
| - }() |
| 45 | + var httpSrv, httpsSrv *http.Server |
| 46 | + if !conf.Conf.Scheme.DisableHttp { |
| 47 | + httpBase := fmt.Sprintf("%s:%d", conf.Conf.Address, conf.Conf.Port) |
| 48 | + utils.Log.Infof("start HTTP server @ %s", httpBase) |
| 49 | + httpSrv = &http.Server{Addr: httpBase, Handler: r} |
| 50 | + go func() { |
| 51 | + err := httpSrv.ListenAndServe() |
| 52 | + if err != nil && err != http.ErrServerClosed { |
| 53 | + utils.Log.Fatalf("failed to start: %s", err.Error()) |
| 54 | + } |
| 55 | + }() |
| 56 | + } |
| 57 | + if conf.Conf.Scheme.Https { |
| 58 | + httpsBase := fmt.Sprintf("%s:%d", conf.Conf.Address, conf.Conf.HttpsPort) |
| 59 | + utils.Log.Infof("start HTTPS server @ %s", httpsBase) |
| 60 | + httpsSrv = &http.Server{Addr: httpsBase, Handler: r} |
| 61 | + go func() { |
| 62 | + err := httpsSrv.ListenAndServeTLS(conf.Conf.Scheme.CertFile, conf.Conf.Scheme.KeyFile) |
| 63 | + if err != nil && err != http.ErrServerClosed { |
| 64 | + utils.Log.Fatalf("failed to start: %s", err.Error()) |
| 65 | + } |
| 66 | + }() |
| 67 | + } |
59 | 68 | // Wait for interrupt signal to gracefully shutdown the server with
|
60 |
| - // a timeout of 5 seconds. |
61 |
| - quit := make(chan os.Signal) |
| 69 | + // a timeout of 1 second. |
| 70 | + quit := make(chan os.Signal, 1) |
62 | 71 | // kill (no param) default send syscanll.SIGTERM
|
63 | 72 | // kill -2 is syscall.SIGINT
|
64 | 73 | // kill -9 is syscall. SIGKILL but can"t be catch, so don't need add it
|
65 | 74 | signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
|
66 | 75 | <-quit
|
67 |
| - utils.Log.Println("Shutdown Server ...") |
| 76 | + utils.Log.Println("Shutdown server...") |
68 | 77 |
|
69 | 78 | ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second)
|
70 | 79 | defer cancel()
|
71 |
| - if err := srv.Shutdown(ctx); err != nil { |
72 |
| - utils.Log.Fatal("Server Shutdown:", err) |
| 80 | + var wg sync.WaitGroup |
| 81 | + if !conf.Conf.Scheme.DisableHttp { |
| 82 | + wg.Add(1) |
| 83 | + go func() { |
| 84 | + defer wg.Done() |
| 85 | + if err := httpSrv.Shutdown(ctx); err != nil { |
| 86 | + utils.Log.Fatal("HTTP server shutdown:", err) |
| 87 | + } |
| 88 | + }() |
73 | 89 | }
|
74 |
| - // catching ctx.Done(). timeout of 3 seconds. |
75 |
| - select { |
76 |
| - case <-ctx.Done(): |
77 |
| - utils.Log.Println("timeout of 1 seconds.") |
| 90 | + if conf.Conf.Scheme.Https { |
| 91 | + wg.Add(1) |
| 92 | + go func() { |
| 93 | + defer wg.Done() |
| 94 | + if err := httpsSrv.Shutdown(ctx); err != nil { |
| 95 | + utils.Log.Fatal("HTTPS server shutdown:", err) |
| 96 | + } |
| 97 | + }() |
78 | 98 | }
|
79 |
| - utils.Log.Println("Server exiting") |
| 99 | + wg.Wait() |
| 100 | + utils.Log.Println("Server exit") |
80 | 101 | },
|
81 | 102 | }
|
82 | 103 |
|
|
0 commit comments