client: set hard limit on redirect checks
parent
50a9b2d9c8
commit
b41d6bc416
|
@ -30,6 +30,7 @@ import (
|
||||||
var (
|
var (
|
||||||
ErrNoEndpoints = errors.New("client: no endpoints available")
|
ErrNoEndpoints = errors.New("client: no endpoints available")
|
||||||
ErrTooManyRedirects = errors.New("client: too many redirects")
|
ErrTooManyRedirects = errors.New("client: too many redirects")
|
||||||
|
errTooManyRedirectChecks = errors.New("client: too many redirect checks")
|
||||||
)
|
)
|
||||||
|
|
||||||
var DefaultRequestTimeout = 5 * time.Second
|
var DefaultRequestTimeout = 5 * time.Second
|
||||||
|
@ -297,7 +298,7 @@ type redirectFollowingHTTPClient struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *redirectFollowingHTTPClient) Do(ctx context.Context, act httpAction) (*http.Response, []byte, error) {
|
func (r *redirectFollowingHTTPClient) Do(ctx context.Context, act httpAction) (*http.Response, []byte, error) {
|
||||||
for i := 0; ; i++ {
|
for i := 0; i < 100; i++ {
|
||||||
if i > 0 {
|
if i > 0 {
|
||||||
if err := r.checkRedirect(i); err != nil {
|
if err := r.checkRedirect(i); err != nil {
|
||||||
return nil, nil, err
|
return nil, nil, err
|
||||||
|
@ -324,6 +325,8 @@ func (r *redirectFollowingHTTPClient) Do(ctx context.Context, act httpAction) (*
|
||||||
}
|
}
|
||||||
return resp, body, nil
|
return resp, body, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return nil, nil, errTooManyRedirectChecks
|
||||||
}
|
}
|
||||||
|
|
||||||
type redirectedHTTPAction struct {
|
type redirectedHTTPAction struct {
|
||||||
|
|
|
@ -522,6 +522,18 @@ func TestRedirectFollowingHTTPClient(t *testing.T) {
|
||||||
},
|
},
|
||||||
wantErr: errors.New("Location header not valid URL: :"),
|
wantErr: errors.New("Location header not valid URL: :"),
|
||||||
},
|
},
|
||||||
|
|
||||||
|
// fail if redirects checked way too many times
|
||||||
|
{
|
||||||
|
checkRedirect: func(int) error { return nil },
|
||||||
|
client: &staticHTTPClient{
|
||||||
|
resp: http.Response{
|
||||||
|
StatusCode: http.StatusTemporaryRedirect,
|
||||||
|
Header: http.Header{"Location": []string{"http://example.com"}},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
wantErr: errTooManyRedirectChecks,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
for i, tt := range tests {
|
for i, tt := range tests {
|
||||||
|
|
Loading…
Reference in New Issue