From f4ddf25e41aca5101ec1ae7ed9feb7e144125bd8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9D=D0=B8=D0=BA=D0=B8=D1=82=D0=B0=20=D0=A2=D0=B8=D0=BC?= =?UTF-8?q?=D0=BE=D1=84=D0=B5=D0=B5=D0=B2?= Date: Fri, 24 Nov 2023 11:30:06 +0300 Subject: [PATCH] Fixed stripPrefix middleware is not applied to retried attempts --- integration/fixtures/retry/strip_prefix.toml | 40 ++++++++++++++++++++ integration/retry_test.go | 24 ++++++++++++ pkg/middlewares/retry/retry.go | 2 +- 3 files changed, 65 insertions(+), 1 deletion(-) create mode 100644 integration/fixtures/retry/strip_prefix.toml 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