github.com/rudderlabs/rudder-go-kit@v0.30.0/httputil/server.go (about) 1 package httputil 2 3 import ( 4 "context" 5 "net" 6 "net/http" 7 "time" 8 ) 9 10 func ListenAndServe(ctx context.Context, server *http.Server, shutdownTimeout ...time.Duration) error { 11 return gracefulFunc(ctx, server, server.ListenAndServe, shutdownTimeout...) 12 } 13 14 func Serve(ctx context.Context, server *http.Server, l net.Listener, shutdownTimeout ...time.Duration) error { 15 fn := func() error { 16 return server.Serve(l) 17 } 18 return gracefulFunc(ctx, server, fn, shutdownTimeout...) 19 } 20 21 func gracefulFunc(ctx context.Context, server *http.Server, fn func() error, shutdownTimeout ...time.Duration) error { 22 errCh := make(chan error, 1) 23 go func() { 24 errCh <- fn() 25 }() 26 select { 27 case err := <-errCh: 28 return err 29 case <-ctx.Done(): 30 switch { 31 case len(shutdownTimeout) == 0: 32 return server.Shutdown(context.Background()) 33 case shutdownTimeout[0] == 0: 34 return server.Close() 35 default: 36 ctx, cancel := context.WithTimeout(context.Background(), shutdownTimeout[0]) 37 defer cancel() 38 39 return server.Shutdown(ctx) 40 } 41 } 42 }