Skip to content

Commit f01d7cc

Browse files
authored
Merge pull request #10 from daichirata/reject-empty-keys
Drop empty-key pairs in query_string_parser
2 parents 4cf8f40 + 46eb0e6 commit f01d7cc

3 files changed

Lines changed: 26 additions & 0 deletions

File tree

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,8 @@ When a component is missing (no query, no fragment, etc.) the default is to emit
150150

151151
Decomposes a query string field into individual parameters.
152152

153+
> Pairs with an empty key (e.g. the leading `&` in `&foo=1`) are silently dropped — they're noise from user-supplied URLs and never represent a real parameter.
154+
153155
### Minimal example
154156

155157
```aconf

lib/fluent/plugin/filter_query_string_parser.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ def filter(tag, time, record)
2727

2828
begin
2929
params = Addressable::URI.form_unencode(raw_value)
30+
params = params.reject {|k, _| k.nil? || k.empty? }
3031

3132
unless params.empty?
3233
if @multi_value_params

test/plugin/test_filter_query_string_parser.rb

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,29 @@ def test_filter
3030
assert_equal "fuga", records[0]["hoge"]
3131
end
3232

33+
def test_filter_drops_empty_keys
34+
config = %[
35+
key_name query
36+
hash_value_field parsed
37+
]
38+
39+
d1 = create_driver(config)
40+
d1.run(default_tag: @tag) do
41+
d1.feed(@time, { "query" => "&partnerid=12345" })
42+
d1.feed(@time, { "query" => "=value&foo=bar" })
43+
d1.feed(@time, { "query" => "&&foo=bar&&" })
44+
d1.feed(@time, { "query" => "foo=&bar=baz" })
45+
end
46+
records = d1.filtered_records
47+
48+
assert_equal 4, records.length
49+
50+
assert_equal({ "partnerid" => "12345" }, records[0]["parsed"])
51+
assert_equal({ "foo" => "bar" }, records[1]["parsed"])
52+
assert_equal({ "foo" => "bar" }, records[2]["parsed"])
53+
assert_equal({ "foo" => "", "bar" => "baz" }, records[3]["parsed"])
54+
end
55+
3356
def test_filter_non_ascii
3457
config = %[
3558
key_name query

0 commit comments

Comments
 (0)