go-httplog/httplog.go
Vincent Batts 48732a6ea0
realips: better logging and fail back to ""
Signed-off-by: Vincent Batts <vbatts@hashbangbash.com>
2017-03-22 14:27:05 -04:00

97 lines
1.8 KiB
Go

package httplog
import (
"fmt"
"net"
"net/http"
"strings"
"time"
"github.com/Sirupsen/logrus"
)
var (
/* This default icon is empty with a long lived cache */
DefaultFavIcon FavIcon = defaultFavIcon{}
)
type defaultFavIcon struct {
}
func (dfi defaultFavIcon) ServeHTTP(w http.ResponseWriter, r *http.Request) {
LogRequest(r, 200)
w.Header().Set("Cache-Control", "max-age=315360000")
}
/* simple interface for a favicon */
type FavIcon interface {
ServeHTTP(w http.ResponseWriter, r *http.Request)
}
// for debugging request headers
func LogHeaders(r *http.Request) {
fmt.Printf("HEADERS:\n")
for k, v := range r.Header {
fmt.Printf("\t%s\n", k)
for i, _ := range v {
fmt.Printf("\t\t%s\n", v[i])
}
}
}
/* kindof a common log type output */
func LogRequest(r *http.Request, statusCode int) {
var addr string
var user_agent string
user_agent = ""
addr = RealIP(r)
for k, v := range r.Header {
if k == "User-Agent" {
user_agent = strings.Join(v, " ")
}
if k == "X-Forwarded-For" {
addr = strings.Join(v, " ")
}
}
fmt.Printf("%s - - [%s] \"%s %s\" \"%s\" %d %d\n",
addr,
time.Now().Format(time.RFC1123Z),
r.Method,
r.URL.String(),
user_agent,
statusCode,
r.ContentLength)
}
func RealIP(r *http.Request) string {
rip := RealIPs(r)
if len(rip) == 0 {
return ""
}
return rip[len(rip)-1]
}
func RealIPs(r *http.Request) (ips []string) {
logrus.Infof("httplog: RemoteAddr: %q", r.RemoteAddr)
ip, _, err := net.SplitHostPort(r.RemoteAddr)
if err != nil {
logrus.Errorf("httplog: %q", err)
return nil
}
if ip != "" {
ips = append(ips, ip)
}
val := r.Header.Get("X-Forwarded-For")
logrus.Infof("httplog: X-Forwarded-For: %q", val)
if val != "" {
for _, ip := range strings.Split(val, ", ") {
ips = append(ips, ip)
}
}
return ips
}