Я постоянно пойман, прочитав io.ReadCloser и затем забыв, что я читал это раньше, и когда я читаю это снова, я получаю пустую полезную нагрузку. Хотелось бы, чтобы был какой-нибудь чек на мою глупость. Тем не менее, я думаю, что могу использовать TeeReader, но он не отвечает моим ожиданиям:
func main() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
buf := &bytes.Buffer{}
tee := io.TeeReader(r.Body, buf)
body, err := ioutil.ReadAll(tee)
if err != nil {
http.Error(w, err.Error(), http.StatusBadRequest)
return
}
log.Println("body", string(body))
payload, err := httputil.DumpRequest(r, true)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
log.Println("dump request", string(payload))
w.WriteHeader(http.StatusOK)
})
log.Fatal(http.ListenAndServe(":8080", nil))
}
Тело отсутствует в моей строке журнала "dump dump".
т.е. когда я бегу curl -i -X POST --data '{"username":"xyz","password":"xyz"}' http://localhost:8080
Я хочу полный запрос оригинала:
2019/01/14 11:09:50 dump request POST / HTTP/1.1
Host: localhost:8080
Accept: */*
Content-Length: 35
Content-Type: application/x-www-form-urlencoded
User-Agent: curl/7.63.0
{"username":"xyz","password":"xyz"}
Чего мне не хватает?