diff options
author | Bessenyei Balázs Donát <bessbd@apache.org> | 2019-10-23 17:04:05 +0200 |
---|---|---|
committer | Bessenyei Balázs Donát <Balazs.Donat.Bessenyei@ibm.com> | 2019-10-23 18:33:50 +0200 |
commit | a47f0fa8dde5f3b8d5c06649d8d896778c708f7e (patch) | |
tree | fbb4c237e9bd52844e9b18f4f801ce629d5c37b8 | |
parent | 79cfc1df5e5e8e0d495bc58187306e8f7bfe06dc (diff) | |
download | couchdb-a47f0fa8dde5f3b8d5c06649d8d896778c708f7e.tar.gz |
Make changes feed return bad request for invalid heartbeat values
Using a negative heartbeat value does not return a 400 bad request, instead getting just an empty response with no status code at all.
This commit adds extra checks so that negative and non-integer heartbeat values return 400 bad request responses.
This fixes #2234
-rw-r--r-- | src/chttpd/src/chttpd_db.erl | 9 | ||||
-rw-r--r-- | test/elixir/test/changes_test.exs | 43 |
2 files changed, 51 insertions, 1 deletions
diff --git a/src/chttpd/src/chttpd_db.erl b/src/chttpd/src/chttpd_db.erl index aba1bd22f..970495f0a 100644 --- a/src/chttpd/src/chttpd_db.erl +++ b/src/chttpd/src/chttpd_db.erl @@ -1816,7 +1816,14 @@ parse_changes_query(Req) -> {"heartbeat", "true"} -> Args#changes_args{heartbeat=true}; {"heartbeat", _} -> - Args#changes_args{heartbeat=list_to_integer(Value)}; + try list_to_integer(Value) of + HeartbeatInteger when HeartbeatInteger > 0 -> + Args#changes_args{heartbeat=HeartbeatInteger}; + _ -> + throw({bad_request, <<"The heartbeat value should be a positive integer (in milliseconds).">>}) + catch error:badarg -> + throw({bad_request, <<"Invalid heartbeat value. Expecting a positive integer value (in milliseconds).">>}) + end; {"timeout", _} -> Args#changes_args{timeout=list_to_integer(Value)}; {"include_docs", "true"} -> diff --git a/test/elixir/test/changes_test.exs b/test/elixir/test/changes_test.exs new file mode 100644 index 000000000..b5545087b --- /dev/null +++ b/test/elixir/test/changes_test.exs @@ -0,0 +1,43 @@ +defmodule ChangesTest do + use CouchTestCase + + @moduletag :changes + + @moduledoc """ + Test CouchDB /{db}/_changes + """ + + @tag :with_db + test "Changes feed negative heartbeat", context do + db_name = context[:db_name] + + resp = Couch.get( + "/#{db_name}/_changes", + query: %{ + :feed => "continuous", + :heartbeat => -1000 + } + ) + + assert resp.status_code == 400 + assert resp.body["error"] == "bad_request" + assert resp.body["reason"] == "The heartbeat value should be a positive integer (in milliseconds)." + end + + @tag :with_db + test "Changes feed non-integer heartbeat", context do + db_name = context[:db_name] + + resp = Couch.get( + "/#{db_name}/_changes", + query: %{ + :feed => "continuous", + :heartbeat => "a1000" + } + ) + + assert resp.status_code == 400 + assert resp.body["error"] == "bad_request" + assert resp.body["reason"] == "Invalid heartbeat value. Expecting a positive integer value (in milliseconds)." + end +end |