|
| 1 | +package main |
| 2 | + |
| 3 | +import ( |
| 4 | + "flag" |
| 5 | + "fmt" |
| 6 | + "log" |
| 7 | + "net/http" |
| 8 | + "time" |
| 9 | + |
| 10 | + "github.com/gorilla/handlers" |
| 11 | + "github.com/gorilla/mux" |
| 12 | +) |
| 13 | + |
| 14 | +var ( |
| 15 | + logger *Logger |
| 16 | + isDebug bool |
| 17 | + enablePrintRecovery bool |
| 18 | + address string |
| 19 | + timeout int |
| 20 | +) |
| 21 | + |
| 22 | +const ( |
| 23 | + isDebugDefault = false |
| 24 | + isDebugUsage = "Enable debug mode" |
| 25 | + enablePrintRecoveryStackDefault = false |
| 26 | + enablePrintRecoveryUsage = "Used to print all stack traces when panic happened" |
| 27 | + addressDefault = "127.0.0.1:8080" |
| 28 | + addressUsage = "Setup your running ip & port" |
| 29 | + timeoutDefault = 15 |
| 30 | + timeoutUsage = "Set your write and timeout limit" |
| 31 | +) |
| 32 | + |
| 33 | +func init() { |
| 34 | + flag.StringVar(&address, "address", addressDefault, addressUsage) |
| 35 | + flag.BoolVar(&isDebug, "debug", isDebugDefault, isDebugUsage) |
| 36 | + flag.BoolVar(&enablePrintRecovery, "enablePrintStack", enablePrintRecoveryStackDefault, enablePrintRecoveryUsage) |
| 37 | + flag.IntVar(&timeout, "timeout", timeoutDefault, timeoutUsage) |
| 38 | + flag.Parse() |
| 39 | + |
| 40 | + logger = logBuilder(isDebug) |
| 41 | + logger.Debug(fmt.Sprintf("Enable Print Recovery? %t", enablePrintRecovery)) |
| 42 | + logger.Debug(fmt.Sprintf("Timeout: %v", timeout)) |
| 43 | + logger.Info(fmt.Sprintf("Address: %v", address)) |
| 44 | +} |
| 45 | + |
| 46 | +func main() { |
| 47 | + r := mux.NewRouter() |
| 48 | + |
| 49 | + // register routes and their controllers |
| 50 | + routers := RegisterRoutes(r) |
| 51 | + |
| 52 | + // register middlewares |
| 53 | + routers.Use(AccessLogMiddleware) |
| 54 | + routers.Use(ContentNegotiatorMiddleware) |
| 55 | + routers.Use(handlers.RecoveryHandler(handlers.PrintRecoveryStack(enablePrintRecovery))) |
| 56 | + |
| 57 | + srv := &http.Server{ |
| 58 | + Handler: routers, |
| 59 | + Addr: address, |
| 60 | + WriteTimeout: time.Duration(timeout) * time.Second, |
| 61 | + ReadTimeout: time.Duration(timeout) * time.Second, |
| 62 | + } |
| 63 | + |
| 64 | + log.Fatal(srv.ListenAndServe()) |
| 65 | +} |
0 commit comments