Fix stats responseRecorder Hijacker
Signed-off-by: Emile Vauge <emile@vauge.com>
This commit is contained in:
parent
aa4ed088bb
commit
71cec1580b
3 changed files with 36 additions and 4 deletions
|
@ -12,10 +12,7 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
_ http.ResponseWriter = &ResponseRecorder{}
|
_ Stateful = &ResponseRecorder{}
|
||||||
_ http.Hijacker = &ResponseRecorder{}
|
|
||||||
_ http.Flusher = &ResponseRecorder{}
|
|
||||||
_ http.CloseNotifier = &ResponseRecorder{}
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// Retry is a middleware that retries requests
|
// Retry is a middleware that retries requests
|
||||||
|
|
12
middlewares/stateful.go
Normal file
12
middlewares/stateful.go
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
package middlewares
|
||||||
|
|
||||||
|
import "net/http"
|
||||||
|
|
||||||
|
// Stateful interface groups all http interfaces that must be
|
||||||
|
// implemented by a stateful middleware (ie: recorders)
|
||||||
|
type Stateful interface {
|
||||||
|
http.ResponseWriter
|
||||||
|
http.Hijacker
|
||||||
|
http.Flusher
|
||||||
|
http.CloseNotifier
|
||||||
|
}
|
|
@ -1,11 +1,17 @@
|
||||||
package middlewares
|
package middlewares
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bufio"
|
||||||
|
"net"
|
||||||
"net/http"
|
"net/http"
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
_ Stateful = &responseRecorder{}
|
||||||
|
)
|
||||||
|
|
||||||
// StatsRecorder is an optional middleware that records more details statistics
|
// StatsRecorder is an optional middleware that records more details statistics
|
||||||
// about requests and how they are processed. This currently consists of recent
|
// about requests and how they are processed. This currently consists of recent
|
||||||
// requests that have caused errors (4xx and 5xx status codes), making it easy
|
// requests that have caused errors (4xx and 5xx status codes), making it easy
|
||||||
|
@ -51,6 +57,23 @@ func (r *responseRecorder) WriteHeader(status int) {
|
||||||
r.statusCode = status
|
r.statusCode = status
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Hijack hijacks the connection
|
||||||
|
func (r *responseRecorder) Hijack() (net.Conn, *bufio.ReadWriter, error) {
|
||||||
|
return r.ResponseWriter.(http.Hijacker).Hijack()
|
||||||
|
}
|
||||||
|
|
||||||
|
// CloseNotify returns a channel that receives at most a
|
||||||
|
// single value (true) when the client connection has gone
|
||||||
|
// away.
|
||||||
|
func (r *responseRecorder) CloseNotify() <-chan bool {
|
||||||
|
return r.ResponseWriter.(http.CloseNotifier).CloseNotify()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Flush sends any buffered data to the client.
|
||||||
|
func (r *responseRecorder) Flush() {
|
||||||
|
r.ResponseWriter.(http.Flusher).Flush()
|
||||||
|
}
|
||||||
|
|
||||||
// ServeHTTP silently extracts information from the request and response as it
|
// ServeHTTP silently extracts information from the request and response as it
|
||||||
// is processed. If the response is 4xx or 5xx, add it to the list of 10 most
|
// is processed. If the response is 4xx or 5xx, add it to the list of 10 most
|
||||||
// recent errors.
|
// recent errors.
|
||||||
|
|
Loading…
Reference in a new issue