Merge 765028a338 into 9168731c7a
This commit is contained in:
commit
58938239af
|
|
@ -8,6 +8,8 @@
|
||||||
|
|
||||||
## Changes since v7.12.0
|
## Changes since v7.12.0
|
||||||
|
|
||||||
|
- [#2767](https://github.com/oauth2-proxy/oauth2-proxy/pull/2767) Propagate errors during route building (@sybereal)
|
||||||
|
|
||||||
# V7.12.0
|
# V7.12.0
|
||||||
|
|
||||||
## Release Highlights
|
## Release Highlights
|
||||||
|
|
|
||||||
|
|
@ -57,7 +57,9 @@ func NewProxy(upstreams options.UpstreamConfig, sigData *options.SignatureData,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
registerTrailingSlashHandler(m.serveMux)
|
if err := registerTrailingSlashHandler(m.serveMux); err != nil {
|
||||||
|
return nil, fmt.Errorf("could not register trailing slash handler: %w", err)
|
||||||
|
}
|
||||||
return m, nil
|
return m, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -93,8 +95,7 @@ func (m *multiUpstreamProxy) registerHTTPUpstreamProxy(upstream options.Upstream
|
||||||
// registerHandler ensures the given handler is regiestered with the serveMux.
|
// registerHandler ensures the given handler is regiestered with the serveMux.
|
||||||
func (m *multiUpstreamProxy) registerHandler(upstream options.Upstream, handler http.Handler, writer pagewriter.Writer) error {
|
func (m *multiUpstreamProxy) registerHandler(upstream options.Upstream, handler http.Handler, writer pagewriter.Writer) error {
|
||||||
if upstream.RewriteTarget == "" {
|
if upstream.RewriteTarget == "" {
|
||||||
m.registerSimpleHandler(upstream.Path, handler)
|
return m.registerSimpleHandler(upstream.Path, handler)
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return m.registerRewriteHandler(upstream, handler, writer)
|
return m.registerRewriteHandler(upstream, handler, writer)
|
||||||
|
|
@ -102,12 +103,12 @@ func (m *multiUpstreamProxy) registerHandler(upstream options.Upstream, handler
|
||||||
|
|
||||||
// registerSimpleHandler maintains the behaviour of the go standard serveMux
|
// registerSimpleHandler maintains the behaviour of the go standard serveMux
|
||||||
// by ensuring any path with a trailing `/` matches all paths under that prefix.
|
// by ensuring any path with a trailing `/` matches all paths under that prefix.
|
||||||
func (m *multiUpstreamProxy) registerSimpleHandler(path string, handler http.Handler) {
|
func (m *multiUpstreamProxy) registerSimpleHandler(path string, handler http.Handler) error {
|
||||||
if strings.HasSuffix(path, "/") {
|
if strings.HasSuffix(path, "/") {
|
||||||
m.serveMux.PathPrefix(path).Handler(handler)
|
return m.serveMux.PathPrefix(path).Handler(handler).GetError()
|
||||||
} else {
|
|
||||||
m.serveMux.Path(path).Handler(handler)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return m.serveMux.Path(path).Handler(handler).GetError()
|
||||||
}
|
}
|
||||||
|
|
||||||
// registerRewriteHandler ensures the handler is registered for all paths
|
// registerRewriteHandler ensures the handler is registered for all paths
|
||||||
|
|
@ -122,19 +123,18 @@ func (m *multiUpstreamProxy) registerRewriteHandler(upstream options.Upstream, h
|
||||||
|
|
||||||
rewrite := newRewritePath(rewriteRegExp, upstream.RewriteTarget, writer)
|
rewrite := newRewritePath(rewriteRegExp, upstream.RewriteTarget, writer)
|
||||||
h := alice.New(rewrite).Then(handler)
|
h := alice.New(rewrite).Then(handler)
|
||||||
m.serveMux.MatcherFunc(func(req *http.Request, _ *mux.RouteMatch) bool {
|
|
||||||
return rewriteRegExp.MatchString(req.URL.Path)
|
|
||||||
}).Handler(h)
|
|
||||||
|
|
||||||
return nil
|
return m.serveMux.MatcherFunc(func(req *http.Request, _ *mux.RouteMatch) bool {
|
||||||
|
return rewriteRegExp.MatchString(req.URL.Path)
|
||||||
|
}).Handler(h).GetError()
|
||||||
}
|
}
|
||||||
|
|
||||||
// registerTrailingSlashHandler creates a new matcher that will check if the
|
// registerTrailingSlashHandler creates a new matcher that will check if the
|
||||||
// requested path would match if it had a trailing slash appended.
|
// requested path would match if it had a trailing slash appended.
|
||||||
// If the path matches with a trailing slash, we send back a redirect.
|
// If the path matches with a trailing slash, we send back a redirect.
|
||||||
// This allows us to be consistent with the built in go servemux implementation.
|
// This allows us to be consistent with the built in go servemux implementation.
|
||||||
func registerTrailingSlashHandler(serveMux *mux.Router) {
|
func registerTrailingSlashHandler(serveMux *mux.Router) error {
|
||||||
serveMux.MatcherFunc(func(req *http.Request, _ *mux.RouteMatch) bool {
|
return serveMux.MatcherFunc(func(req *http.Request, _ *mux.RouteMatch) bool {
|
||||||
if strings.HasSuffix(req.URL.Path, "/") {
|
if strings.HasSuffix(req.URL.Path, "/") {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
@ -148,7 +148,7 @@ func registerTrailingSlashHandler(serveMux *mux.Router) {
|
||||||
return serveMux.Match(slashReq, m)
|
return serveMux.Match(slashReq, m)
|
||||||
}).Handler(http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) {
|
}).Handler(http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) {
|
||||||
http.Redirect(rw, req, req.URL.String()+"/", http.StatusMovedPermanently)
|
http.Redirect(rw, req, req.URL.String()+"/", http.StatusMovedPermanently)
|
||||||
}))
|
})).GetError()
|
||||||
}
|
}
|
||||||
|
|
||||||
// sortByPathLongest ensures that the upstreams are sorted by longest path.
|
// sortByPathLongest ensures that the upstreams are sorted by longest path.
|
||||||
|
|
|
||||||
|
|
@ -382,6 +382,38 @@ var _ = Describe("Proxy Suite", func() {
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
Context("multiUpstreamProxy errors", func() {
|
||||||
|
type proxyErrorTableInput struct {
|
||||||
|
upstreams options.UpstreamConfig
|
||||||
|
expectedError string
|
||||||
|
}
|
||||||
|
|
||||||
|
DescribeTable("NewProxy", func(in *proxyErrorTableInput) {
|
||||||
|
sigData := &options.SignatureData{Hash: crypto.SHA256, Key: "secret"}
|
||||||
|
|
||||||
|
writer := &pagewriter.WriterFuncs{
|
||||||
|
ProxyErrorFunc: func(rw http.ResponseWriter, _ *http.Request, _ error) {
|
||||||
|
rw.WriteHeader(502)
|
||||||
|
rw.Write([]byte("Proxy Error"))
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err := NewProxy(in.upstreams, sigData, writer)
|
||||||
|
Expect(err).To(MatchError(in.expectedError))
|
||||||
|
},
|
||||||
|
Entry("regex matcher without rewrite target", &proxyErrorTableInput{
|
||||||
|
upstreams: options.UpstreamConfig{
|
||||||
|
Upstreams: []options.Upstream{{
|
||||||
|
ID: "api",
|
||||||
|
Path: "^/api/$",
|
||||||
|
URI: "http://example.com",
|
||||||
|
}},
|
||||||
|
},
|
||||||
|
expectedError: `could not register http upstream "api": mux: path must start with a slash, got "^/api/$"`,
|
||||||
|
}),
|
||||||
|
)
|
||||||
|
})
|
||||||
|
|
||||||
Context("sortByPathLongest", func() {
|
Context("sortByPathLongest", func() {
|
||||||
type sortByPathLongestTableInput struct {
|
type sortByPathLongestTableInput struct {
|
||||||
input []options.Upstream
|
input []options.Upstream
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue