starter.go 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  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. func StartHttp(host string, port int, handler http.Handler) error {
  10. addr := fmt.Sprintf("%s:%d", host, port)
  11. server := buildHttpServer(addr, handler)
  12. return start(server, func(srv *http.Server) error {
  13. return srv.ListenAndServe()
  14. })
  15. }
  16. func StartHttps(host string, port int, certFile, keyFile string, handler http.Handler) error {
  17. addr := fmt.Sprintf("%s:%d", host, port)
  18. server, err := buildHttpsServer(addr, handler, certFile, keyFile)
  19. if err != nil {
  20. return err
  21. }
  22. return start(server, func(srv *http.Server) error {
  23. // certFile and keyFile are set in buildHttpsServer
  24. return srv.ListenAndServeTLS("", "")
  25. })
  26. }
  27. func buildHttpServer(addr string, handler http.Handler) *http.Server {
  28. return &http.Server{Addr: addr, Handler: handler}
  29. }
  30. func buildHttpsServer(addr string, handler http.Handler, certFile, keyFile string) (*http.Server, error) {
  31. cert, err := tls.LoadX509KeyPair(certFile, keyFile)
  32. if err != nil {
  33. return nil, err
  34. }
  35. config := tls.Config{Certificates: []tls.Certificate{cert}}
  36. return &http.Server{
  37. Addr: addr,
  38. Handler: handler,
  39. TLSConfig: &config,
  40. }, nil
  41. }
  42. func start(server *http.Server, run func(srv *http.Server) error) error {
  43. waitForCalled := proc.AddWrapUpListener(func() {
  44. server.Shutdown(context.Background())
  45. })
  46. defer waitForCalled()
  47. return run(server)
  48. }