diff options
author | Paweł Chmielowski <pchmielowski@process-one.net> | 2015-09-04 13:42:53 +0300 |
---|---|---|
committer | Paweł Chmielowski <pchmielowski@process-one.net> | 2015-09-04 13:42:53 +0300 |
commit | f56a9e400dd1857484c9898f0b746f0a44ad2ac8 (patch) | |
tree | 686acb299b0d67528fa11d531c9538b544ac9fa3 /src | |
parent | 5095fdb6b0ae6e227a907ac690447cbc353d82e9 (diff) |
Pass stream management options defined in http listener to http-bind and websocket
Diffstat (limited to 'src')
-rw-r--r-- | src/ejabberd_http_bind.erl | 29 | ||||
-rw-r--r-- | src/ejabberd_http_ws.erl | 10 | ||||
-rw-r--r-- | src/ejabberd_websocket.erl | 6 | ||||
-rw-r--r-- | src/mod_http_bind.erl | 4 |
4 files changed, 32 insertions, 17 deletions
diff --git a/src/ejabberd_http_bind.erl b/src/ejabberd_http_bind.erl index 620c8f1d3..21c6887f0 100644 --- a/src/ejabberd_http_bind.erl +++ b/src/ejabberd_http_bind.erl @@ -16,7 +16,7 @@ -behaviour(gen_fsm). %% External exports --export([start_link/3, +-export([start_link/4, init/1, handle_event/3, handle_sync_event/4, @@ -35,13 +35,13 @@ change_shaper/2, monitor/1, close/1, - start/4, + start/5, handle_session_start/8, handle_http_put/7, http_put/7, http_get/2, prepare_response/4, - process_request/2]). + process_request/3]). -include("ejabberd.hrl"). -include("logger.hrl"). @@ -140,17 +140,17 @@ %%%---------------------------------------------------------------------- %% TODO: If compile with no supervisor option, start the session without %% supervisor -start(XMPPDomain, Sid, Key, IP) -> +start(XMPPDomain, Sid, Key, IP, HOpts) -> ?DEBUG("Starting session", []), SupervisorProc = gen_mod:get_module_proc(XMPPDomain, ?PROCNAME_MHB), - case catch supervisor:start_child(SupervisorProc, [Sid, Key, IP]) of + case catch supervisor:start_child(SupervisorProc, [Sid, Key, IP, HOpts]) of {ok, Pid} -> {ok, Pid}; _ -> check_bind_module(XMPPDomain), {error, "Cannot start HTTP bind session"} end. -start_link(Sid, Key, IP) -> - gen_fsm:start_link(?MODULE, [Sid, Key, IP], ?FSMOPTS). +start_link(Sid, Key, IP, HOpts) -> + gen_fsm:start_link(?MODULE, [Sid, Key, IP, HOpts], ?FSMOPTS). send({http_bind, FsmRef, _IP}, Packet) -> gen_fsm:sync_send_all_state_event(FsmRef, @@ -197,7 +197,7 @@ peername({http_bind, _FsmRef, IP}) -> {ok, IP}. %% Entry point for data coming from client through ejabberd HTTP server: -process_request(Data, IP) -> +process_request(Data, IP, HOpts) -> Opts1 = ejabberd_c2s_config:get_c2s_limits(), Opts = [{xml_socket, true} | Opts1], MaxStanzaSize = case lists:keysearch(max_stanza_size, 1, @@ -221,7 +221,7 @@ process_request(Data, IP) -> (?NS_HTTP_BIND)/binary, "'/>">>}; XmppDomain -> Sid = p1_sha:sha(term_to_binary({now(), make_ref()})), - case start(XmppDomain, Sid, <<"">>, IP) of + case start(XmppDomain, Sid, <<"">>, IP, HOpts) of {error, _} -> {500, ?HEADER, <<"<body type='terminate' condition='internal-se" @@ -329,10 +329,17 @@ handle_session_start(Pid, XmppDomain, Sid, Rid, Attrs, %% ignore | %% {stop, StopReason} %%---------------------------------------------------------------------- -init([Sid, Key, IP]) -> +init([Sid, Key, IP, HOpts]) -> ?DEBUG("started: ~p", [{Sid, Key, IP}]), Opts1 = ejabberd_c2s_config:get_c2s_limits(), - Opts = [{xml_socket, true} | Opts1], + SOpts = lists:filtermap(fun({stream_managment, _}) -> true; + ({max_ack_queue, _}) -> true; + ({resume_timeout, _}) -> true; + ({resend_on_timeout, _}) -> true; + (_) -> false + end, HOpts), + + Opts = [{xml_socket, true} | SOpts ++ Opts1], Shaper = none, ShaperState = shaper:new(Shaper), Socket = {http_bind, self(), IP}, diff --git a/src/ejabberd_http_ws.erl b/src/ejabberd_http_ws.erl index 902c32f25..dd6854f8c 100644 --- a/src/ejabberd_http_ws.erl +++ b/src/ejabberd_http_ws.erl @@ -111,8 +111,14 @@ socket_handoff(LocalPath, Request, Socket, SockMod, Buf, Opts) -> %%% Internal -init([{#ws{ip = IP}, _} = WS]) -> - Opts = [{xml_socket, true} | ejabberd_c2s_config:get_c2s_limits()], +init([{#ws{ip = IP, http_opts = HOpts}, _} = WS]) -> + SOpts = lists:filtermap(fun({stream_managment, _}) -> true; + ({max_ack_queue, _}) -> true; + ({resume_timeout, _}) -> true; + ({resend_on_timeout, _}) -> true; + (_) -> false + end, HOpts), + Opts = [{xml_socket, true} | ejabberd_c2s_config:get_c2s_limits() ++ SOpts], PingInterval = ejabberd_config:get_option( {websocket_ping_interval, ?MYNAME}, fun(I) when is_integer(I), I>=0 -> I end, diff --git a/src/ejabberd_websocket.erl b/src/ejabberd_websocket.erl index c45d157bb..d922787b5 100644 --- a/src/ejabberd_websocket.erl +++ b/src/ejabberd_websocket.erl @@ -88,7 +88,8 @@ check(_Path, Headers) -> end. socket_handoff(LocalPath, #request{method = 'GET', ip = IP, q = Q, path = Path, - headers = Headers, host = Host, port = Port}, + headers = Headers, host = Host, port = Port, + opts = HOpts}, Socket, SockMod, Buf, _Opts, HandlerModule, InfoMsgFun) -> case check(LocalPath, Headers) of true -> @@ -101,7 +102,8 @@ socket_handoff(LocalPath, #request{method = 'GET', ip = IP, q = Q, path = Path, path = Path, headers = Headers, local_path = LocalPath, - buf = Buf}, + buf = Buf, + http_opts = HOpts}, connect(WS, HandlerModule); _ -> diff --git a/src/mod_http_bind.erl b/src/mod_http_bind.erl index c3a62aa3c..fbf43e80f 100644 --- a/src/mod_http_bind.erl +++ b/src/mod_http_bind.erl @@ -64,9 +64,9 @@ process([], #request{method = 'POST', data = <<>>}) -> {400, ?HEADER, #xmlel{name = <<"h1">>, children = [{xmlcdata, <<"400 Bad Request">>}]}}; process([], - #request{method = 'POST', data = Data, ip = IP}) -> + #request{method = 'POST', data = Data, ip = IP, opts = Opts}) -> ?DEBUG("Incoming data: ~s", [Data]), - ejabberd_http_bind:process_request(Data, IP); + ejabberd_http_bind:process_request(Data, IP, Opts); process([], #request{method = 'GET', data = <<>>}) -> {200, ?HEADER, get_human_html_xmlel()}; process([], #request{method = 'OPTIONS', data = <<>>}) -> |