github.com/nsqio/nsq@v1.3.0/internal/http_api/http_server.go (about)

     1  package http_api
     2  
     3  import (
     4  	"fmt"
     5  	"log"
     6  	"net"
     7  	"net/http"
     8  	"strings"
     9  
    10  	"github.com/nsqio/nsq/internal/lg"
    11  )
    12  
    13  type logWriter struct {
    14  	logf lg.AppLogFunc
    15  }
    16  
    17  func (l logWriter) Write(p []byte) (int, error) {
    18  	l.logf(lg.WARN, "%s", string(p))
    19  	return len(p), nil
    20  }
    21  
    22  func Serve(listener net.Listener, handler http.Handler, proto string, logf lg.AppLogFunc) error {
    23  	logf(lg.INFO, "%s: listening on %s", proto, listener.Addr())
    24  
    25  	server := &http.Server{
    26  		Handler:  handler,
    27  		ErrorLog: log.New(logWriter{logf}, "", 0),
    28  	}
    29  	err := server.Serve(listener)
    30  	// theres no direct way to detect this error because it is not exposed
    31  	if err != nil && !strings.Contains(err.Error(), "use of closed network connection") {
    32  		return fmt.Errorf("http.Serve() error - %s", err)
    33  	}
    34  
    35  	logf(lg.INFO, "%s: closing %s", proto, listener.Addr())
    36  
    37  	return nil
    38  }