diff --git a/plugins/inputs/http/http.go b/plugins/inputs/http/http.go index 27de16916a63a..247a95e4ea07d 100644 --- a/plugins/inputs/http/http.go +++ b/plugins/inputs/http/http.go @@ -1,9 +1,11 @@ package http import ( + "bytes" "context" "fmt" "io" + "io/ioutil" "net/http" "os" "strings" @@ -95,9 +97,6 @@ func (h *HTTP) gatherURL( if err != nil { return err } - if body != nil { - defer body.Close() - } request, err := http.NewRequest(h.Method, url, body) if err != nil { @@ -175,7 +174,7 @@ func (h *HTTP) gatherURL( return nil } -func makeRequestBodyReader(contentEncoding, body string) (io.ReadCloser, error) { +func makeRequestBodyReader(contentEncoding, body string) (io.Reader, error) { if body == "" { return nil, nil } @@ -186,10 +185,14 @@ func makeRequestBodyReader(contentEncoding, body string) (io.ReadCloser, error) if err != nil { return nil, err } - return rc, nil + data, err := ioutil.ReadAll(rc) + if err != nil { + return nil, err + } + return bytes.NewReader(data), nil } - return io.NopCloser(reader), nil + return reader, nil } func init() { diff --git a/plugins/inputs/http/http_test.go b/plugins/inputs/http/http_test.go index 68ff02ba8879b..8b29bf89f24e3 100644 --- a/plugins/inputs/http/http_test.go +++ b/plugins/inputs/http/http_test.go @@ -94,6 +94,40 @@ func TestHTTPHeaders(t *testing.T) { require.NoError(t, acc.GatherError(plugin.Gather)) } +func TestHTTPContentLengthHeader(t *testing.T) { + fakeServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if r.URL.Path == "/endpoint" { + if r.Header.Get("Content-Length") != "" { + _, _ = w.Write([]byte(simpleJSON)) + } else { + w.WriteHeader(http.StatusForbidden) + } + } else { + w.WriteHeader(http.StatusNotFound) + } + })) + defer fakeServer.Close() + + address := fakeServer.URL + "/endpoint" + plugin := &httpplugin.HTTP{ + URLs: []string{address}, + Headers: map[string]string{}, + Body: "{}", + Log: testutil.Logger{}, + } + + plugin.SetParserFunc(func() (telegraf.Parser, error) { + return parsers.NewParser(&parsers.Config{ + DataFormat: "json", + MetricName: "metricName", + }) + }) + + var acc testutil.Accumulator + require.NoError(t, plugin.Init()) + require.NoError(t, acc.GatherError(plugin.Gather)) +} + func TestInvalidStatusCode(t *testing.T) { fakeServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusNotFound)