From 35cf10e1d62af3aa4ba12e9bc8cdab4ca7f21b57 Mon Sep 17 00:00:00 2001 From: Mike Lang Date: Wed, 2 Nov 2016 13:29:25 -0700 Subject: [PATCH 1/2] middleware/errorhandler: Implement Hijacker so it works with ws proxy --- common/middleware/errorhandler.go | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/common/middleware/errorhandler.go b/common/middleware/errorhandler.go index fdb539d37..9608c3750 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 by the app-mapper's proxy. +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() +} From 71552927654b7c82459ab8200e8ea99bd7bb5e01 Mon Sep 17 00:00:00 2001 From: Mike Lang Date: Mon, 7 Nov 2016 11:52:19 -0800 Subject: [PATCH 2/2] middleware: Update references in comments to why Hijacker is needed --- common/middleware/errorhandler.go | 2 +- common/middleware/logging.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/common/middleware/errorhandler.go b/common/middleware/errorhandler.go index 9608c3750..0f7ab6141 100644 --- a/common/middleware/errorhandler.go +++ b/common/middleware/errorhandler.go @@ -83,7 +83,7 @@ func (i *errorInterceptor) Write(data []byte) (int, error) { } // errorInterceptor 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. func (i *errorInterceptor) Hijack() (net.Conn, *bufio.ReadWriter, error) { hj, ok := i.originalWriter.(http.Hijacker) if !ok { 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