Add support for handling redirection HTTP Response Codes

This commit is contained in:
Badlop 2023-01-30 15:00:18 +01:00
parent 0db49856b8
commit 4106ae484c
1 changed files with 24 additions and 6 deletions

View File

@ -213,13 +213,22 @@ make_req(Method, Path, LUser, LServer, Password) ->
Connection = cuesport:get_worker(existing_pool_name(LServer)),
?DEBUG("Making request '~s' for user ~s@~s...", [Path, LUser, LServer]),
{ok, {{Code, _Reason}, _RespHeaders, RespBody, _, _}} = case Method of
get -> fusco:request(Connection, <<PathPrefix/binary, Path/binary, "?", Query/binary>>,
"GET", Header, "", 2, 5000);
post -> fusco:request(Connection, <<PathPrefix/binary, Path/binary>>,
"POST", [ContentType|Header], Query, 2, 5000)
end,
{Url, MethodStr, Headers, Query2} =
case Method of
get -> {<<PathPrefix/binary, Path/binary, "?", Query/binary>>,
"GET",
Header,
""};
post -> {<<PathPrefix/binary, Path/binary>>,
"POST",
[ContentType|Header],
Query}
end,
http_request(Connection, Url, MethodStr, Headers, Query2, 0).
http_request(Connection, Url, MethodStr, Headers, Query, RedirectCounter) ->
{ok, {{Code, _Reason}, RespHeaders, RespBody, _, _}} =
fusco:request(Connection, Url, MethodStr, Headers, Query, 2, 5000),
?DEBUG("Request result: ~s: ~p", [Code, RespBody]),
case Code of
<<"409">> -> {error, conflict};
@ -231,9 +240,18 @@ make_req(Method, Path, LUser, LServer, Password) ->
<<"204">> -> {ok, <<"">>};
<<"201">> -> {ok, <<"created">>};
<<"200">> -> {ok, RespBody};
R when (R==<<"301">>) or (R==<<"307">>) or (R==<<"308">>) ->
handle_redirect(RespHeaders, Connection, MethodStr, Headers, Query, RedirectCounter+1);
_ -> {error, RespBody}
end.
handle_redirect(RespHeaders, Connection, MethodStr, Headers, Query, RedirectCounter)
when RedirectCounter < 5 ->
{_, Location} = lists:keyfind(<<"location">>, 1, RespHeaders),
http_request(Connection, Location, MethodStr, Headers, Query, RedirectCounter);
handle_redirect(_, _, _, _, _, _) ->
{error, redirect_loop}.
%%%----------------------------------------------------------------------
%%% Other internal functions
%%%----------------------------------------------------------------------