|
|
@ -924,7 +924,7 @@ make_request(Method, Headers, AbsPath, RelPath, Body, Options, |
|
|
|
HttpVsn = http_vsn_string(get_value(http_vsn, Options, {1,1})), |
|
|
|
Fun1 = fun({X, Y}) when is_atom(X) -> |
|
|
|
{to_lower(atom_to_list(X)), X, Y}; |
|
|
|
({X, Y}) when is_list(X) -> |
|
|
|
({X, Y}) when is_list(X); is_binary(X) -> |
|
|
|
{to_lower(X), X, Y} |
|
|
|
end, |
|
|
|
Headers_0 = [Fun1(X) || X <- Headers], |
|
|
@ -1010,7 +1010,7 @@ encode_headers(L) -> |
|
|
|
encode_headers(L, []). |
|
|
|
encode_headers([{http_vsn, _Val} | T], Acc) -> |
|
|
|
encode_headers(T, Acc); |
|
|
|
encode_headers([{Name,Val} | T], Acc) when is_list(Name) -> |
|
|
|
encode_headers([{Name,Val} | T], Acc) when is_list(Name); is_binary(Name) -> |
|
|
|
encode_headers(T, [[Name, ": ", fmt_val(Val), crnl()] | Acc]); |
|
|
|
encode_headers([{Name,Val} | T], Acc) when is_atom(Name) -> |
|
|
|
encode_headers(T, [[atom_to_list(Name), ": ", fmt_val(Val), crnl()] | Acc]); |
|
|
@ -1072,7 +1072,7 @@ parse_response(Data, #state{reply_buffer = Acc, reqs = Reqs, |
|
|
|
{HttpVsn, StatCode, Headers_1, Status_line, Raw_headers} = parse_headers(Headers), |
|
|
|
do_trace("HttpVsn: ~p StatusCode: ~p Headers_1 -> ~1000.p~n", [HttpVsn, StatCode, Headers_1]), |
|
|
|
LCHeaders = [{to_lower(X), Y} || {X,Y} <- Headers_1], |
|
|
|
ConnClose = to_lower(get_value("connection", LCHeaders, "false")), |
|
|
|
ConnClose = to_lower(get_header_value("connection", LCHeaders, "false")), |
|
|
|
IsClosing = is_connection_closing(HttpVsn, ConnClose), |
|
|
|
State_0 = case IsClosing of |
|
|
|
true -> |
|
|
@ -1096,11 +1096,11 @@ parse_response(Data, #state{reply_buffer = Acc, reqs = Reqs, |
|
|
|
http_status_code=StatCode} |
|
|
|
end, |
|
|
|
put(conn_close, ConnClose), |
|
|
|
TransferEncodings = to_lower(get_value("transfer-encoding", LCHeaders, "false")), |
|
|
|
TransferEncodings = to_lower(get_header_value("transfer-encoding", LCHeaders, "false")), |
|
|
|
IsChunked = lists:any(fun(Enc) -> string:strip(Enc) =:= "chunked" end, |
|
|
|
string:tokens(TransferEncodings, ",")), |
|
|
|
Head_response_with_body = lists:member({workaround, head_response_with_body}, Options), |
|
|
|
case get_value("content-length", LCHeaders, undefined) of |
|
|
|
case get_header_value("content-length", LCHeaders, undefined) of |
|
|
|
_ when Method == connect, |
|
|
|
hd(StatCode) == $2 -> |
|
|
|
{_, Reqs_1} = queue:out(Reqs), |
|
|
@ -1906,6 +1906,8 @@ cancel_timer(Ref, {eat_message, Msg}) -> |
|
|
|
make_req_id() -> |
|
|
|
now(). |
|
|
|
|
|
|
|
to_lower(Str) when is_binary(Str) -> |
|
|
|
to_lower(binary_to_list(Str)); |
|
|
|
to_lower(Str) -> |
|
|
|
to_lower(Str, []). |
|
|
|
to_lower([H|T], Acc) when H >= $A, H =< $Z -> |
|
|
@ -2021,3 +2023,13 @@ to_binary({X, _}) when is_function(X) -> to_binary(X); |
|
|
|
to_binary(X) when is_function(X) -> <<"body generated by function">>; |
|
|
|
to_binary(X) when is_list(X) -> list_to_binary(X); |
|
|
|
to_binary(X) when is_binary(X) -> X. |
|
|
|
|
|
|
|
get_header_value(Name, Headers, Default_val) -> |
|
|
|
case lists:keysearch(Name, 1, Headers) of |
|
|
|
false -> |
|
|
|
Default_val; |
|
|
|
{value, {_, Val}} when is_binary(Val) -> |
|
|
|
binary_to_list(Val); |
|
|
|
{value, {_, Val}} -> |
|
|
|
Val |
|
|
|
end. |