diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc index 7ec2e0a68e8f..71ed7a4d32b3 100644 --- a/CHANGELOG.asciidoc +++ b/CHANGELOG.asciidoc @@ -45,6 +45,8 @@ https://github.com/elastic/beats/compare/v5.3.0...master[Check the HEAD diff] *Affecting all Beats* - Update index mappings to support future Elasticsearch 6.X. {pull}3778[3778] +- Add `_id`, `_type`, `_index` and `_score` fields in the generated index pattern. {pull}3282[3282] +- Fix potential elasticsearch output URL parsing error if protocol scheme is missing. {pull}3671[3671] *Filebeat* diff --git a/libbeat/outputs/elasticsearch/url.go b/libbeat/outputs/elasticsearch/url.go index 04c6e8de75e6..117306b4fccf 100644 --- a/libbeat/outputs/elasticsearch/url.go +++ b/libbeat/outputs/elasticsearch/url.go @@ -4,9 +4,12 @@ import ( "fmt" "net" "net/url" + "regexp" "strings" ) +var hasScheme = regexp.MustCompile(`^([a-z][a-z0-9+\-.]*)://`) + // Creates the url based on the url configuration. // Adds missing parts with defaults (scheme, host, port) func getURL(defaultScheme string, defaultPath string, rawURL string) (string, error) { @@ -15,6 +18,10 @@ func getURL(defaultScheme string, defaultPath string, rawURL string) (string, er defaultScheme = "http" } + if !hasScheme.MatchString(rawURL) { + rawURL = fmt.Sprintf("%v://%v", defaultScheme, rawURL) + } + addr, err := url.Parse(rawURL) if err != nil { return "", err @@ -24,22 +31,6 @@ func getURL(defaultScheme string, defaultPath string, rawURL string) (string, er host := addr.Host port := "9200" - // sanitize parse errors if url does not contain scheme - // if parse url looks funny, prepend schema and try again: - if addr.Scheme == "" || (addr.Host == "" && addr.Path == "" && addr.Opaque != "") { - rawURL = fmt.Sprintf("%v://%v", defaultScheme, rawURL) - if tmpAddr, err := url.Parse(rawURL); err == nil { - addr = tmpAddr - scheme = addr.Scheme - host = addr.Host - } else { - // If url doesn't have a scheme, host is written into path. For example: 192.168.3.7 - scheme = defaultScheme - host = addr.Path - addr.Path = "" - } - } - if host == "" { host = "localhost" } else { diff --git a/libbeat/outputs/elasticsearch/url_test.go b/libbeat/outputs/elasticsearch/url_test.go index 8821f0086e58..2e73aacd3a41 100644 --- a/libbeat/outputs/elasticsearch/url_test.go +++ b/libbeat/outputs/elasticsearch/url_test.go @@ -79,6 +79,8 @@ func TestGetUrl(t *testing.T) { "http://localhost/": "http://localhost:9200/", // no schema + hostname + "33f3600fd5c1bb599af557c36a4efb08.host": "http://33f3600fd5c1bb599af557c36a4efb08.host:9200", + "33f3600fd5c1bb599af557c36a4efb08.host:12345": "http://33f3600fd5c1bb599af557c36a4efb08.host:12345", "localhost": "http://localhost:9200", "localhost:80": "http://localhost:80", "localhost:80/": "http://localhost:80/",