package main import ( "flag" "fmt" "net/http" "net/http/httputil" "os" "strings" "time" ) var logFile *string func main() { logFile = flag.String("logfile", "requests.log", "the file to log requests to") flag.Parse() http.HandleFunc("/", post) err := http.ListenAndServe(":8080", nil) if err != nil { panic(err) } } func post(w http.ResponseWriter, r *http.Request) { reqDump, err := httputil.DumpRequest(r, true) if err != nil { w.WriteHeader(500) w.Write([]byte(err.Error())) return } dump := logString(r.RemoteAddr, reqDump) // log to stdout fmt.Print(dump) // log to logfile lf, err := os.OpenFile(*logFile, os.O_CREATE | os.O_APPEND | os.O_WRONLY, 0644) if err != nil { fmt.Printf("failed to open log file: %v", err) w.WriteHeader(500) w.Write([]byte(fmt.Sprintf("failed to open log file: %v", err))) } defer lf.Close() lf.WriteString(dump) // echo log message as response w.WriteHeader(200) w.Write([]byte(dump)) } func logString(senderIP string, reqDump []byte) string { var sb strings.Builder sb.WriteString(fmt.Sprintf("Received request from %v at %v:\n\n", senderIP, time.Now())) sb.Write(reqDump) sb.WriteString("\n\n") return sb.String() }