diff --git a/apps/consul_proxy/src/consul_proxy.app.src b/apps/consul_proxy/src/consul_proxy.app.src index 418155c9ae2df6fbe4bc7ba919b83f8064ddc561..fdc2b866a830b6f23874ecb932cdc8c8b8fee64c 100644 --- a/apps/consul_proxy/src/consul_proxy.app.src +++ b/apps/consul_proxy/src/consul_proxy.app.src @@ -1,6 +1,6 @@ {application, consul_proxy, [ {description, "Proxy for docker swarm using consul and vegur"}, - {vsn, "0.4.3"}, + {vsn, "0.4.4"}, {registered, []}, {mod, {consul_proxy_app, []}}, {applications, [ diff --git a/apps/consul_proxy/src/consul_proxy_middleware_hijack.erl b/apps/consul_proxy/src/consul_proxy_middleware_hijack.erl index d01fb12db92139b578ddb2e5ac15ea0dd8f70a5e..da8199f773ee7be0ec5313b4f02eae52c194fbfb 100644 --- a/apps/consul_proxy/src/consul_proxy_middleware_hijack.erl +++ b/apps/consul_proxy/src/consul_proxy_middleware_hijack.erl @@ -104,7 +104,8 @@ loop(State = #socket_state{socket = Socket, transport = Transport, timeout = Tim gen_server:cast(?SERVER, {socket_close, Socket}); {error, Reason} -> lager:error("Error receiving data: ~p", [Reason]), - Transport:close(Socket) + Transport:close(Socket), + gen_server:cast(?SERVER, {socket_close, Socket}) end. %%==================================================================== @@ -114,7 +115,6 @@ loop(State = #socket_state{socket = Socket, transport = Transport, timeout = Tim init(Args) -> lager:info("Args: ~p", [Args]), Tab = ets:new(hijacked_domains, [bag, {read_concurrency, true}]), - process_flag(trap_exit, true), {ok, #state{domain_tab = Tab}}. handle_call({socket_recv, Terms = #{<<"action">> := <<"login">>}, SocketState}, _From, State) -> @@ -190,10 +190,6 @@ handle_cast(Request, State) -> lager:warning("Unhandled cast: ~p", [Request]), {noreply, State}. -handle_info({'EXIT', Socket, Reason}, State) when is_port(Socket) -> - gen_server:cast(?SERVER, {socket_close, Socket, Reason}), - {noreply, State}; - handle_info(Info, State) -> lager:warning("Unhandled message: ~p", [Info]), {noreply, State}. @@ -253,8 +249,19 @@ hijack([{_Host, Mode, RE, Socket, Transport} | Patterns], Req, From) -> _ -> B64Pid = base64:encode(term_to_binary(From)), {Map, Req2} = request_to_map(Req1), - Transport:send(Socket, msgpack:pack(Map#{<<"from">> => B64Pid})), - {hijacked, Mode, Req2} + case Transport:send(Socket, msgpack:pack(Map#{<<"from">> => B64Pid})) of + ok -> + {hijacked, Mode, Req2}; + {error, closed} -> + lager:warning("Stale ~p socket: ~p", [Transport, Socket]), + gen_server:cast(?SERVER, {socket_close, Socket}), + hijack(Patterns, Req, From); + {error, Reason} -> + lager:error("Error sending data to ~p socket ~: ~p", [Transport, Socket, Reason]), + Transport:close(Socket), + gen_server:cast(?SERVER, {socket_close, Socket}), + hijack(Patterns, Req, From) + end end. send(#socket_state{socket = Socket, transport = Transport}, Data) -> diff --git a/rebar.config b/rebar.config index 8a68d211260b01c5f0038c90536439f73ac301ab..4c582557c650f1347014f6afb616098cd1e453d0 100644 --- a/rebar.config +++ b/rebar.config @@ -18,7 +18,7 @@ ]}. {relx, [ - {release, {consul_proxy, "0.4.3"}, [consul_proxy]}, {sys_config, "./config/sys.config"}, + {release, {consul_proxy, "0.4.4"}, [consul_proxy]}, {sys_config, "./config/sys.config"}, {vm_args, "./config/vm.args"}, {dev_mode, true}, {include_erts, false},