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(":3000", 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 } // log to stdout fmt.Print(logString(reqDump)) // 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(logString(reqDump)) // echo log message as response w.WriteHeader(200) w.Write([]byte(logString(reqDump))) } func logString(reqDump []byte) string { var sb strings.Builder sb.WriteString(fmt.Sprintf("Received request at %v:\n\n", time.Now())) sb.Write(reqDump) sb.WriteString("\n\n") return sb.String() }