diff --git a/CHANGELOG.md b/CHANGELOG.md index a0bb56000..1b6679da4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,11 @@ This release is built with go 1.16.4, which contains a [bugfix](https://github.com/golang/go/issues/45712) that can cause an untrusted target to make Blackbox Exporter crash. +In the HTTP probe, `no_follow_redirect` has been changed to `follow_redirect`. +This release accepts both, with a precedence to the `no_follow_redirect` parameter. +In the next release, `no_follow_redirect` will be removed. + +* [CHANGE] HTTP proble: no_follow_redirect has been renamed to follow_redirect. * [FEATURE] Add support for decompression of HTTP responses. #764 * [FEATURE] Enable TLS and basic authentication. #784 * [FEATURE] HTTP probe: *experimental* OAuth2 support. diff --git a/CONFIGURATION.md b/CONFIGURATION.md index 3928bb5f4..2d8358487 100644 --- a/CONFIGURATION.md +++ b/CONFIGURATION.md @@ -62,7 +62,7 @@ The other placeholders are specified separately. [ compression: | default = "" ] # Whether or not the probe will follow any redirects. - [ no_follow_redirects: | default = false ] + [ follow_redirects: | default = true ] # Probe fails if SSL is present. [ fail_if_ssl: | default = false ] diff --git a/config/config.go b/config/config.go index 178bda2d8..f562a54d7 100644 --- a/config/config.go +++ b/config/config.go @@ -57,6 +57,7 @@ var ( // DefaultHTTPProbe set default value for HTTPProbe DefaultHTTPProbe = HTTPProbe{ IPProtocolFallback: true, + HTTPClientConfig: config.DefaultHTTPClientConfig, } // DefaultTCPProbe set default value for TCPProbe @@ -181,7 +182,7 @@ type HTTPProbe struct { ValidHTTPVersions []string `yaml:"valid_http_versions,omitempty"` IPProtocol string `yaml:"preferred_ip_protocol,omitempty"` IPProtocolFallback bool `yaml:"ip_protocol_fallback,omitempty"` - NoFollowRedirects bool `yaml:"no_follow_redirects,omitempty"` + NoFollowRedirects *bool `yaml:"no_follow_redirects,omitempty"` FailIfSSL bool `yaml:"fail_if_ssl,omitempty"` FailIfNotSSL bool `yaml:"fail_if_not_ssl,omitempty"` Method string `yaml:"method,omitempty"` @@ -277,6 +278,10 @@ func (s *HTTPProbe) UnmarshalYAML(unmarshal func(interface{}) error) error { return err } + if s.NoFollowRedirects != nil { + s.HTTPClientConfig.FollowRedirects = !*s.NoFollowRedirects + } + for key, value := range s.Headers { switch strings.Title(key) { case "Accept-Encoding": diff --git a/prober/http.go b/prober/http.go index 39bb4d5b3..95c535353 100644 --- a/prober/http.go +++ b/prober/http.go @@ -373,7 +373,7 @@ func ProbeHTTP(ctx context.Context, target string, module config.Module, registr client.CheckRedirect = func(r *http.Request, via []*http.Request) error { level.Info(logger).Log("msg", "Received redirect", "location", r.Response.Header.Get("Location")) redirects = len(via) - if redirects > 10 || httpConfig.NoFollowRedirects { + if redirects > 10 || !httpConfig.HTTPClientConfig.FollowRedirects { level.Info(logger).Log("msg", "Not following redirect") return errors.New("don't follow redirects") } diff --git a/prober/http_test.go b/prober/http_test.go index be3803893..6679b3c02 100644 --- a/prober/http_test.go +++ b/prober/http_test.go @@ -526,7 +526,7 @@ func TestRedirectFollowed(t *testing.T) { registry := prometheus.NewRegistry() testCTX, cancel := context.WithTimeout(context.Background(), 10*time.Second) defer cancel() - result := ProbeHTTP(testCTX, ts.URL, config.Module{Timeout: time.Second, HTTP: config.HTTPProbe{IPProtocolFallback: true}}, registry, log.NewNopLogger()) + result := ProbeHTTP(testCTX, ts.URL, config.Module{Timeout: time.Second, HTTP: config.HTTPProbe{IPProtocolFallback: true, HTTPClientConfig: pconfig.DefaultHTTPClientConfig}}, registry, log.NewNopLogger()) body := recorder.Body.String() if !result { t.Fatalf("Redirect test failed unexpectedly, got %s", body) @@ -554,7 +554,7 @@ func TestRedirectNotFollowed(t *testing.T) { testCTX, cancel := context.WithTimeout(context.Background(), 10*time.Second) defer cancel() result := ProbeHTTP(testCTX, ts.URL, - config.Module{Timeout: time.Second, HTTP: config.HTTPProbe{IPProtocolFallback: true, NoFollowRedirects: true, ValidStatusCodes: []int{302}}}, registry, log.NewNopLogger()) + config.Module{Timeout: time.Second, HTTP: config.HTTPProbe{IPProtocolFallback: true, HTTPClientConfig: pconfig.HTTPClientConfig{FollowRedirects: false}, ValidStatusCodes: []int{302}}}, registry, log.NewNopLogger()) body := recorder.Body.String() if !result { t.Fatalf("Redirect test failed unexpectedly, got %s", body) @@ -601,7 +601,7 @@ func TestRedirectionLimit(t *testing.T) { result := ProbeHTTP( testCTX, ts.URL, - config.Module{Timeout: time.Second, HTTP: config.HTTPProbe{IPProtocolFallback: true}}, + config.Module{Timeout: time.Second, HTTP: config.HTTPProbe{IPProtocolFallback: true, HTTPClientConfig: pconfig.DefaultHTTPClientConfig}}, registry, log.NewNopLogger()) if result { @@ -1136,7 +1136,7 @@ func TestRedirectToTLSHostWorks(t *testing.T) { testCTX, cancel := context.WithTimeout(context.Background(), 10*time.Second) defer cancel() result := ProbeHTTP(testCTX, ts.URL, - config.Module{Timeout: time.Second, HTTP: config.HTTPProbe{IPProtocolFallback: true}}, registry, log.NewNopLogger()) + config.Module{Timeout: time.Second, HTTP: config.HTTPProbe{IPProtocolFallback: true, HTTPClientConfig: pconfig.DefaultHTTPClientConfig}}, registry, log.NewNopLogger()) if !result { t.Fatalf("Redirect test failed unexpectedly") } @@ -1209,7 +1209,7 @@ func TestCookieJar(t *testing.T) { registry := prometheus.NewRegistry() testCTX, cancel := context.WithTimeout(context.Background(), 10*time.Second) defer cancel() - result := ProbeHTTP(testCTX, ts.URL, config.Module{Timeout: time.Second, HTTP: config.HTTPProbe{IPProtocolFallback: true}}, registry, log.NewNopLogger()) + result := ProbeHTTP(testCTX, ts.URL, config.Module{Timeout: time.Second, HTTP: config.HTTPProbe{IPProtocolFallback: true, HTTPClientConfig: pconfig.DefaultHTTPClientConfig}}, registry, log.NewNopLogger()) body := recorder.Body.String() if !result { t.Fatalf("Redirect test failed unexpectedly, got %s", body)