http.go 973 B

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