From 0d6b9371270e0dd0b11d06c6061c1bd361e3a152 Mon Sep 17 00:00:00 2001 From: Gilbert Date: Thu, 28 Mar 2019 10:34:48 +0800 Subject: [PATCH] Support proxy protocol of websocket (#2372) Support proxy protocol of websocket --- src/emqx_listeners.erl | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/emqx_listeners.erl b/src/emqx_listeners.erl index 20be60602..104a9583a 100644 --- a/src/emqx_listeners.erl +++ b/src/emqx_listeners.erl @@ -64,25 +64,27 @@ start_listener(Proto, ListenOn, Options) when Proto == ssl; Proto == tls -> %% Start MQTT/WS listener start_listener(Proto, ListenOn, Options) when Proto == http; Proto == ws -> - Dispatch = cowboy_router:compile([{'_', [{mqtt_path(Options), emqx_ws_connection, Options}]}]), - start_http_listener(fun cowboy:start_clear/3, 'mqtt:ws', ListenOn, ranch_opts(Options), Dispatch); + start_http_listener(fun cowboy:start_clear/3, 'mqtt:ws', ListenOn, ranch_opts(Options), ws_opts(Options)); %% Start MQTT/WSS listener start_listener(Proto, ListenOn, Options) when Proto == https; Proto == wss -> - Dispatch = cowboy_router:compile([{'_', [{mqtt_path(Options), emqx_ws_connection, Options}]}]), - start_http_listener(fun cowboy:start_tls/3, 'mqtt:wss', ListenOn, ranch_opts(Options), Dispatch). + start_http_listener(fun cowboy:start_tls/3, 'mqtt:wss', ListenOn, ranch_opts(Options), ws_opts(Options)). start_mqtt_listener(Name, ListenOn, Options) -> SockOpts = esockd:parse_opt(Options), esockd:open(Name, ListenOn, merge_default(SockOpts), {emqx_connection, start_link, [Options -- SockOpts]}). -start_http_listener(Start, Name, ListenOn, RanchOpts, Dispatch) -> - Start(Name, with_port(ListenOn, RanchOpts), #{env => #{dispatch => Dispatch}}). +start_http_listener(Start, Name, ListenOn, RanchOpts, ProtoOpts) -> + Start(Name, with_port(ListenOn, RanchOpts), ProtoOpts). mqtt_path(Options) -> proplists:get_value(mqtt_path, Options, "/mqtt"). +ws_opts(Options) -> + Dispatch = cowboy_router:compile([{'_', [{mqtt_path(Options), emqx_ws_connection, Options}]}]), + #{env => #{dispatch => Dispatch}, proxy_header => proplists:get_value(proxy_protocol, Options, false)}. + ranch_opts(Options) -> NumAcceptors = proplists:get_value(acceptors, Options, 4), MaxConnections = proplists:get_value(max_connections, Options, 1024), @@ -163,4 +165,3 @@ format({Addr, Port}) when is_list(Addr) -> io_lib:format("~s:~w", [Addr, Port]); format({Addr, Port}) when is_tuple(Addr) -> io_lib:format("~s:~w", [esockd_net:ntoab(Addr), Port]). -