Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
home:Ledest:erlang:18
ibrowse
ibrowse-4.4.2-git.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File ibrowse-4.4.2-git.patch of Package ibrowse
diff --git a/src/ibrowse.erl b/src/ibrowse.erl index 2066799..5adf047 100644 --- a/src/ibrowse.erl +++ b/src/ibrowse.erl @@ -342,12 +342,7 @@ send_req(Url, Headers, Method, Body, Options, Timeout) -> #url{host = Host, port = Port, protocol = Protocol} = Parsed_url -> - Lb_pid = case ets:lookup(ibrowse_lb, {Host, Port}) of - [] -> - get_lb_pid(Parsed_url); - [#lb_pid{pid = Lb_pid_1}] -> - Lb_pid_1 - end, + Lb_pid = lb_pid(Host, Port, Parsed_url), Max_sessions = get_max_sessions(Host, Port, Options), Max_pipeline_size = get_max_pipeline_size(Host, Port, Options), Max_attempts = get_max_attempts(Host, Port, Options), @@ -367,6 +362,20 @@ send_req(Url, Headers, Method, Body, Options, Timeout) -> {error, {url_parsing_failed, Err}} end. +lb_pid(Host, Port, Url) -> + case ets:lookup(ibrowse_lb, {Host, Port}) of + [] -> + get_lb_pid(Url); + [#lb_pid{pid = Pid}] -> + case is_process_alive(Pid) of + true -> + Pid; + false -> + ets:delete(ibrowse_lb, {Host, Port}), + get_lb_pid(Url) + end + end. + try_routing_request(Lb_pid, Parsed_url, Max_sessions, Max_pipeline_size, diff --git a/src/ibrowse_http_client.erl b/src/ibrowse_http_client.erl index e59228c..98a475f 100644 --- a/src/ibrowse_http_client.erl +++ b/src/ibrowse_http_client.erl @@ -133,7 +133,7 @@ send_req(Conn_Pid, Url, Headers, Method, Body, Options, Timeout) -> %% {stop, Reason} %%-------------------------------------------------------------------- init({Lb_Tid, #url{host = Host, port = Port}, {SSLOptions, Is_ssl}}) -> - process_flag(trap_exit, true), + maybe_trap_exits(), State = #state{host = Host, port = Port, ssl_options = SSLOptions, @@ -143,7 +143,7 @@ init({Lb_Tid, #url{host = Host, port = Port}, {SSLOptions, Is_ssl}}) -> put(my_trace_flag, ibrowse_lib:get_trace_status(Host, Port)), {ok, set_inac_timer(State)}; init(Url) when is_list(Url) -> - process_flag(trap_exit, true), + maybe_trap_exits(), case catch ibrowse_lib:parse_url(Url) of #url{protocol = Protocol} = Url_rec -> init({undefined, Url_rec, {[], Protocol == https}}); @@ -151,7 +151,7 @@ init(Url) when is_list(Url) -> {error, invalid_url} end; init({Host, Port}) -> - process_flag(trap_exit, true), + maybe_trap_exits(), State = #state{host = Host, port = Port}, put(ibrowse_trace_token, [Host, $:, integer_to_list(Port)]), @@ -484,6 +484,15 @@ accumulate_response(Data, #state{reply_buffer = RepBuf, State#state{reply_buffer = RepBuf_1} end. +generate_timestamp() -> + case catch erlang:unique_integer([positive]) of + {'EXIT', _} -> + erlang:apply(erlang, now, []); + Unique -> + {A,B,C} = os:timestamp(), + {A * 1000000 + B, C, Unique} + end. + make_tmp_filename(true) -> DownloadDir = ibrowse:get_config_value(download_dir, filename:absname("./")), {A,B,C} = os:timestamp(), @@ -2050,12 +2059,7 @@ cancel_timer(Ref, {eat_message, Msg}) -> end. make_req_id() -> - case catch erlang:unique_integer() of - {'EXIT', _} -> - erlang:apply(erlang, now, []); - V -> - V - end. + generate_timestamp(). to_lower(Str) when is_binary(Str) -> to_lower(binary_to_list(Str)); @@ -2187,3 +2191,9 @@ get_header_value(Name, Headers, Default_val) -> delayed_stop_timer() -> erlang:send_after(500, self(), delayed_stop). + +maybe_trap_exits() -> + case ibrowse:get_config_value(worker_trap_exits, true) of + true -> process_flag(trap_exit, true); + false -> ok + end. diff --git a/test/ibrowse_test.erl b/test/ibrowse_test.erl index cd78049..4e64acc 100644 --- a/test/ibrowse_test.erl +++ b/test/ibrowse_test.erl @@ -34,6 +34,7 @@ test_preserve_status_line/0, test_binary_headers/0, test_binary_headers/1, + test_dead_lb_pid/0, test_generate_body_0/0, test_retry_of_requests/0, test_retry_of_requests/1, @@ -61,6 +62,7 @@ {local_test_fun, test_303_response_with_a_body, []}, {local_test_fun, test_303_response_with_no_body, []}, {local_test_fun, test_binary_headers, []}, + {local_test_fun, test_dead_lb_pid, []}, {local_test_fun, test_retry_of_requests, []}, {local_test_fun, verify_chunked_streaming, []}, {local_test_fun, test_chunked_streaming_once, []}, @@ -877,6 +879,23 @@ test_generate_body_0() -> ets:delete(Tid) end. +%%------------------------------------------------------------------------------ +%% Test that when an lb process dies, its entry is removed from the ibrowse_lb +%% table by the next requestor and replaced with a new process +%%------------------------------------------------------------------------------ +test_dead_lb_pid() -> + {Host, Port} = {"localhost", 8181}, + Url = "http://" ++ Host ++ ":" ++ integer_to_list(Port), + {ok, "200", _, _} = ibrowse:send_req(Url, [], get), + [{lb_pid, {Host, Port}, Pid, _}] = ets:lookup(ibrowse_lb, {Host, Port}), + true = exit(Pid, kill), + false = is_process_alive(Pid), + {ok, "200", _, _} = ibrowse:send_req(Url, [], get), + [{lb_pid, {Host, Port}, NewPid, _}] = ets:lookup(ibrowse_lb, {Host, Port}), + true = NewPid /= Pid, + true = is_process_alive(NewPid), + success. + do_trace(Fmt, Args) -> do_trace(get(my_trace_flag), Fmt, Args). diff --git a/test/ibrowse_test_server.erl b/test/ibrowse_test_server.erl index 3ba7c67..631e93a 100644 --- a/test/ibrowse_test_server.erl +++ b/test/ibrowse_test_server.erl @@ -76,11 +76,22 @@ do_listen(ssl, Port, Opts) -> application:start(ssl), ssl:listen(Port, Opts). +-ifdef(OTP_RELEASE). + +do_accept(tcp, Listen_sock) -> + gen_tcp:accept(Listen_sock, ?ACCEPT_TIMEOUT_MS); +do_accept(ssl, Listen_sock) -> + ssl:handshake(Listen_sock, ?ACCEPT_TIMEOUT_MS). + +-else. + do_accept(tcp, Listen_sock) -> gen_tcp:accept(Listen_sock, ?ACCEPT_TIMEOUT_MS); do_accept(ssl, Listen_sock) -> ssl:ssl_accept(Listen_sock, ?ACCEPT_TIMEOUT_MS). +-endif. + accept_loop(Sock, Sock_type) -> case do_accept(Sock_type, Sock) of {ok, Conn} -> diff --git a/test/ibrowse_tests.erl b/test/ibrowse_tests.erl index 594b8ed..5693f79 100644 --- a/test/ibrowse_tests.erl +++ b/test/ibrowse_tests.erl @@ -15,7 +15,7 @@ -define(BASE_URL, "http://localhost:" ++ integer_to_list(?SERVER_PORT)). -define(SHORT_TIMEOUT_MS, 5000). -define(LONG_TIMEOUT_MS, 30000). --define(PAUSE_FOR_CONNECTIONS_MS, 2000). +-define(PAUSE_FOR_CONNECTIONS_MS, 4000). %%-compile(export_all).
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor