starter.go 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. package internal
  2. import (
  3. "context"
  4. "crypto/tls"
  5. "fmt"
  6. "net/http"
  7. "github.com/tal-tech/go-zero/core/proc"
  8. )
  9. // StartHttp starts a http server.
  10. func StartHttp(host string, port int, handler http.Handler) error {
  11. return start(host, port, handler, nil, func(srv *http.Server) error {
  12. return srv.ListenAndServe()
  13. })
  14. }
  15. // StartHttps starts a https server.
  16. func StartHttps(host string, port int, certFile, keyFile string, tlsConfig *tls.Config, handler http.Handler) error {
  17. return start(host, port, handler, tlsConfig, func(srv *http.Server) error {
  18. // certFile and keyFile are set in buildHttpsServer
  19. return srv.ListenAndServeTLS(certFile, keyFile)
  20. })
  21. }
  22. func start(host string, port int, handler http.Handler, tlsConfig *tls.Config, run func(srv *http.Server) error) (err error) {
  23. server := &http.Server{
  24. Addr: fmt.Sprintf("%s:%d", host, port),
  25. Handler: handler,
  26. }
  27. if tlsConfig != nil {
  28. server.TLSConfig = tlsConfig
  29. }
  30. waitForCalled := proc.AddWrapUpListener(func() {
  31. server.Shutdown(context.Background())
  32. })
  33. defer func() {
  34. if err == http.ErrServerClosed {
  35. waitForCalled()
  36. }
  37. }()
  38. return run(server)
  39. }