55 lines
1.2 KiB
Go
55 lines
1.2 KiB
Go
package nettools
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"html"
|
|
"net"
|
|
"net/http"
|
|
|
|
"git.0cd.xyz/michael/gtools/colour"
|
|
"git.0cd.xyz/michael/gtools/logger"
|
|
)
|
|
|
|
// IP returns IP address from requester
|
|
func IP(r *http.Request) (net.IP, error) {
|
|
realip := r.Header.Get("x-forwarded-for")
|
|
if realip != "" {
|
|
return net.ParseIP(realip), nil
|
|
}
|
|
ip, _, err := net.SplitHostPort(r.RemoteAddr)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return net.ParseIP(ip), nil
|
|
}
|
|
|
|
// Hostname returns hostname
|
|
func Hostname(ip net.IP) ([]string, error) {
|
|
names, err := net.LookupAddr(ip.String())
|
|
unknown := []string{"unknown host"}
|
|
if err != nil {
|
|
return unknown, err
|
|
}
|
|
if len(names) == 0 {
|
|
return unknown, fmt.Errorf("unknown hostname for %v", ip.String())
|
|
}
|
|
return names, nil
|
|
}
|
|
|
|
// AccessMessage returns client access message
|
|
func AccessMessage(r *http.Request, statuscode int, logger *logger.Logger) {
|
|
ip, err := IP(r)
|
|
if err != nil {
|
|
logger.Error.SlientWrite(err)
|
|
return
|
|
}
|
|
hostname, err := Hostname(ip)
|
|
if err != nil {
|
|
logger.Error.SlientWrite(err)
|
|
return
|
|
}
|
|
out := fmt.Sprintf("%s %v - %s %s %s", ip, hostname, r.Method, colour.Status(statuscode), html.EscapeString(r.URL.Path))
|
|
logger.Access.Write(errors.New(out))
|
|
}
|