diff --git a/integration/fixtures/retry/strip_prefix.toml b/integration/fixtures/retry/strip_prefix.toml new file mode 100644 index 000000000..afd57f26e --- /dev/null +++ b/integration/fixtures/retry/strip_prefix.toml @@ -0,0 +1,40 @@ +[global] + checkNewVersion = false + sendAnonymousUsage = false + +[log] + level = "DEBUG" + +[entryPoints] + [entryPoints.web] + address = ":8000" + +[api] + insecure = true + +[providers.file] + filename = "{{ .SelfFilename }}" + +## dynamic configuration ## + +[http.routers] + [http.routers.router1] + service = "service1" + middlewares = [ "retry", "strip-prefix" ] + rule = "PathPrefix(`/`)" + +[http.middlewares.retry.retry] + attempts = 3 + +[http.middlewares.strip-prefix.stripPrefix] + prefixes = [ "/test" ] + +[http.services] + [http.services.service1] + [http.services.service1.loadBalancer] + + [[http.services.service1.loadBalancer.servers]] + url = "http://{{ .WhoamiIP }}:8080" + + [[http.services.service1.loadBalancer.servers]] + url = "http://{{ .WhoamiIP }}:80" diff --git a/integration/retry_test.go b/integration/retry_test.go index 6a146e5ce..a86ba70ab 100644 --- a/integration/retry_test.go +++ b/integration/retry_test.go @@ -1,6 +1,7 @@ package integration import ( + "io" "net/http" "os" "time" @@ -86,3 +87,26 @@ func (s *RetrySuite) TestRetryWebsocket(c *check.C) { c.Assert(err, checker.IsNil) c.Assert(response.StatusCode, checker.Equals, http.StatusSwitchingProtocols) } + +func (s *RetrySuite) TestRetryWithStripPrefix(c *check.C) { + file := s.adaptFile(c, "fixtures/retry/strip_prefix.toml", struct{ WhoamiIP string }{s.whoamiIP}) + defer os.Remove(file) + + cmd, display := s.traefikCmd(withConfigFile(file)) + defer display(c) + err := cmd.Start() + c.Assert(err, checker.IsNil) + defer s.killCmd(cmd) + + err = try.GetRequest("http://127.0.0.1:8080/api/rawdata", 60*time.Second, try.BodyContains("PathPrefix(`/`)")) + c.Assert(err, checker.IsNil) + + response, err := http.Get("http://127.0.0.1:8000/test") + c.Assert(err, checker.IsNil) + + body, err := io.ReadAll(response.Body) + c.Assert(err, checker.IsNil) + + c.Assert(string(body), checker.Contains, "GET / HTTP/1.1") + c.Assert(string(body), checker.Contains, "X-Forwarded-Prefix: /test") +} diff --git a/pkg/middlewares/retry/retry.go b/pkg/middlewares/retry/retry.go index 75367ebc7..e1eee533d 100644 --- a/pkg/middlewares/retry/retry.go +++ b/pkg/middlewares/retry/retry.go @@ -97,7 +97,7 @@ func (r *retry) ServeHTTP(rw http.ResponseWriter, req *http.Request) { } newCtx := httptrace.WithClientTrace(req.Context(), trace) - r.next.ServeHTTP(retryResponseWriter, req.WithContext(newCtx)) + r.next.ServeHTTP(retryResponseWriter, req.Clone(newCtx)) if !retryResponseWriter.ShouldRetry() { return nil