diff --git a/caddyhttp/httpserver/replacer.go b/caddyhttp/httpserver/replacer.go index cf7dfccc..958758da 100644 --- a/caddyhttp/httpserver/replacer.go +++ b/caddyhttp/httpserver/replacer.go @@ -127,12 +127,9 @@ func NewReplacer(r *http.Request, rr *ResponseRecorder, emptyValue string) Repla return "" } - body, err := ioutil.ReadAll(r.Body) - // Create a new ReadCloser to keep the body from being drained. - r.Body = ioutil.NopCloser(bytes.NewBuffer(body)) - + body, err := readRequestBody(r) if err != nil { - log.Printf("[WARNING] Cannot read request body %v", err) + log.Printf("[WARNING] Cannot copy request body %v", err) return "" } @@ -164,6 +161,18 @@ func canLogRequest(r *http.Request) (canLog bool) { return } +// readRequestBody reads the request body and sets a +// new io.ReadCloser that has not yet been read. +func readRequestBody(r *http.Request) ([]byte, error) { + body, err := ioutil.ReadAll(r.Body) + if err != nil { + return nil, err + } + // Create a new ReadCloser to keep the body from being drained. + r.Body = ioutil.NopCloser(bytes.NewBuffer(body)) + return body, nil +} + // Replace performs a replacement of values on s and returns // the string with the replaced values. func (r *replacer) Replace(s string) string { diff --git a/caddyhttp/httpserver/replacer_test.go b/caddyhttp/httpserver/replacer_test.go index 158e819e..be87d582 100644 --- a/caddyhttp/httpserver/replacer_test.go +++ b/caddyhttp/httpserver/replacer_test.go @@ -1,6 +1,7 @@ package httpserver import ( + "bytes" "net/http" "net/http/httptest" "os" @@ -161,3 +162,25 @@ func TestRound(t *testing.T) { } } } + +func TestReadRequestBody(t *testing.T) { + r, err := http.NewRequest("POST", "/", strings.NewReader(`null`)) + if err != nil { + t.Error(err) + } + defer r.Body.Close() + + body, err := readRequestBody(r) + if err != nil { + t.Error("readRequestBody failed", err) + } + + var data = make([]byte, len(body)) + _, err = r.Body.Read(data) + + if err != nil { + t.Error(err) + } else if !bytes.Equal(body, data) { + t.Error("Expceted equal bytes.") + } +}