123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657 |
- package dashboard
- import (
- "io"
- "net"
- "net/http"
- "time"
- )
- // ListenAndServeWithClose is a non-blocking listen and serve returning a closer
- func ListenAndServeWithClose(addr string, handler http.Handler) (io.Closer, error) {
- var (
- listener net.Listener
- srvCloser io.Closer
- err error
- )
- srv := &http.Server{Addr: addr, Handler: handler}
- if addr == "" {
- addr = ":http"
- }
- listener, err = net.Listen("tcp", addr)
- if err != nil {
- return nil, err
- }
- go func() {
- err := srv.Serve(tcpKeepAliveListener{listener.(*net.TCPListener)})
- if err != nil {
- mainlog().Error("HTTP Server Error - ", err)
- }
- }()
- srvCloser = listener
- return srvCloser, nil
- }
- type tcpKeepAliveListener struct {
- *net.TCPListener
- }
- func (ln tcpKeepAliveListener) Accept() (c net.Conn, err error) {
- tc, err := ln.AcceptTCP()
- if err != nil {
- return
- }
- if err = tc.SetKeepAlive(true); err != nil {
- return
- }
- if err = tc.SetKeepAlivePeriod(3 * time.Minute); err != nil {
- return
- }
- return tc, nil
- }
|