aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAlexey Shchepin <alexey@process-one.net>2006-01-24 22:52:23 +0000
committerAlexey Shchepin <alexey@process-one.net>2006-01-24 22:52:23 +0000
commit976a61666294bcf793cc77fe96badb2a73305237 (patch)
treeb0e9e8ce93243c298eb67c17e1f3582f773cb206 /src
parent* src/mod_roster_odbc.erl: Bugfix (diff)
* src/ejabberd_c2s.erl: Better error handling for stream
compression support (thanks to Sergei Golovan) SVN Revision: 491
Diffstat (limited to 'src')
-rw-r--r--src/ejabberd_c2s.erl44
1 files changed, 32 insertions, 12 deletions
diff --git a/src/ejabberd_c2s.erl b/src/ejabberd_c2s.erl
index 636cd96a2..f1db47da6 100644
--- a/src/ejabberd_c2s.erl
+++ b/src/ejabberd_c2s.erl
@@ -505,7 +505,6 @@ wait_for_feature_request({xmlstreamelement, El}, StateData) ->
lists:keydelete(
certfile, 1, StateData#state.tls_options)]
end,
- io:format("O: ~p~n", [TLSOpts]),
{ok, TLSSocket} = tls:tcp_to_tls(Socket, TLSOpts),
ejabberd_receiver:starttls(StateData#state.receiver, TLSSocket),
send_element(StateData,
@@ -518,17 +517,38 @@ wait_for_feature_request({xmlstreamelement, El}, StateData) ->
}};
{?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()
- }};
+ case xml:get_subtag(El, "method") of
+ false ->
+ send_element(StateData,
+ {xmlelement, "failure",
+ [{"xmlns", ?NS_COMPRESS}],
+ [{xmlelement, "setup-failed", [], []}]}),
+ {next_state, wait_for_feature_request, StateData};
+ Method ->
+ case xml:get_tag_cdata(Method) of
+ "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()
+ }};
+ _ ->
+ send_element(StateData,
+ {xmlelement, "failure",
+ [{"xmlns", ?NS_COMPRESS}],
+ [{xmlelement, "unsupported-method",
+ [], []}]}),
+ {next_state, wait_for_feature_request, StateData}
+ end
+ end;
_ ->
if
(SockMod == gen_tcp) and TLSRequired ->