// WrapListener wraps an arbitrary net.Listener for use with graceful shutdowns. // In the background, it uses the listener sub-package to Wrap the listener in // Deadline mode. If another mode of operation is desired, you should call // listener.Wrap yourself: this function is smart enough to not double-wrap // listeners. func WrapListener(l net.Listener) net.Listener { if lt, ok := l.(*listener.T); ok { appendListener(lt) return lt } lt := listener.Wrap(l, listener.Deadline) appendListener(lt) return lt }
// Serve behaves like the method on net/http.Server with the same name. func (srv *Server) Serve(l net.Listener) error { // Spawn a shadow http.Server to do the actual servering. We do this // because we need to sketch on some of the parameters you passed in, // and it's nice to keep our sketching to ourselves. shadow := *(*http.Server)(srv) shadow.ConnState = connState(shadow.ConnState).Wrap l = gracefulServer{l, &shadow} wrap := listener.Wrap(l, listener.Automatic) appendListener(wrap) err := shadow.Serve(wrap) return peacefulError(err) }
// Serve behaves like the method on net/http.Server with the same name. func (srv *Server) Serve(l net.Listener) error { // Spawn a shadow http.Server to do the actual servering. We do this // because we need to sketch on some of the parameters you passed in, // and it's nice to keep our sketching to ourselves. shadow := *(*http.Server)(srv) if shadow.ReadTimeout == 0 { shadow.ReadTimeout = forever } shadow.Handler = middleware(shadow.Handler) wrap := listener.Wrap(l, listener.Deadline) appendListener(wrap) err := shadow.Serve(wrap) return peacefulError(err) }