|
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