package main import ( "encoding/json" "flag" "log" "net/http" "strings" ) type jsonOutput struct { Ip string `json:"ip"` } func ipJsonOutput(w http.ResponseWriter, r *http.Request) { var ip jsonOutput ip.Ip = remoteAddr(r) output, err := json.Marshal(ip) if err != nil { w.Write([]byte(err.Error())) } w.Write([]byte(output)) } func ipOutput(w http.ResponseWriter, r *http.Request) { ip := remoteAddr(r) w.Write([]byte(ip)) } func remoteAddr(r *http.Request) string { var ip string if r.RemoteAddr[0] == '[' { ip = strings.Split(r.RemoteAddr, "]")[0][1:] } else { ip = strings.Split(r.RemoteAddr, ":")[0] } return ip } func main() { addr := flag.String("addr", ":8080", "local ip:port to bind") flag.Parse() http.HandleFunc("/", ipOutput) http.HandleFunc("/json", ipJsonOutput) log.Fatal(http.ListenAndServe(*addr, nil)) }