diff options
| author | Michael Klishin <michael@novemberain.com> | 2019-02-28 01:01:47 +0300 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2019-02-28 01:01:47 +0300 |
| commit | 08bce616c5af789176ec1ab4836487a851734173 (patch) | |
| tree | 6afcb5b08cd964df0771ebc713c469398e1c57f5 | |
| parent | b9873465666d143bd1fc70a828d417ce48b5b1c3 (diff) | |
| parent | 85da67124d789ad8b9c23f70d419ef67702263fc (diff) | |
| download | rabbitmq-server-git-08bce616c5af789176ec1ab4836487a851734173.tar.gz | |
Merge pull request #1902 from rabbitmq/rabbitmq-server-1901
Ensure resources are cleaned up when connection socket is closed before Ranch handshake completes
| -rw-r--r-- | src/rabbit_networking.erl | 28 |
1 files changed, 22 insertions, 6 deletions
diff --git a/src/rabbit_networking.erl b/src/rabbit_networking.erl index 1935196170..266ab567fa 100644 --- a/src/rabbit_networking.erl +++ b/src/rabbit_networking.erl @@ -389,13 +389,29 @@ force_connection_event_refresh(Ref) -> [rabbit_reader:force_event_refresh(C, Ref) || C <- connections()], ok. -handshake(Ref, ProxyProtocol) -> - case ProxyProtocol of +failed_to_recv_proxy_header(Ref, Error) -> + Msg = case Error of + closed -> "error when receiving proxy header: TCP socket was ~p prematurely"; + _Other -> "error when receiving proxy header: ~p" + end, + rabbit_log:error(Msg, [Error]), + % The following call will clean up resources then exit + _ = ranch:handshake(Ref), + exit({shutdown, failed_to_recv_proxy_header}). + +handshake(Ref, ProxyProtocolEnabled) -> + case ProxyProtocolEnabled of true -> - {ok, ProxyInfo} = ranch:recv_proxy_header(Ref, 1000), - {ok, Sock} = ranch:handshake(Ref), - setup_socket(Sock), - {ok, {rabbit_proxy_socket, Sock, ProxyInfo}}; + case ranch:recv_proxy_header(Ref, 3000) of + {error, Error} -> + failed_to_recv_proxy_header(Ref, Error); + {error, protocol_error, Error} -> + failed_to_recv_proxy_header(Ref, Error); + {ok, ProxyInfo} -> + {ok, Sock} = ranch:handshake(Ref), + setup_socket(Sock), + {ok, {rabbit_proxy_socket, Sock, ProxyInfo}} + end; false -> {ok, Sock} = ranch:handshake(Ref), setup_socket(Sock), |
