diff --git a/common/middleware/errorhandler.go b/common/middleware/errorhandler.go index fdb539d37..0f7ab6141 100644 --- a/common/middleware/errorhandler.go +++ b/common/middleware/errorhandler.go @@ -1,6 +1,9 @@ package middleware import ( + "bufio" + "fmt" + "net" "net/http" ) @@ -78,3 +81,14 @@ func (i *errorInterceptor) Write(data []byte) (int, error) { } return len(data), nil } + +// errorInterceptor also implements net.Hijacker, to let the downstream Handler +// hijack the connection. This is needed, for example, for working with websockets. +func (i *errorInterceptor) Hijack() (net.Conn, *bufio.ReadWriter, error) { + hj, ok := i.originalWriter.(http.Hijacker) + if !ok { + return nil, nil, fmt.Errorf("error interceptor: can't cast original ResponseWriter to Hijacker") + } + i.gotCode = true + return hj.Hijack() +} diff --git a/common/middleware/logging.go b/common/middleware/logging.go index 7bda6377f..e05a80ce1 100644 --- a/common/middleware/logging.go +++ b/common/middleware/logging.go @@ -45,7 +45,7 @@ var LogFailed = Log{ // want to report on success, i.e. http.StatusOK. // // interceptor also implements net.Hijacker, to let the downstream Handler -// hijack the connection. This is needed by the app-mapper's proxy. +// hijack the connection. This is needed, for example, for working with websockets. type interceptor struct { http.ResponseWriter statusCode int