diff --git a/client/http.go b/client/http.go index b6ab415e1..7dfecc8c2 100644 --- a/client/http.go +++ b/client/http.go @@ -30,6 +30,7 @@ import ( var ( ErrTimeout = context.DeadlineExceeded ErrCanceled = context.Canceled + ErrNoEndpoints = errors.New("no endpoints available") ErrTooManyRedirects = errors.New("too many redirects") DefaultRequestTimeout = 5 * time.Second @@ -91,6 +92,9 @@ type httpClusterClient struct { } func (c *httpClusterClient) Do(ctx context.Context, act HTTPAction) (resp *http.Response, body []byte, err error) { + if len(c.endpoints) == 0 { + return nil, nil, ErrNoEndpoints + } for _, hc := range c.endpoints { resp, body, err = hc.Do(ctx, act) if err != nil { @@ -118,6 +122,9 @@ func (c *httpClusterClient) Sync(ctx context.Context) error { for _, m := range ms { eps = append(eps, m.ClientURLs...) } + if len(eps) == 0 { + return ErrNoEndpoints + } nc, err := newHTTPClusterClient(c.transport, eps) if err != nil { return err diff --git a/client/http_test.go b/client/http_test.go index 7a8beedb1..c3cc1c9d5 100644 --- a/client/http_test.go +++ b/client/http_test.go @@ -234,6 +234,14 @@ func TestHTTPClusterClientDo(t *testing.T) { wantErr: ErrCanceled, }, + // return err if there are no endpoints + { + client: &httpClusterClient{ + endpoints: []HTTPClient{}, + }, + wantErr: ErrNoEndpoints, + }, + // return err if all endpoints return arbitrary errors { client: &httpClusterClient{