Initial QSfera import
This commit is contained in:
+137
@@ -0,0 +1,137 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user