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  }