Make it possible to configure WebSocket options such as compression
While at it, correctly configure connection inactivity timeout with modern Cowboy versions. Closes #34. References rabbitmq/rabbitmq-web-stomp#89. [#161053821]
This commit is contained in:
		
							parent
							
								
									0707831427
								
							
						
					
					
						commit
						97a08e78a5
					
				|  | @ -67,5 +67,38 @@ | |||
|     [{datatype, integer}]}. | ||||
| {mapping, "web_mqtt.cowboy_opts.max_request_line_length", "rabbitmq_web_mqtt.cowboy_opts.max_request_line_length", | ||||
|     [{datatype, integer}]}. | ||||
| {mapping, "web_mqtt.cowboy_opts.timeout", "rabbitmq_web_mqtt.cowboy_opts.timeout", | ||||
| {mapping, "web_mqtt.cowboy_opts.timeout", "rabbitmq_web_mqtt.cowboy_opts.idle_timeout", | ||||
|     [{datatype, integer}]}. | ||||
| 
 | ||||
| %% backwards compatibility | ||||
| {mapping, "web_mqtt.cowboy_opts.timeout",      "rabbitmq_web_mqtt.cowboy_opts.idle_timeout", | ||||
|     [{datatype, integer}, {validators, ["non_negative_integer"]}] | ||||
| }. | ||||
| %% recent Cowboy versions have several timeout settings | ||||
| {mapping, "web_mqtt.cowboy_opts.idle_timeout", "rabbitmq_web_mqtt.cowboy_opts.idle_timeout", | ||||
|     [{datatype, integer}] | ||||
| }. | ||||
| 
 | ||||
| {translation, | ||||
|     "rabbitmq_web_mqtt.cowboy_opts.idle_timeout", | ||||
|     fun(Conf) -> | ||||
|         case cuttlefish:conf_get("web_mqtt.cowboy_opts.timeout", Conf, undefined) of | ||||
|             Value when is_integer(Value) -> | ||||
|                 Value; | ||||
|             undefined -> | ||||
|                 case cuttlefish:conf_get("web_mqtt.cowboy_opts.idle_timeout", Conf, undefined) of | ||||
|                     undefined -> cuttlefish:unset(); | ||||
|                     Value     -> Value | ||||
|                 end | ||||
|         end | ||||
|     end | ||||
| }. | ||||
| 
 | ||||
| {mapping, "web_mqtt.ws_opts.compress", "rabbitmq_web_mqtt.cowboy_ws_opts.compress", | ||||
|     [{datatype, {enum, [true, false]}}]}. | ||||
| {mapping, "web_mqtt.ws_opts.max_frame_size", "rabbitmq_web_mqtt.cowboy_ws_opts.max_frame_size", | ||||
|     [{datatype, integer}, {validators, ["non_negative_integer"]}] | ||||
| }. | ||||
| {mapping, "web_mqtt.ws_opts.idle_timeout", "rabbitmq_web_mqtt.cowboy_ws_opts.idle_timeout", | ||||
|     [{datatype, integer}, {validators, ["non_negative_integer"]}] | ||||
| }. | ||||
|  |  | |||
|  | @ -45,21 +45,27 @@ init([]) -> {ok, {{one_for_one, 1, 5}, []}}. | |||
| %%---------------------------------------------------------------------------- | ||||
| 
 | ||||
| mqtt_init() -> | ||||
|     CowboyOpts0 = get_env(cowboy_opts, []), | ||||
|     CowboyOpts0 = maps:from_list(get_env(cowboy_opts, [])), | ||||
| 
 | ||||
|     Routes = cowboy_router:compile([{'_', [ | ||||
|         {get_env(ws_path, "/ws"), rabbit_web_mqtt_handler, []} | ||||
|     ]}]), | ||||
|     CowboyOpts = maps:from_list([ | ||||
|         {env, #{dispatch => Routes}}, | ||||
|         {middlewares, [cowboy_router, rabbit_web_mqtt_middleware, cowboy_handler]} | ||||
|     |CowboyOpts0]), | ||||
| 
 | ||||
|     CowboyOpts = CowboyOpts0#{env         => #{dispatch => Routes}, | ||||
|                               middlewares => [cowboy_router, rabbit_web_mqtt_middleware, cowboy_handler]}, | ||||
|     {TCPConf, IpStr, Port} = get_tcp_conf(), | ||||
| 
 | ||||
|     {ok, _} = ranch:start_listener(web_mqtt, get_env(num_tcp_acceptors, 10), | ||||
|     case ranch:start_listener(web_mqtt, get_env(num_tcp_acceptors, 10), | ||||
|         ranch_tcp, TCPConf, | ||||
|         rabbit_web_mqtt_connection_sup, CowboyOpts), | ||||
|         rabbit_web_mqtt_connection_sup, CowboyOpts) of | ||||
|         {ok, _}                       -> ok; | ||||
|         {error, {already_started, _}} -> ok; | ||||
|         {error, Err}                  -> | ||||
|             rabbit_log_connection:error( | ||||
|                 "Failed to start a WebSocket (HTTP) listener. Error: ~p," | ||||
|                 " listener settings: ~p~n", | ||||
|                 [Err, TCPConf]), | ||||
|             throw(Err) | ||||
|     end, | ||||
|     listener_started('http/web-mqtt', TCPConf), | ||||
|     rabbit_log:info("rabbit_web_mqtt: listening for HTTP connections on ~s:~w~n", | ||||
|                     [IpStr, Port]), | ||||
|  |  | |||
|  | @ -46,13 +46,14 @@ init(Req, Opts) -> | |||
|                 SecWsProtocol -> | ||||
|                     cowboy_req:set_resp_header(<<"sec-websocket-protocol">>, SecWsProtocol, Req) | ||||
|             end, | ||||
|             WsOpts = proplists:get_value(ws_opts, Opts, #{}), | ||||
|             {cowboy_websocket, Req2, #state{ | ||||
|                 conn_name     = ConnStr, | ||||
|                 keepalive     = {none, none}, | ||||
|                 keepalive_sup = KeepaliveSup, | ||||
|                 parse_state   = rabbit_mqtt_frame:initial_state(), | ||||
|                 socket        = Sock | ||||
|             }}; | ||||
|             }, WsOpts}; | ||||
|         _ -> | ||||
|             {stop, Req} | ||||
|     end. | ||||
|  |  | |||
|  | @ -49,7 +49,47 @@ | |||
|     [{ws_path, "/rmq/ws"}]}], | ||||
|   [rabbitmq_web_mqtt]}, | ||||
| 
 | ||||
