Commit d360a0c2 authored by Jacob Vosmaer's avatar Jacob Vosmaer

Move logging and HTTPError to the helper package

parent bcf4e63e
...@@ -60,3 +60,12 @@ func URLMustParse(s string) *url.URL { ...@@ -60,3 +60,12 @@ func URLMustParse(s string) *url.URL {
} }
return u return u
} }
func HTTPError(w http.ResponseWriter, r *http.Request, error string, code int) {
if r.ProtoAtLeast(1, 1) {
// Force client to disconnect if we render request error
w.Header().Set("Connection", "close")
}
http.Error(w, error, code)
}
package upstream
import (
"fmt"
"net/http"
"time"
)
type loggingResponseWriter struct {
rw http.ResponseWriter
status int
written int64
started time.Time
}
func newLoggingResponseWriter(rw http.ResponseWriter) loggingResponseWriter {
return loggingResponseWriter{
rw: rw,
started: time.Now(),
}
}
func (l *loggingResponseWriter) Header() http.Header {
return l.rw.Header()
}
func (l *loggingResponseWriter) Write(data []byte) (n int, err error) {
if l.status == 0 {
l.WriteHeader(http.StatusOK)
}
n, err = l.rw.Write(data)
l.written += int64(n)
return
}
func (l *loggingResponseWriter) WriteHeader(status int) {
if l.status != 0 {
return
}
l.status = status
l.rw.WriteHeader(status)
}
func (l *loggingResponseWriter) Log(r *http.Request) {
duration := time.Since(l.started)
fmt.Printf("%s %s - - [%s] %q %d %d %q %q %f\n",
r.Host, r.RemoteAddr, l.started,
fmt.Sprintf("%s %s %s", r.Method, r.RequestURI, r.Proto),
l.status, l.written, r.Referer(), r.UserAgent(), duration.Seconds(),
)
}
...@@ -55,18 +55,18 @@ func (u *Upstream) configureURLPrefix() { ...@@ -55,18 +55,18 @@ func (u *Upstream) configureURLPrefix() {
} }
func (u *Upstream) ServeHTTP(ow http.ResponseWriter, r *http.Request) { func (u *Upstream) ServeHTTP(ow http.ResponseWriter, r *http.Request) {
w := newLoggingResponseWriter(ow) w := helper.NewLoggingResponseWriter(ow)
defer w.Log(r) defer w.Log(r)
// Drop WebSocket connection and CONNECT method // Drop WebSocket connection and CONNECT method
if r.RequestURI == "*" { if r.RequestURI == "*" {
httpError(&w, r, "Connection upgrade not allowed", http.StatusBadRequest) helper.HTTPError(&w, r, "Connection upgrade not allowed", http.StatusBadRequest)
return return
} }
// Disallow connect // Disallow connect
if r.Method == "CONNECT" { if r.Method == "CONNECT" {
httpError(&w, r, "CONNECT not allowed", http.StatusBadRequest) helper.HTTPError(&w, r, "CONNECT not allowed", http.StatusBadRequest)
return return
} }
...@@ -74,7 +74,7 @@ func (u *Upstream) ServeHTTP(ow http.ResponseWriter, r *http.Request) { ...@@ -74,7 +74,7 @@ func (u *Upstream) ServeHTTP(ow http.ResponseWriter, r *http.Request) {
URIPath := urlprefix.CleanURIPath(r.URL.Path) URIPath := urlprefix.CleanURIPath(r.URL.Path)
prefix := u.URLPrefix prefix := u.URLPrefix
if !prefix.Match(URIPath) { if !prefix.Match(URIPath) {
httpError(&w, r, fmt.Sprintf("Not found %q", URIPath), http.StatusNotFound) helper.HTTPError(&w, r, fmt.Sprintf("Not found %q", URIPath), http.StatusNotFound)
return return
} }
...@@ -94,18 +94,9 @@ func (u *Upstream) ServeHTTP(ow http.ResponseWriter, r *http.Request) { ...@@ -94,18 +94,9 @@ func (u *Upstream) ServeHTTP(ow http.ResponseWriter, r *http.Request) {
if !foundService { if !foundService {
// The protocol spec in git/Documentation/technical/http-protocol.txt // The protocol spec in git/Documentation/technical/http-protocol.txt
// says we must return 403 if no matching service is found. // says we must return 403 if no matching service is found.
httpError(&w, r, "Forbidden", http.StatusForbidden) helper.HTTPError(&w, r, "Forbidden", http.StatusForbidden)
return return
} }
ro.handler.ServeHTTP(&w, r) ro.handler.ServeHTTP(&w, r)
} }
func httpError(w http.ResponseWriter, r *http.Request, error string, code int) {
if r.ProtoAtLeast(1, 1) {
// Force client to disconnect if we render request error
w.Header().Set("Connection", "close")
}
http.Error(w, error, code)
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment