From 297c64d771d1f3a78ccb4ed29dce740d91f53e28 Mon Sep 17 00:00:00 2001 From: Joshua Powers Date: Wed, 5 Jun 2024 04:58:42 -0600 Subject: [PATCH] feat(inputs.http_listener): Allow setting custom success return code (#15454) --- plugins/inputs/http_listener_v2/README.md | 4 ++++ .../inputs/http_listener_v2/http_listener_v2.go | 7 ++++++- .../http_listener_v2/http_listener_v2_test.go | 17 +++++++++++++++++ plugins/inputs/http_listener_v2/sample.conf | 4 ++++ 4 files changed, 31 insertions(+), 1 deletion(-) diff --git a/plugins/inputs/http_listener_v2/README.md b/plugins/inputs/http_listener_v2/README.md index 70d4605f4..688f335b8 100644 --- a/plugins/inputs/http_listener_v2/README.md +++ b/plugins/inputs/http_listener_v2/README.md @@ -53,6 +53,10 @@ See the [CONFIGURATION.md][CONFIGURATION.md] for more details. ## requests and included in responses. # http_headers = {"HTTP_HEADER" = "TAG_NAME"} + ## HTTP Return Success Code + ## This is the HTTP code that will be returned on success + # http_success_code = 204 + ## maximum duration before timing out read of the request # read_timeout = "10s" ## maximum duration before timing out write of the response diff --git a/plugins/inputs/http_listener_v2/http_listener_v2.go b/plugins/inputs/http_listener_v2/http_listener_v2.go index 310daf7ca..57906bfb7 100644 --- a/plugins/inputs/http_listener_v2/http_listener_v2.go +++ b/plugins/inputs/http_listener_v2/http_listener_v2.go @@ -54,6 +54,7 @@ type HTTPListenerV2 struct { WriteTimeout config.Duration `toml:"write_timeout"` MaxBodySize config.Size `toml:"max_body_size"` Port int `toml:"port"` + SuccessCode int `toml:"http_success_code"` BasicUsername string `toml:"basic_username"` BasicPassword string `toml:"basic_password"` HTTPHeaderTags map[string]string `toml:"http_header_tags"` @@ -160,6 +161,10 @@ func (h *HTTPListenerV2) Init() error { h.listener = listener h.Port = listener.Addr().(*net.TCPAddr).Port + if h.SuccessCode == 0 { + h.SuccessCode = http.StatusNoContent + } + return nil } @@ -246,7 +251,7 @@ func (h *HTTPListenerV2) serveWrite(res http.ResponseWriter, req *http.Request) h.acc.AddMetric(m) } - res.WriteHeader(http.StatusNoContent) + res.WriteHeader(h.SuccessCode) } func (h *HTTPListenerV2) collectBody(res http.ResponseWriter, req *http.Request) ([]byte, bool) { diff --git a/plugins/inputs/http_listener_v2/http_listener_v2_test.go b/plugins/inputs/http_listener_v2/http_listener_v2_test.go index 834806d0c..1924ae851 100644 --- a/plugins/inputs/http_listener_v2/http_listener_v2_test.go +++ b/plugins/inputs/http_listener_v2/http_listener_v2_test.go @@ -277,6 +277,23 @@ func TestWriteHTTPWithPathTag(t *testing.T) { ) } +func TestWriteHTTPWithReturnCode(t *testing.T) { + listener, err := newTestHTTPListenerV2() + require.NoError(t, err) + listener.SuccessCode = 200 + + acc := &testutil.Accumulator{} + require.NoError(t, listener.Init()) + require.NoError(t, listener.Start(acc)) + defer listener.Stop() + + // post single message to listener + resp, err := http.Post(createURL(listener, "http", "/write", "db=mydb"), "", bytes.NewBuffer([]byte(testMsgNoNewline))) + require.NoError(t, err) + require.NoError(t, resp.Body.Close()) + require.EqualValues(t, 200, resp.StatusCode) +} + // http listener should add request path as configured path_tag (trimming it before) func TestWriteHTTPWithMultiplePaths(t *testing.T) { listener, err := newTestHTTPListenerV2() diff --git a/plugins/inputs/http_listener_v2/sample.conf b/plugins/inputs/http_listener_v2/sample.conf index 1e910d82c..56b6eba4c 100644 --- a/plugins/inputs/http_listener_v2/sample.conf +++ b/plugins/inputs/http_listener_v2/sample.conf @@ -17,6 +17,10 @@ ## requests and included in responses. # http_headers = {"HTTP_HEADER" = "TAG_NAME"} + ## HTTP Return Success Code + ## This is the HTTP code that will be returned on success + # http_success_code = 204 + ## maximum duration before timing out read of the request # read_timeout = "10s" ## maximum duration before timing out write of the response