Commit e3d64169 authored by Michael Schoebel's avatar Michael Schoebel

Adapted internal middleware

- Detect too many internal redirects - return 500 in this case
parent a5b565e1
...@@ -16,7 +16,10 @@ type Internal struct { ...@@ -16,7 +16,10 @@ type Internal struct {
Paths []string Paths []string
} }
const redirectHeader string = "X-Accel-Redirect" const (
redirectHeader string = "X-Accel-Redirect"
maxRedirectCount int = 10
)
func isInternalRedirect(w http.ResponseWriter) bool { func isInternalRedirect(w http.ResponseWriter) bool {
return w.Header().Get(redirectHeader) != "" return w.Header().Get(redirectHeader) != ""
...@@ -37,7 +40,7 @@ func (i Internal) ServeHTTP(w http.ResponseWriter, r *http.Request) (int, error) ...@@ -37,7 +40,7 @@ func (i Internal) ServeHTTP(w http.ResponseWriter, r *http.Request) (int, error)
iw := internalResponseWriter{ResponseWriter: w} iw := internalResponseWriter{ResponseWriter: w}
status, err := i.Next.ServeHTTP(iw, r) status, err := i.Next.ServeHTTP(iw, r)
for isInternalRedirect(iw) { for c := 0; c < maxRedirectCount && isInternalRedirect(iw); c++ {
// Redirect - adapt request URL path and send it again // Redirect - adapt request URL path and send it again
// "down the chain" // "down the chain"
r.URL.Path = iw.Header().Get(redirectHeader) r.URL.Path = iw.Header().Get(redirectHeader)
...@@ -46,6 +49,12 @@ func (i Internal) ServeHTTP(w http.ResponseWriter, r *http.Request) (int, error) ...@@ -46,6 +49,12 @@ func (i Internal) ServeHTTP(w http.ResponseWriter, r *http.Request) (int, error)
status, err = i.Next.ServeHTTP(iw, r) status, err = i.Next.ServeHTTP(iw, r)
} }
if isInternalRedirect(iw) {
// Too many redirect cycles
iw.ClearHeader()
return http.StatusInternalServerError, nil
}
return status, err return status, err
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment