package middleware import ( "net/http/httptest" "github.com/labstack/echo/v4" . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" ) var _ = Describe("StripPathPrefix", func() { var app *echo.Echo var actualPath string var appInitialized bool BeforeEach(func() { actualPath = "" if !appInitialized { app = echo.New() app.Pre(StripPathPrefix()) app.GET("/hello/world", func(c echo.Context) error { actualPath = c.Request().URL.Path return nil }) app.GET("/", func(c echo.Context) error { actualPath = c.Request().URL.Path return nil }) appInitialized = true } }) Context("without prefix", func() { It("should not modify path when no header is present", func() { req := httptest.NewRequest("GET", "/hello/world", nil) rec := httptest.NewRecorder() app.ServeHTTP(rec, req) Expect(rec.Code).To(Equal(200), "response status code") Expect(actualPath).To(Equal("/hello/world"), "rewritten path") }) It("should not modify root path when no header is present", func() { req := httptest.NewRequest("GET", "/", nil) rec := httptest.NewRecorder() app.ServeHTTP(rec, req) Expect(rec.Code).To(Equal(200), "response status code") Expect(actualPath).To(Equal("/"), "rewritten path") }) It("should not modify path when header does not match", func() { req := httptest.NewRequest("GET", "/hello/world", nil) req.Header["X-Forwarded-Prefix"] = []string{"/otherprefix/"} rec := httptest.NewRecorder() app.ServeHTTP(rec, req) Expect(rec.Code).To(Equal(200), "response status code") Expect(actualPath).To(Equal("/hello/world"), "rewritten path") }) }) Context("with prefix", func() { It("should return 404 when prefix does not match header", func() { req := httptest.NewRequest("GET", "/prefix/hello/world", nil) req.Header["X-Forwarded-Prefix"] = []string{"/otherprefix/"} rec := httptest.NewRecorder() app.ServeHTTP(rec, req) Expect(rec.Code).To(Equal(404), "response status code") }) It("should strip matching prefix from path", func() { req := httptest.NewRequest("GET", "/myprefix/hello/world", nil) req.Header["X-Forwarded-Prefix"] = []string{"/myprefix/"} rec := httptest.NewRecorder() app.ServeHTTP(rec, req) Expect(rec.Code).To(Equal(200), "response status code") Expect(actualPath).To(Equal("/hello/world"), "rewritten path") }) It("should strip prefix when it matches the first header value", func() { req := httptest.NewRequest("GET", "/myprefix/hello/world", nil) req.Header["X-Forwarded-Prefix"] = []string{"/myprefix/", "/otherprefix/"} rec := httptest.NewRecorder() app.ServeHTTP(rec, req) Expect(rec.Code).To(Equal(200), "response status code") Expect(actualPath).To(Equal("/hello/world"), "rewritten path") }) It("should strip prefix when it matches the second header value", func() { req := httptest.NewRequest("GET", "/myprefix/hello/world", nil) req.Header["X-Forwarded-Prefix"] = []string{"/otherprefix/", "/myprefix/"} rec := httptest.NewRecorder() app.ServeHTTP(rec, req) Expect(rec.Code).To(Equal(200), "response status code") Expect(actualPath).To(Equal("/hello/world"), "rewritten path") }) It("should strip prefix when header does not end with slash", func() { req := httptest.NewRequest("GET", "/myprefix/hello/world", nil) req.Header["X-Forwarded-Prefix"] = []string{"/myprefix"} rec := httptest.NewRecorder() app.ServeHTTP(rec, req) Expect(rec.Code).To(Equal(200), "response status code") Expect(actualPath).To(Equal("/hello/world"), "rewritten path") }) It("should return 404 when prefix does not match header without trailing slash", func() { req := httptest.NewRequest("GET", "/myprefix-suffix/hello/world", nil) req.Header["X-Forwarded-Prefix"] = []string{"/myprefix"} rec := httptest.NewRecorder() app.ServeHTTP(rec, req) Expect(rec.Code).To(Equal(404), "response status code") }) It("should redirect when prefix does not end with a slash", func() { req := httptest.NewRequest("GET", "/myprefix", nil) req.Header["X-Forwarded-Prefix"] = []string{"/myprefix"} rec := httptest.NewRecorder() app.ServeHTTP(rec, req) Expect(rec.Code).To(Equal(302), "response status code") Expect(rec.Header().Get("Location")).To(Equal("/myprefix/"), "redirect location") }) }) })