aboutsummaryrefslogtreecommitdiff
path: root/src/web
diff options
context:
space:
mode:
authorAlexey Shchepin <alexey@process-one.net>2012-03-07 16:19:59 +0200
committerAlexey Shchepin <alexey@process-one.net>2012-03-07 16:19:59 +0200
commit0b423eb28756e88895ecb7dcf7cbf71d7cbf1571 (patch)
tree89e9703b9ebec1dd8b3cb4711c0ecfa58997dcbb /src/web
parentAvoid quadratic behavior in reading SSL data (diff)
Don't ignore Length parameter in tls:recv
Diffstat (limited to 'src/web')
-rw-r--r--src/web/ejabberd_http.erl52
1 files changed, 20 insertions, 32 deletions
diff --git a/src/web/ejabberd_http.erl b/src/web/ejabberd_http.erl
index aff928f72..fab09782a 100644
--- a/src/web/ejabberd_http.erl
+++ b/src/web/ejabberd_http.erl
@@ -192,38 +192,30 @@ receive_headers(State) ->
_ ->
case Data of
{ok, Binary} ->
- process_requests(State, binary_to_list(Binary));
+ {Request, Trail} = parse_request(
+ State,
+ State#state.trail ++ binary_to_list(Binary)),
+ State1 = State#state{trail = Trail},
+ NewState = lists:foldl(
+ fun(D, S) ->
+ case S#state.end_of_request of
+ true ->
+ S;
+ _ ->
+ process_header(S, D)
+ end
+ end, State1, Request),
+ case NewState#state.end_of_request of
+ true ->
+ ok;
+ _ ->
+ receive_headers(NewState)
+ end;
_ ->
ok
end
end.
-process_requests(State, Data) ->
- {Request, Trail} = parse_request(
- State,
- State#state.trail ++ Data),
- State1 = State#state{trail = Trail},
- NewState = lists:foldl(
- fun(D, S) ->
- case S#state.end_of_request of
- true ->
- S;
- _ ->
- process_header(S, D)
- end
- end, State1, Request),
- case State1#state.trail of
- [] ->
- case NewState#state.end_of_request of
- true ->
- ok;
- _ ->
- receive_headers(NewState)
- end;
- _ ->
- process_requests(State1, "")
- end.
-
process_header(State, Data) ->
SockMod = State#state.sockmod,
Socket = State#state.socket,
@@ -599,11 +591,7 @@ recv_data(_State, 0, Acc) ->
recv_data(State, Len, Acc) ->
case State#state.trail of
[] ->
- Len2 = case State#state.sockmod of
- gen_tcp -> Len;
- _ -> 0
- end,
- case (State#state.sockmod):recv(State#state.socket, Len2, 300000) of
+ case (State#state.sockmod):recv(State#state.socket, Len, 300000) of
{ok, Data} ->
recv_data(State, Len - size(Data), [Acc | [Data]]);
_ ->