http.go 1013 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. package dashboard
  2. import (
  3. "io"
  4. "net"
  5. "net/http"
  6. "time"
  7. )
  8. // ListenAndServeWithClose is a non-blocking listen and serve returning a closer
  9. func ListenAndServeWithClose(addr string, handler http.Handler) (io.Closer, error) {
  10. var (
  11. listener net.Listener
  12. srvCloser io.Closer
  13. err error
  14. )
  15. srv := &http.Server{Addr: addr, Handler: handler}
  16. if addr == "" {
  17. addr = ":http"
  18. }
  19. listener, err = net.Listen("tcp", addr)
  20. if err != nil {
  21. return nil, err
  22. }
  23. go func() {
  24. err := srv.Serve(tcpKeepAliveListener{listener.(*net.TCPListener)})
  25. if err != nil {
  26. mainlog().Error("HTTP Server Error - ", err)
  27. }
  28. }()
  29. srvCloser = listener
  30. return srvCloser, nil
  31. }
  32. type tcpKeepAliveListener struct {
  33. *net.TCPListener
  34. }
  35. func (ln tcpKeepAliveListener) Accept() (c net.Conn, err error) {
  36. tc, err := ln.AcceptTCP()
  37. if err != nil {
  38. return
  39. }
  40. if err = tc.SetKeepAlive(true); err != nil {
  41. return
  42. }
  43. if err = tc.SetKeepAlivePeriod(3 * time.Minute); err != nil {
  44. return
  45. }
  46. return tc, nil
  47. }