44 lines
739 B
Go
44 lines
739 B
Go
package main
|
|
|
|
import (
|
|
"log"
|
|
"net"
|
|
"net/http"
|
|
"strings"
|
|
)
|
|
|
|
func main() {
|
|
http.HandleFunc("/", handler)
|
|
err := http.ListenAndServe(":8080", nil)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
}
|
|
|
|
func handler(w http.ResponseWriter, req *http.Request) {
|
|
ip := ""
|
|
ips := proxy(req)
|
|
if len(ips) > 0 && len(ips[0]) > 0 {
|
|
rip, _, err := net.SplitHostPort(ips[0])
|
|
ip = rip
|
|
if err != nil {
|
|
ip = ips[0]
|
|
}
|
|
} else {
|
|
if rip, _, err := net.SplitHostPort(req.RemoteAddr); err == nil {
|
|
ip = rip
|
|
} else {
|
|
ip = req.RemoteAddr
|
|
}
|
|
}
|
|
w.WriteHeader(200)
|
|
w.Write([]byte(ip))
|
|
}
|
|
|
|
func proxy(req *http.Request) []string {
|
|
if ips := req.Header.Get("X-Forwarded-For"); len(ips) > 0 {
|
|
return strings.Split(ips, ",")
|
|
}
|
|
return []string{}
|
|
}
|