server.go 453 Bytes
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
package httputil

import (
	"context"
	"fmt"
	"net/http"
	"time"
)

func ListenAndServeContext(ctx context.Context, server *http.Server) error {
	errCh := make(chan error)
	go func() {
		errCh <- server.ListenAndServe()
	}()

	// verify that the server comes up
	tick := time.NewTimer(10 * time.Millisecond)
	select {
	case err := <-errCh:
		return fmt.Errorf("http server failed: %w", err)
	case <-tick.C:
		break
	}

	<-ctx.Done()
	return ctx.Err()
}