diff options
Diffstat (limited to 'util/gin.go')
-rw-r--r-- | util/gin.go | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/util/gin.go b/util/gin.go new file mode 100644 index 0000000..9bba6ee --- /dev/null +++ b/util/gin.go | |||
@@ -0,0 +1,72 @@ | |||
1 | package util | ||
2 | |||
3 | import ( | ||
4 | "context" | ||
5 | "log" | ||
6 | "net" | ||
7 | "net/http" | ||
8 | "os" | ||
9 | "os/signal" | ||
10 | |||
11 | "github.com/gin-gonic/gin" | ||
12 | ) | ||
13 | |||
14 | // Copied from: https://github.com/gin-gonic/gin/blob/59ab588bf597f9f41faee4f217b5659893c2e925/utils.go#L137 | ||
15 | func resolveAddress(addr []string) string { | ||
16 | switch len(addr) { | ||
17 | case 0: | ||
18 | if port := os.Getenv("PORT"); port != "" { | ||
19 | log.Printf("Environment variable PORT=\"%s\"", port) | ||
20 | return ":" + port | ||
21 | } | ||
22 | log.Printf("Environment variable PORT is undefined. Using port :8080 by default") | ||
23 | return ":8080" | ||
24 | case 1: | ||
25 | return addr[0] | ||
26 | default: | ||
27 | panic("too many parameters") | ||
28 | } | ||
29 | } | ||
30 | |||
31 | // Runs a gin.Engine instance in a way that can be canceled by an SIGINT | ||
32 | func GinRun(e *gin.Engine, debug bool, a ...string) { | ||
33 | if debug { | ||
34 | gin.SetMode(gin.DebugMode) | ||
35 | } else { | ||
36 | gin.SetMode(gin.ReleaseMode) | ||
37 | } | ||
38 | |||
39 | srv := &http.Server{ | ||
40 | Addr: resolveAddress(a), | ||
41 | Handler: e, | ||
42 | } | ||
43 | |||
44 | idleConnsClosed := make(chan struct{}) | ||
45 | |||
46 | go func() { | ||
47 | sigint := make(chan os.Signal, 1) | ||
48 | signal.Notify(sigint, os.Interrupt) | ||
49 | <-sigint | ||
50 | |||
51 | log.Println("Caught SIGINT, shutting down") | ||
52 | if err := srv.Shutdown(context.Background()); err != nil { | ||
53 | log.Printf("HTTP server Shutdown: %v", err) | ||
54 | } | ||
55 | |||
56 | close(idleConnsClosed) | ||
57 | }() | ||
58 | |||
59 | log.Printf("Listening and serving HTTP on %s\n", srv.Addr) | ||
60 | if err := srv.ListenAndServe(); err != http.ErrServerClosed { | ||
61 | log.Fatalf("HTTP server ListenAndServe: %v", err) | ||
62 | } | ||
63 | |||
64 | <-idleConnsClosed | ||
65 | } | ||
66 | |||
67 | func GetRequestIP(c *gin.Context) net.IP { | ||
68 | if xff := c.Request.Header.Get("X-Forwarded-For"); xff != "" { | ||
69 | return ParseIP(xff) | ||
70 | } | ||
71 | return ParseIP(c.Request.RemoteAddr) | ||
72 | } | ||