diff options
author | Holger Weiss <holger@zedat.fu-berlin.de> | 2016-09-27 23:22:30 +0200 |
---|---|---|
committer | Holger Weiss <holger@zedat.fu-berlin.de> | 2016-09-27 23:22:30 +0200 |
commit | d4b4f35a0ecff8fdad416a7f3bab85a2b7a7e375 (patch) | |
tree | 2e4b78160b0d377953ce78059462f8ec59bb69f9 /src/ejabberd_http.erl | |
parent | Use inets instead of lhttpc in http_p1 (diff) |
ejabberd_http: Handle missing POST data gracefully
Return a "bad request" error instead of crashing if receiving POST/PUT
data fails.
Diffstat (limited to 'src/ejabberd_http.erl')
-rw-r--r-- | src/ejabberd_http.erl | 29 |
1 files changed, 16 insertions, 13 deletions
diff --git a/src/ejabberd_http.erl b/src/ejabberd_http.erl index 31f80be7..e6e49d9b 100644 --- a/src/ejabberd_http.erl +++ b/src/ejabberd_http.erl @@ -396,18 +396,21 @@ extract_path_query(#state{request_method = Method, socket = _Socket} = State) when (Method =:= 'POST' orelse Method =:= 'PUT') andalso is_integer(Len) -> - {NewState, Data} = recv_data(State, Len), - ?DEBUG("client data: ~p~n", [Data]), - case catch url_decode_q_split(Path) of - {'EXIT', _} -> {NewState, false}; - {NPath, _Query} -> - LPath = normalize_path([NPE - || NPE <- str:tokens(path_decode(NPath), <<"/">>)]), - LQuery = case catch parse_urlencoded(Data) of - {'EXIT', _Reason} -> []; - LQ -> LQ - end, - {NewState, {LPath, LQuery, Data}} + case recv_data(State, Len) of + error -> {State, false}; + {NewState, Data} -> + ?DEBUG("client data: ~p~n", [Data]), + case catch url_decode_q_split(Path) of + {'EXIT', _} -> {NewState, false}; + {NPath, _Query} -> + LPath = normalize_path([NPE + || NPE <- str:tokens(path_decode(NPath), <<"/">>)]), + LQuery = case catch parse_urlencoded(Data) of + {'EXIT', _Reason} -> []; + LQ -> LQ + end, + {NewState, {LPath, LQuery, Data}} + end end; extract_path_query(State) -> {State, false}. @@ -525,7 +528,7 @@ recv_data(State, Len, Acc) -> recv_data(State, Len - byte_size(Data), <<Acc/binary, Data/binary>>); Err -> ?DEBUG("Cannot receive HTTP data: ~p", [Err]), - <<"">> + error end; _ -> Trail = (State#state.trail), |