server.go 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. package htp
  2. import (
  3. "context"
  4. "fmt"
  5. "net/http"
  6. "time"
  7. "github.com/gin-contrib/cors"
  8. "github.com/gin-gonic/gin"
  9. )
  10. /**
  11. GinServer is used for simplifies the usage of gin package.
  12. Example:
  13. see test file
  14. */
  15. type FnSetupRoutes func(*gin.Engine)
  16. // GinServer option type
  17. type GinServerOptions func(*GinServer)
  18. type GinServer struct {
  19. cors bool
  20. debug bool
  21. running bool
  22. addr string
  23. name string // sometime we need a name for the server
  24. server *http.Server
  25. }
  26. func GinServerWithDebug(enabled bool) GinServerOptions {
  27. return func(s *GinServer) {
  28. s.debug = enabled
  29. }
  30. }
  31. func GinServerWithCors(enabled bool) GinServerOptions {
  32. return func(s *GinServer) {
  33. s.cors = enabled
  34. }
  35. }
  36. func GinServerWithName(name string) GinServerOptions {
  37. return func(s *GinServer) {
  38. s.name = name
  39. }
  40. }
  41. func NewGinServer(addr string, opts ...GinServerOptions) *GinServer {
  42. s := &GinServer{
  43. debug: false,
  44. running: false,
  45. addr: addr,
  46. }
  47. for _, opt := range opts {
  48. opt(s)
  49. }
  50. return s
  51. }
  52. func (self *GinServer) Start(fnSetup FnSetupRoutes) error {
  53. // running mode
  54. if self.debug {
  55. gin.SetMode(gin.DebugMode)
  56. } else {
  57. gin.SetMode(gin.ReleaseMode)
  58. }
  59. r := gin.Default()
  60. // cors
  61. if self.cors {
  62. r.Use(cors.Default())
  63. }
  64. // setup routers
  65. if fnSetup != nil {
  66. fnSetup(r)
  67. }
  68. // boot service
  69. self.server = &http.Server{
  70. Addr: self.addr,
  71. Handler: r,
  72. }
  73. go func() {
  74. if err := self.server.ListenAndServe(); err != nil && err != http.ErrServerClosed {
  75. panic(err)
  76. }
  77. }()
  78. return nil
  79. }
  80. func (self *GinServer) Stop() error {
  81. ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
  82. defer cancel()
  83. if err := self.server.Shutdown(ctx); err != nil {
  84. return err
  85. }
  86. select {
  87. case <-ctx.Done():
  88. fmt.Println(self.name + " timeout and quit")
  89. }
  90. return nil
  91. }