serve.go 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. package myth
  2. import (
  3. "fmt"
  4. "log"
  5. "net/http"
  6. "os"
  7. "os/signal"
  8. "syscall"
  9. "time"
  10. "golang.org/x/net/http2"
  11. )
  12. const (
  13. megaByte = 1 << 20 // 1 mb , 2 mb 1 << 21, 4mb 1 << 22, 8mb 1 << 23
  14. gigaByte = 1 << 30
  15. )
  16. var (
  17. readTimeout = 30 * time.Second
  18. writeTimeout = 30 * time.Second
  19. )
  20. func newServe(addr string, router http.Handler) *http.Server {
  21. return &http.Server{
  22. Addr: addr,
  23. Handler: router,
  24. ReadTimeout: readTimeout,
  25. WriteTimeout: writeTimeout,
  26. MaxHeaderBytes: megaByte,
  27. }
  28. }
  29. func run(useV2 bool, addr, certFile, keyFile string, router http.Handler) {
  30. s := newServe(addr, router)
  31. if useV2 {
  32. http2.VerboseLogs = false
  33. http2.ConfigureServer(s, nil)
  34. }
  35. errc := make(chan error)
  36. go func() {
  37. c := make(chan os.Signal)
  38. signal.Notify(c, syscall.SIGINT, syscall.SIGTERM)
  39. errc <- fmt.Errorf("%s", <-c)
  40. }()
  41. go func() {
  42. log.Println("HTTP Server listen on", addr)
  43. if len(certFile) > 0 && len(keyFile) > 0 {
  44. errc <- s.ListenAndServeTLS(certFile, keyFile)
  45. } else {
  46. errc <- s.ListenAndServe()
  47. }
  48. log.Println("Exit HTTP server", "Quit")
  49. }()
  50. log.Println("Exit", <-errc)
  51. }
  52. // ListenAndServe new server and start
  53. func ListenAndServe(addr string, router http.Handler) {
  54. run(false, addr, ``, ``, router)
  55. }
  56. // ListenAndServeTLS new server and start
  57. func ListenAndServeTLS(addr, certFile, keyFile string, router http.Handler) {
  58. run(false, addr, certFile, keyFile, router)
  59. }
  60. // ListenAndServeV2 new http2 server and start
  61. func ListenAndServeV2(addr string, router http.Handler) {
  62. run(true, addr, ``, ``, router)
  63. }
  64. // ListenAndServeTLSV2 new http2 server and start
  65. func ListenAndServeTLSV2(addr, certFile, keyFile string, router http.Handler) {
  66. run(true, addr, certFile, keyFile, router)
  67. }