|  %% | ||||
|  %% Cowboy options | ||||
|  %% | ||||
| 
 | ||||
|  {cowboy_max_keepalive, | ||||
|   "web_mqtt.cowboy_opts.max_keepalive = 10", | ||||
|   [{rabbitmq_web_mqtt,[{cowboy_opts,[{max_keepalive, 10}]}]}], | ||||
|   [rabbitmq_web_mqtt]}]. | ||||
|   [rabbitmq_web_mqtt]}, | ||||
| 
 | ||||
|  {cowboy_timeout, | ||||
|   "web_mqtt.cowboy_opts.timeout = 10000", | ||||
|   [{rabbitmq_web_mqtt,[{cowboy_opts,[{idle_timeout, 10000}]}]}], | ||||
|   [rabbitmq_web_mqtt]}, | ||||
| 
 | ||||
|  {cowboy_idle_timeout, | ||||
|   "web_mqtt.cowboy_opts.idle_timeout = 10000", | ||||
|   [{rabbitmq_web_mqtt,[{cowboy_opts,[{idle_timeout, 10000}]}]}], | ||||
|   [rabbitmq_web_mqtt]}, | ||||
| 
 | ||||
|  %% | ||||
|  %% Cowboy WebSocket options | ||||
|  %% | ||||
| 
 | ||||
| {ws_opts_compress_true, | ||||
|   "web_mqtt.ws_opts.compress = true", | ||||
|   [{rabbitmq_web_mqtt,[{cowboy_ws_opts,[{compress, true}]}]}], | ||||
|   [rabbitmq_web_mqtt]}, | ||||
| 
 | ||||
| {ws_opts_compress_false, | ||||
|   "web_mqtt.ws_opts.compress = false", | ||||
|   [{rabbitmq_web_mqtt,[{cowboy_ws_opts,[{compress, false}]}]}], | ||||
|   [rabbitmq_web_mqtt]}, | ||||
| 
 | ||||
| {ws_opts_max_frame_size, | ||||
|   "web_mqtt.ws_opts.max_frame_size = 8000", | ||||
|   [{rabbitmq_web_mqtt,[{cowboy_ws_opts,[{max_frame_size, 8000}]}]}], | ||||
|   [rabbitmq_web_mqtt]}, | ||||
| 
 | ||||
| {ws_idle_timeout, | ||||
|   "web_mqtt.ws_opts.idle_timeout = 10000", | ||||
|   [{rabbitmq_web_mqtt,[{cowboy_ws_opts,[{idle_timeout, 10000}]}]}], | ||||
|   [rabbitmq_web_mqtt]} | ||||
| ]. | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue