grim/goserve

Implement combined log format instead of common (adds referer and user-agent)
package main
import (
"fmt"
"net/http"
"strings"
"time"
)
func basicHandler(h http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
rw := &responseWriter{w: w}
defer func() {
// implement the NCSA Combined Log Format
// http://publib.boulder.ibm.com/tividd/td/ITWSA/ITWSA_info45/en_US/HTML/guide/c-logs.html#combined
addr := r.RemoteAddr
// we use LastIndex so we can parse IPv6 addresses
if idx := strings.LastIndex(addr, ":"); idx != -1 {
addr = addr[:idx]
}
username := "-"
if user, _, ok := r.BasicAuth(); ok && username != "" {
username = user
}
referer := r.Referer()
if referer == "" {
referer = "-"
}
userAgent := r.UserAgent()
if userAgent == "" {
userAgent = "-"
}
fmt.Printf(
"%s - %s [%s] \"%s %s %s\" %d %d %q %q\n",
addr,
username,
time.Now().Format("02/Jan/2006:15:04:05 -0700"),
r.Method,
r.URL.Path,
r.Proto,
rw.StatusCode(),
rw.Written(),
referer,
userAgent,
)
}()
h.ServeHTTP(rw, r)
})
}