diff --git a/CHANGELOG.next.asciidoc b/CHANGELOG.next.asciidoc index 10acecb4f81f..6cc040dd2ec3 100644 --- a/CHANGELOG.next.asciidoc +++ b/CHANGELOG.next.asciidoc @@ -109,6 +109,7 @@ is collected by it. - Ensure winlog input retains metric collection when handling recoverable errors. {issue}36479[36479] {pull}36483[36483] - Revert error introduced in {pull}35734[35734] when symlinks can't be resolved in filestream. {pull}36557[36557] - Fix ignoring external input configuration in `take_over: true` mode {issue}36378[36378] {pull}36395[36395] +- Add validation to http_endpoint config for empty URL {pull}36816[36816] {issue}36772[36772] *Heartbeat* diff --git a/x-pack/filebeat/input/http_endpoint/config.go b/x-pack/filebeat/input/http_endpoint/config.go index 48fa51bd00b1..b7fb61c21688 100644 --- a/x-pack/filebeat/input/http_endpoint/config.go +++ b/x-pack/filebeat/input/http_endpoint/config.go @@ -110,6 +110,10 @@ func (c *config) Validate() error { return errors.New("crc.provider is required when crc.secret is defined") } + if c.URL == "" { + return fmt.Errorf("webhook path URL can not be empty") + } + return nil } diff --git a/x-pack/filebeat/input/http_endpoint/config_test.go b/x-pack/filebeat/input/http_endpoint/config_test.go new file mode 100644 index 000000000000..f5318e214b46 --- /dev/null +++ b/x-pack/filebeat/input/http_endpoint/config_test.go @@ -0,0 +1,60 @@ +// Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one +// or more contributor license agreements. Licensed under the Elastic License; +// you may not use this file except in compliance with the Elastic License. + +package http_endpoint + +import ( + "fmt" + "net/http" + "testing" + + "github.com/stretchr/testify/assert" +) + +func Test_validateConfig(t *testing.T) { + testCases := []struct { + name string // Sub-test name. + config config // Load config parameters. + wantError error // Expected error + }{ + { + name: "invalid URL", + config: config{ + URL: "", + ResponseBody: `{"message": "success"}`, + Method: http.MethodPost, + }, + wantError: fmt.Errorf("webhook path URL can not be empty"), + }, + { + name: "invalid method", + config: config{ + URL: "/", + ResponseBody: `{"message": "success"}`, + Method: "random", + }, + wantError: fmt.Errorf("method must be POST, PUT or PATCH: random"), + }, + { + name: "invalid URL", + config: config{ + URL: "/", + ResponseBody: "", + Method: http.MethodPost, + }, + wantError: fmt.Errorf("response_body must be valid JSON"), + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + tc.config.URL = "" + // Execute config validation + err := tc.config.Validate() + + // Validate responses + assert.Equal(t, tc.wantError, err) + }) + } +}