summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorErlang/OTP <otp@erlang.org>2023-04-25 17:08:49 +0200
committerErlang/OTP <otp@erlang.org>2023-04-25 17:08:49 +0200
commit23eaeeaf27c3a355393bdfac90c193c690c165e0 (patch)
tree2ce8552502e770e2c8d3109f8e253d816be6e1b3
parentce739f2b3212d35e4ccc4ba87d6f7456d35a731f (diff)
parent7a1feefa4468ede9abdd3c64c63b3a8ce8585988 (diff)
downloaderlang-23eaeeaf27c3a355393bdfac90c193c690c165e0.tar.gz
Merge branch 'ingela/inets/httpc/maint-25/queue-bug/OTP-18509' into maint-25
* ingela/inets/httpc/maint-25/queue-bug/OTP-18509: inets: httpc - fix pipeline and keepalive queue bug
-rw-r--r--lib/inets/src/http_client/httpc_handler.erl20
1 files changed, 11 insertions, 9 deletions
diff --git a/lib/inets/src/http_client/httpc_handler.erl b/lib/inets/src/http_client/httpc_handler.erl
index 63e26f5266..b7b8dd7055 100644
--- a/lib/inets/src/http_client/httpc_handler.erl
+++ b/lib/inets/src/http_client/httpc_handler.erl
@@ -322,7 +322,7 @@ terminate(normal,
cancel_timers(Timers),
%% Maybe deliver answers to requests
- deliver_answer(Request),
+ maybe_deliver_answer(Request, State),
%% And, just in case, close our side (**really** overkill)
http_transport:close(SocketType, Socket);
@@ -706,24 +706,26 @@ call(Msg, Pid) ->
cast(Msg, Pid) ->
gen_server:cast(Pid, Msg).
-maybe_retry_queue(Q, State) ->
- case queue:is_empty(Q) of
- false ->
+maybe_retry_queue(Q, #state{status = new} = State) ->
+ retry_pipeline(queue:to_list(Q), State);
+maybe_retry_queue(Q, #state{request = Request} = State) ->
+ case Request of
+ undefined ->
retry_pipeline(queue:to_list(Q), State);
- true ->
- ok
+ _ ->
+ retry_pipeline(queue:to_list(queue:cons(Request, Q)), State)
end.
-
+
maybe_send_answer(#request{from = answer_sent}, _Reason, State) ->
State;
maybe_send_answer(Request, Answer, State) ->
answer_request(Request, Answer, State).
-deliver_answer(#request{from = From} = Request)
+maybe_deliver_answer(#request{from = From} = Request, #state{status = new})
when From =/= answer_sent ->
Response = httpc_response:error(Request, socket_closed_remotely),
httpc_response:send(From, Response);
-deliver_answer(_Request) ->
+maybe_deliver_answer(_,_) ->
ok.
%%%--------------------------------------------------------------------