aboutsummaryrefslogtreecommitdiff
path: root/src/ejabberd_c2s.erl
diff options
context:
space:
mode:
Diffstat (limited to 'src/ejabberd_c2s.erl')
-rw-r--r--src/ejabberd_c2s.erl35
1 files changed, 32 insertions, 3 deletions
diff --git a/src/ejabberd_c2s.erl b/src/ejabberd_c2s.erl
index 891756acf..4a21772cb 100644
--- a/src/ejabberd_c2s.erl
+++ b/src/ejabberd_c2s.erl
@@ -46,6 +46,7 @@
sasl_state,
access,
shaper,
+ zlib = false,
tls = false,
tls_required = false,
tls_enabled = false,
@@ -125,6 +126,7 @@ init([{SockMod, Socket}, Opts]) ->
{value, {_, S}} -> S;
_ -> none
end,
+ Zlib = lists:member(zlib, Opts),
StartTLS = lists:member(starttls, Opts),
StartTLSRequired = lists:member(starttls_required, Opts),
TLSEnabled = lists:member(tls, Opts),
@@ -145,6 +147,7 @@ init([{SockMod, Socket}, Opts]) ->
{ok, wait_for_stream, #state{socket = Socket1,
sockmod = SockMod1,
receiver = ReceiverPid,
+ zlib = Zlib,
tls = TLS,
tls_required = StartTLSRequired,
tls_enabled = TLSEnabled,
@@ -200,10 +203,22 @@ wait_for_stream({xmlstreamstart, _Name, Attrs}, StateData) ->
{xmlelement, "mechanism", [],
[{xmlcdata, S}]}
end, cyrsasl:listmech(Server)),
+ SockMod = StateData#state.sockmod,
+ Zlib = StateData#state.zlib,
+ CompressFeature =
+ case Zlib andalso
+ (SockMod /= ejabberd_zlib) of
+ true ->
+ [{xmlelement, "compression",
+ [{"xmlns", ?NS_FEATURE_COMPRESS}],
+ [{xmlelement, "method",
+ [], [{xmlcdata, "zlib"}]}]}];
+ _ ->
+ []
+ end,
TLS = StateData#state.tls,
TLSEnabled = StateData#state.tls_enabled,
TLSRequired = StateData#state.tls_required,
- SockMod = StateData#state.sockmod,
TLSFeature =
case (TLS == true) andalso
(TLSEnabled == false) andalso
@@ -224,7 +239,7 @@ wait_for_stream({xmlstreamstart, _Name, Attrs}, StateData) ->
end,
send_element(StateData,
{xmlelement, "stream:features", [],
- TLSFeature ++
+ TLSFeature ++ CompressFeature ++
[{xmlelement, "mechanisms",
[{"xmlns", ?NS_SASL}],
Mechs}] ++
@@ -337,7 +352,7 @@ wait_for_auth({xmlstreamelement, El}, StateData) ->
end,
send_element(StateData, Res),
{next_state, wait_for_auth, StateData};
- {auth, _ID, set, {U, P, D, ""}} ->
+ {auth, _ID, set, {_U, _P, _D, ""}} ->
Err = jlib:make_error_reply(
El,
?ERR_AUTH_NO_RESOURCE_PROVIDED(StateData#state.lang)),
@@ -434,6 +449,7 @@ wait_for_auth(closed, StateData) ->
wait_for_feature_request({xmlstreamelement, El}, StateData) ->
{xmlelement, Name, Attrs, Els} = El,
+ Zlib = StateData#state.zlib,
TLS = StateData#state.tls,
TLSEnabled = StateData#state.tls_enabled,
TLSRequired = StateData#state.tls_required,
@@ -497,6 +513,19 @@ wait_for_feature_request({xmlstreamelement, El}, StateData) ->
streamid = new_id(),
tls_enabled = true
}};
+ {?NS_COMPRESS, "compress"} when Zlib == true,
+ SockMod /= ejabberd_zlib ->
+ Socket = StateData#state.socket,
+ {ok, ZlibSocket} = ejabberd_zlib:enable_zlib(SockMod, Socket),
+ ejabberd_receiver:compress(StateData#state.receiver, ZlibSocket),
+ send_element(StateData,
+ {xmlelement, "compressed",
+ [{"xmlns", ?NS_COMPRESS}], []}),
+ {next_state, wait_for_stream,
+ StateData#state{sockmod = ejabberd_zlib,
+ socket = ZlibSocket,
+ streamid = new_id()
+ }};
_ ->
if
(SockMod == gen_tcp) and TLSRequired ->