diff options
author | Kirilll Zaborsky <[email protected]> | 2014-10-08 15:31:13 +0400 |
---|---|---|
committer | Ingela Anderton Andin <[email protected]> | 2014-12-01 16:51:42 +0100 |
commit | d7142993ed372c7f51ba381d5166ec7707951670 (patch) | |
tree | 41ea35c3ca5ad3918db0a8166811703286ef4264 /lib/inets/src | |
parent | 3651fbc0ff9b87c3ffe765ad1583e025f31d2259 (diff) | |
download | otp-d7142993ed372c7f51ba381d5166ec7707951670.tar.gz otp-d7142993ed372c7f51ba381d5166ec7707951670.tar.bz2 otp-d7142993ed372c7f51ba381d5166ec7707951670.zip |
inets: stop httpc_handler on 'connection closed' send error
httpc_handler should be stopped when sending requests returns error
because of a closed connection and `tcp_closed` message could not be
catched (see http://erlang.org/pipermail/erlang-bugs/2007-May/000346.html )
otherwise it will lead to process leak.
Diffstat (limited to 'lib/inets/src')
-rw-r--r-- | lib/inets/src/http_client/httpc_handler.erl | 19 |
1 files changed, 10 insertions, 9 deletions
diff --git a/lib/inets/src/http_client/httpc_handler.erl b/lib/inets/src/http_client/httpc_handler.erl index 0a42e7210c..7f7328f1d9 100644 --- a/lib/inets/src/http_client/httpc_handler.erl +++ b/lib/inets/src/http_client/httpc_handler.erl @@ -316,8 +316,9 @@ handle_call(#request{address = Addr} = Request, _, {reply, ok, State} end; {error, Reason} -> - ?hcri("failed sending request", [{reason, Reason}]), - {reply, {pipeline_failed, Reason}, State0} + ?hcri("failed sending request", [{reason, Reason}]), + NewPipeline = queue:in(Request, State0#state.pipeline), + {stop, shutdown, {pipeline_failed, Reason}, State0#state{pipeline = NewPipeline}} end; handle_call(#request{address = Addr} = Request, _, @@ -355,25 +356,25 @@ handle_call(#request{address = Addr} = Request, _, ?hcrd("no current request", []), cancel_timer(Timers#timers.queue_timer, timeout_queue), + NewTimers = Timers#timers{queue_timer = undefined}, + State1 = State0#state{timers = NewTimers}, Address = handle_proxy(Addr, Proxy), case httpc_request:send(Address, Session, Request) of ok -> ?hcrd("request sent", []), %% Activate the request time out for the new request - State1 = - activate_request_timeout(State0#state{request = Request}), - NewTimers = State1#state.timers, + State2 = + activate_request_timeout(State1#state{request = Request}), NewSession = Session#session{queue_length = 1, client_close = ClientClose}, insert_session(NewSession, ProfileName), - State = init_wait_for_response_state(Request, State1#state{session = NewSession, - timers = NewTimers}), + State = init_wait_for_response_state(Request, State2#state{session = NewSession}), {reply, ok, State}; {error, Reason} -> ?hcri("failed sending request", [{reason, Reason}]), - {reply, {request_failed, Reason}, State0} + {stop, shutdown, {keepalive_failed, Reason}, State1} end end; @@ -1329,7 +1330,7 @@ handle_keep_alive_queue(#state{status = keep_alive, Session, <<>>, State#state{keep_alive = KeepAlive}); {error, Reason} -> - {reply, {keep_alive_failed, Reason}, State} + {stop, shutdown, {keepalive_failed, Reason}, State} end end end. |