fix: websocket path rewrite (#2300)
This commit is contained in:
		
							parent
							
								
									96f0288a36
								
							
						
					
					
						commit
						64e736f668
					
				|  | @ -11,6 +11,7 @@ | ||||||
| - [#2800](https://github.com/oauth2-proxy/oauth2-proxy/pull/2800) Add some opencontainer labels to docker image (@halkeye) | - [#2800](https://github.com/oauth2-proxy/oauth2-proxy/pull/2800) Add some opencontainer labels to docker image (@halkeye) | ||||||
| - [#2755](https://github.com/oauth2-proxy/oauth2-proxy/pull/2755) feat: add X-Envoy-External-Address as supported header (@bjencks) | - [#2755](https://github.com/oauth2-proxy/oauth2-proxy/pull/2755) feat: add X-Envoy-External-Address as supported header (@bjencks) | ||||||
| - [#1985](https://github.com/oauth2-proxy/oauth2-proxy/pull/1985) Add support for systemd socket (@isodude) | - [#1985](https://github.com/oauth2-proxy/oauth2-proxy/pull/1985) Add support for systemd socket (@isodude) | ||||||
|  | - [#2300](https://github.com/oauth2-proxy/oauth2-proxy/pull/2300) Add fix for websocket path rewrite (@rekup) | ||||||
| 
 | 
 | ||||||
| # V7.7.1 | # V7.7.1 | ||||||
| 
 | 
 | ||||||
|  | @ -59,7 +60,6 @@ | ||||||
| - [#2790](https://github.com/oauth2-proxy/oauth2-proxy/pull/2790) chore(deps): update all golang dependencies (@tuunit) | - [#2790](https://github.com/oauth2-proxy/oauth2-proxy/pull/2790) chore(deps): update all golang dependencies (@tuunit) | ||||||
| - [#2607](https://github.com/oauth2-proxy/oauth2-proxy/pull/2607) fix(csrf): fix possible infinite loop (@Primexz) | - [#2607](https://github.com/oauth2-proxy/oauth2-proxy/pull/2607) fix(csrf): fix possible infinite loop (@Primexz) | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
| # V7.6.0 | # V7.6.0 | ||||||
| 
 | 
 | ||||||
| ## Release Highlights | ## Release Highlights | ||||||
|  |  | ||||||
|  | @ -253,7 +253,7 @@ var _ = Describe("Proxy Suite", func() { | ||||||
| 						URL:    "http://example.localhost/different/backend/path/1234", | 						URL:    "http://example.localhost/different/backend/path/1234", | ||||||
| 						Header: map[string][]string{ | 						Header: map[string][]string{ | ||||||
| 							"Gap-Auth":      {""}, | 							"Gap-Auth":      {""}, | ||||||
| 							"Gap-Signature": {"sha256 jeAeM7wHSj2ab/l9YPvtTJ9l/8q1tpY2V/iwXF48bgw="}, | 							"Gap-Signature": {"sha256 Pzy0fSFhzbhY0R9rj8vl5LCiIQaKVB0s6h9BADgIT4I="}, | ||||||
| 						}, | 						}, | ||||||
| 						Body:       []byte{}, | 						Body:       []byte{}, | ||||||
| 						Host:       "example.localhost", | 						Host:       "example.localhost", | ||||||
|  | @ -274,7 +274,7 @@ var _ = Describe("Proxy Suite", func() { | ||||||
| 						URL:    "http://example.localhost/different/backend/path/1234/abc", | 						URL:    "http://example.localhost/different/backend/path/1234/abc", | ||||||
| 						Header: map[string][]string{ | 						Header: map[string][]string{ | ||||||
| 							"Gap-Auth":      {""}, | 							"Gap-Auth":      {""}, | ||||||
| 							"Gap-Signature": {"sha256 rAkAc9gp7EndoOppJuvbuPnYuBcqrTkBnQx6iPS8xTA="}, | 							"Gap-Signature": {"sha256 uqIAxSgz+onqHDMMl/EAZWbwSw56PzM90iCocNUEqmw="}, | ||||||
| 						}, | 						}, | ||||||
| 						Body:       []byte{}, | 						Body:       []byte{}, | ||||||
| 						Host:       "example.localhost", | 						Host:       "example.localhost", | ||||||
|  | @ -324,7 +324,7 @@ var _ = Describe("Proxy Suite", func() { | ||||||
| 						URL:    "http://example.localhost/double-match/rewrite/foo", | 						URL:    "http://example.localhost/double-match/rewrite/foo", | ||||||
| 						Header: map[string][]string{ | 						Header: map[string][]string{ | ||||||
| 							"Gap-Auth":      {""}, | 							"Gap-Auth":      {""}, | ||||||
| 							"Gap-Signature": {"sha256 eYyUNdsrTmnvFpavpP8AdHGUGzqJ39QEjqn0/3fQPHA="}, | 							"Gap-Signature": {"sha256 Ii7wKYBkRkJH556gRUsVUwGPgF7IG7V7X4vhkiyzfQ0="}, | ||||||
| 						}, | 						}, | ||||||
| 						Body:       []byte{}, | 						Body:       []byte{}, | ||||||
| 						Host:       "example.localhost", | 						Host:       "example.localhost", | ||||||
|  |  | ||||||
|  | @ -50,6 +50,7 @@ func rewritePath(rewriteRegExp *regexp.Regexp, rewriteTarget string, writer page | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		req.RequestURI = reqURL.String() | 		req.RequestURI = reqURL.String() | ||||||
|  | 		req.URL.Path = reqURL.Path // set path for websocket connections
 | ||||||
| 		next.ServeHTTP(rw, req) | 		next.ServeHTTP(rw, req) | ||||||
| 	}) | 	}) | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -16,6 +16,7 @@ var _ = Describe("Rewrite", func() { | ||||||
| 		rewriteTarget      string | 		rewriteTarget      string | ||||||
| 		requestTarget      string | 		requestTarget      string | ||||||
| 		expectedRequestURI string | 		expectedRequestURI string | ||||||
|  | 		expectedURLPath    string | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	DescribeTable("should rewrite the request path", | 	DescribeTable("should rewrite the request path", | ||||||
|  | @ -24,36 +25,43 @@ var _ = Describe("Rewrite", func() { | ||||||
| 			rw := httptest.NewRecorder() | 			rw := httptest.NewRecorder() | ||||||
| 
 | 
 | ||||||
| 			var gotRequestURI string | 			var gotRequestURI string | ||||||
|  | 			var gotRequestURLPath string | ||||||
| 			handler := newRewritePath(in.rewriteRegex, in.rewriteTarget, &pagewriter.WriterFuncs{})(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { | 			handler := newRewritePath(in.rewriteRegex, in.rewriteTarget, &pagewriter.WriterFuncs{})(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { | ||||||
| 				gotRequestURI = r.RequestURI | 				gotRequestURI = r.RequestURI | ||||||
|  | 				gotRequestURLPath = r.URL.Path | ||||||
| 			})) | 			})) | ||||||
| 			handler.ServeHTTP(rw, req) | 			handler.ServeHTTP(rw, req) | ||||||
| 
 | 
 | ||||||
| 			Expect(gotRequestURI).To(Equal(in.expectedRequestURI)) | 			Expect(gotRequestURI).To(Equal(in.expectedRequestURI)) | ||||||
|  | 			Expect(gotRequestURLPath).To(Equal(in.expectedURLPath)) | ||||||
| 		}, | 		}, | ||||||
| 		Entry("when the path matches the regexp", rewritePathTableInput{ | 		Entry("when the path matches the regexp", rewritePathTableInput{ | ||||||
| 			rewriteRegex:       regexp.MustCompile("^/http/(.*)"), | 			rewriteRegex:       regexp.MustCompile("^/http/(.*)"), | ||||||
| 			rewriteTarget:      "/$1", | 			rewriteTarget:      "/$1", | ||||||
| 			requestTarget:      "http://example.com/http/foo/bar", | 			requestTarget:      "http://example.com/http/foo/bar", | ||||||
| 			expectedRequestURI: "http://example.com/foo/bar", | 			expectedRequestURI: "http://example.com/foo/bar", | ||||||
|  | 			expectedURLPath:    "/foo/bar", | ||||||
| 		}), | 		}), | ||||||
| 		Entry("when the path does not match the regexp", rewritePathTableInput{ | 		Entry("when the path does not match the regexp", rewritePathTableInput{ | ||||||
| 			rewriteRegex:       regexp.MustCompile("^/http/(.*)"), | 			rewriteRegex:       regexp.MustCompile("^/http/(.*)"), | ||||||
| 			rewriteTarget:      "/$1", | 			rewriteTarget:      "/$1", | ||||||
| 			requestTarget:      "https://example.com/https/foo/bar", | 			requestTarget:      "https://example.com/https/foo/bar", | ||||||
| 			expectedRequestURI: "https://example.com/https/foo/bar", | 			expectedRequestURI: "https://example.com/https/foo/bar", | ||||||
|  | 			expectedURLPath:    "/https/foo/bar", | ||||||
| 		}), | 		}), | ||||||
| 		Entry("when the regexp is not anchored", rewritePathTableInput{ | 		Entry("when the regexp is not anchored", rewritePathTableInput{ | ||||||
| 			rewriteRegex:       regexp.MustCompile("/http/(.*)"), | 			rewriteRegex:       regexp.MustCompile("/http/(.*)"), | ||||||
| 			rewriteTarget:      "/$1", | 			rewriteTarget:      "/$1", | ||||||
| 			requestTarget:      "http://example.com/bar/http/foo/bar", | 			requestTarget:      "http://example.com/bar/http/foo/bar", | ||||||
| 			expectedRequestURI: "http://example.com/bar/foo/bar", | 			expectedRequestURI: "http://example.com/bar/foo/bar", | ||||||
|  | 			expectedURLPath:    "/bar/foo/bar", | ||||||
| 		}), | 		}), | ||||||
| 		Entry("when the regexp is rewriting to a query", rewritePathTableInput{ | 		Entry("when the regexp is rewriting to a query", rewritePathTableInput{ | ||||||
| 			rewriteRegex:       regexp.MustCompile(`/articles/([a-z0-9\-]*)`), | 			rewriteRegex:       regexp.MustCompile(`/articles/([a-z0-9\-]*)`), | ||||||
| 			rewriteTarget:      "/article?id=$1", | 			rewriteTarget:      "/article?id=$1", | ||||||
| 			requestTarget:      "http://example.com/articles/blog-2021-01-01", | 			requestTarget:      "http://example.com/articles/blog-2021-01-01", | ||||||
| 			expectedRequestURI: "http://example.com/article?id=blog-2021-01-01", | 			expectedRequestURI: "http://example.com/article?id=blog-2021-01-01", | ||||||
|  | 			expectedURLPath:    "/article", | ||||||
| 		}), | 		}), | ||||||
| 	) | 	) | ||||||
| }) | }) | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue