138 lines
3.4 KiB
Go
138 lines
3.4 KiB
Go
package loggedwriter
|
|
|
|
import (
|
|
"net/http"
|
|
)
|
|
|
|
// LoggedResponseWriter define http.ResponseWriter with Status
|
|
type LoggedResponseWriter interface {
|
|
http.ResponseWriter
|
|
Status() int
|
|
}
|
|
|
|
// loggedResponseWriter is a http.ResponseWriter with Status.
|
|
type loggedResponseWriter struct {
|
|
http.ResponseWriter
|
|
status int
|
|
}
|
|
|
|
// loggedResponseWriterHijacker is a http.ResponseWriter and http.Hijacker
|
|
// with Status.
|
|
type loggedResponseWriterHijacker struct {
|
|
LoggedResponseWriter
|
|
http.Hijacker
|
|
}
|
|
|
|
// loggedResponseWriterHijacker is a http.ResponseWriter and http.Flusher
|
|
// with Status.
|
|
type loggedResponseWriterFlusher struct {
|
|
LoggedResponseWriter
|
|
http.Flusher
|
|
}
|
|
|
|
// loggedResponseWriterHijacker is a http.ResponseWriter and http.Pusher
|
|
// with Status.
|
|
type loggedResponseWriterPusher struct {
|
|
LoggedResponseWriter
|
|
http.Pusher
|
|
}
|
|
|
|
// loggedResponseWriterHijackerFlusherPusher is a http.ResponseWriter, http.Hijacker,
|
|
// http.Flusher and http.Pusher with Status.
|
|
type loggedResponseWriterHijackerFlusherPusher struct {
|
|
LoggedResponseWriter
|
|
http.Hijacker
|
|
http.Flusher
|
|
http.Pusher
|
|
}
|
|
|
|
// loggedResponseWriterHijackerFlusher is a http.ResponseWriter, http.Hijacker,
|
|
// and http.Flusher with Status.
|
|
type loggedResponseWriterHijackerFlusher struct {
|
|
LoggedResponseWriter
|
|
http.Hijacker
|
|
http.Flusher
|
|
}
|
|
|
|
// loggedResponseWriterHijackerPusher is a http.ResponseWriter, http.Hijacker,
|
|
// and http.Pusher with Status.
|
|
type loggedResponseWriterHijackerPusher struct {
|
|
LoggedResponseWriter
|
|
http.Hijacker
|
|
http.Pusher
|
|
}
|
|
|
|
// loggedResponseWriterFlusherPusher is a http.ResponseWriter, http.Flusher and
|
|
// http.Pusher with Status.
|
|
type loggedResponseWriterFlusherPusher struct {
|
|
LoggedResponseWriter
|
|
http.Flusher
|
|
http.Pusher
|
|
}
|
|
|
|
// NewLoggedResponseWriter wraps the provided http.ResponseWriter with Status
|
|
// preserving the support to hijack the connection if supported by the provided
|
|
// http.ResponseWriter.
|
|
func NewLoggedResponseWriter(w http.ResponseWriter) LoggedResponseWriter {
|
|
lw := &loggedResponseWriter{ResponseWriter: w}
|
|
|
|
hj, hj_ok := w.(http.Hijacker)
|
|
fl, fl_ok := w.(http.Flusher)
|
|
ps, ps_ok := w.(http.Pusher)
|
|
|
|
if hj_ok {
|
|
if fl_ok && ps_ok {
|
|
return &loggedResponseWriterHijackerFlusherPusher{
|
|
LoggedResponseWriter: lw,
|
|
Hijacker: hj,
|
|
Flusher: fl,
|
|
Pusher: ps,
|
|
}
|
|
}
|
|
if fl_ok {
|
|
return &loggedResponseWriterHijackerFlusher{
|
|
LoggedResponseWriter: lw,
|
|
Hijacker: hj,
|
|
Flusher: fl,
|
|
}
|
|
}
|
|
if ps_ok {
|
|
return &loggedResponseWriterHijackerPusher{
|
|
LoggedResponseWriter: lw,
|
|
Hijacker: hj,
|
|
Pusher: ps,
|
|
}
|
|
}
|
|
return &loggedResponseWriterHijacker{LoggedResponseWriter: lw, Hijacker: hj}
|
|
} else if fl_ok {
|
|
if ps_ok {
|
|
return &loggedResponseWriterFlusherPusher{
|
|
LoggedResponseWriter: lw,
|
|
Flusher: fl,
|
|
Pusher: ps,
|
|
}
|
|
}
|
|
return &loggedResponseWriterFlusher{LoggedResponseWriter: lw, Flusher: fl}
|
|
} else if ps_ok {
|
|
return &loggedResponseWriterPusher{LoggedResponseWriter: lw, Pusher: ps}
|
|
}
|
|
|
|
return lw
|
|
}
|
|
|
|
// WriteHeader sends an HTTP response header with status code.
|
|
func (w *loggedResponseWriter) WriteHeader(status int) {
|
|
w.status = status
|
|
w.ResponseWriter.WriteHeader(status)
|
|
}
|
|
|
|
// Status returns the written HTTP response header status code or http.StatusOK
|
|
// if none was written.
|
|
func (w *loggedResponseWriter) Status() int {
|
|
status := w.status
|
|
if status == 0 {
|
|
status = http.StatusOK
|
|
}
|
|
return status
|
|
}
|