summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBessenyei Balázs Donát <bessbd@users.noreply.github.com>2021-01-12 19:12:40 +0100
committerGitHub <noreply@github.com>2021-01-12 18:12:40 +0000
commitbc9773a2f6199cc095aae8ae977eb8df75204dab (patch)
treeaad593d627b3a23ae677f8682cdec751e6eefbab
parenta89242d0dd8fb149e254c9ad546e1fded602f2dc (diff)
downloadcouchdb-bc9773a2f6199cc095aae8ae977eb8df75204dab.tar.gz
Allow gzipped requests to _session (#3323)
All endpoints but _session support gzip encoding and there's no practical reason for that. This commit enables gzip decoding on compressed requests to _session.
-rw-r--r--src/chttpd/test/eunit/chttpd_session_tests.erl12
-rw-r--r--src/couch/src/couch_httpd.erl1
-rw-r--r--src/couch/src/couch_httpd_auth.erl4
3 files changed, 14 insertions, 3 deletions
diff --git a/src/chttpd/test/eunit/chttpd_session_tests.erl b/src/chttpd/test/eunit/chttpd_session_tests.erl
index a802d9ec2..1e1fbf5e4 100644
--- a/src/chttpd/test/eunit/chttpd_session_tests.erl
+++ b/src/chttpd/test/eunit/chttpd_session_tests.erl
@@ -44,7 +44,8 @@ session_test_() ->
fun cleanup/1,
[
?TDEF_FE(session_authentication_db_absent),
- ?TDEF_FE(session_authentication_db_present)
+ ?TDEF_FE(session_authentication_db_present),
+ ?TDEF_FE(session_authentication_gzip_request)
]
}
}
@@ -62,6 +63,15 @@ session_authentication_db_present(Url) ->
?assertEqual(list_to_binary(Name), session_authentication_db(Url)).
+session_authentication_gzip_request(Url) ->
+ {ok, 200, _, Body} = test_request:request(
+ post,
+ Url,
+ [{"Content-Type", "application/json"}, {"Content-Encoding", "gzip"}],
+ zlib:gzip(jiffy:encode({[{username, list_to_binary(?USER)}, {password, list_to_binary(?PASS)}]}))),
+ {BodyJson} = jiffy:decode(Body),
+ ?assert(lists:member({<<"name">>, list_to_binary(?USER)}, BodyJson)).
+
session_authentication_db(Url) ->
{ok, 200, _, Body} = test_request:get(Url, [{basic_auth, {?USER, ?PASS}}]),
couch_util:get_nested_json_value(
diff --git a/src/couch/src/couch_httpd.erl b/src/couch/src/couch_httpd.erl
index 53d14d793..fb03bacb3 100644
--- a/src/couch/src/couch_httpd.erl
+++ b/src/couch/src/couch_httpd.erl
@@ -39,6 +39,7 @@
-export([check_max_request_length/1]).
-export([handle_request/1]).
-export([set_auth_handlers/0]).
+-export([maybe_decompress/2]).
-define(HANDLER_NAME_IN_MODULE_POS, 6).
-define(MAX_DRAIN_BYTES, 1048576).
diff --git a/src/couch/src/couch_httpd_auth.erl b/src/couch/src/couch_httpd_auth.erl
index e81cf040e..7d728e647 100644
--- a/src/couch/src/couch_httpd_auth.erl
+++ b/src/couch/src/couch_httpd_auth.erl
@@ -33,7 +33,7 @@
-export([jwt_authentication_handler/1]).
--import(couch_httpd, [header_value/2, send_json/2,send_json/4, send_method_not_allowed/2]).
+-import(couch_httpd, [header_value/2, send_json/2, send_json/4, send_method_not_allowed/2, maybe_decompress/2]).
-compile({no_auto_import,[integer_to_binary/1, integer_to_binary/2]}).
@@ -329,7 +329,7 @@ handle_session_req(#httpd{method='POST', mochi_req=MochiReq}=Req, AuthModule) ->
"application/x-www-form-urlencoded" ++ _ ->
mochiweb_util:parse_qs(ReqBody);
"application/json" ++ _ ->
- {Pairs} = ?JSON_DECODE(ReqBody),
+ {Pairs} = ?JSON_DECODE(maybe_decompress(Req, ReqBody)),
lists:map(fun({Key, Value}) ->
{?b2l(Key), ?b2l(Value)}
end, Pairs);