]> granicus.if.org Git - ejabberd/commitdiff
* src/ejabberd_c2s.erl: Better error handling for stream
authorAlexey Shchepin <alexey@process-one.net>
Tue, 24 Jan 2006 22:52:23 +0000 (22:52 +0000)
committerAlexey Shchepin <alexey@process-one.net>
Tue, 24 Jan 2006 22:52:23 +0000 (22:52 +0000)
compression support (thanks to Sergei Golovan)

SVN Revision: 491

ChangeLog
src/ejabberd_c2s.erl

index 4d9262994e4b0dc8f60b3601124d32d91af9c3d4..c5c1c978f2395e79b159d98c785a1b291124795e 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2006-01-25  Alexey Shchepin  <alexey@sevcom.net>
+
+       * src/ejabberd_c2s.erl: Better error handling for stream
+       compression support (thanks to Sergei Golovan)
+
 2006-01-24  Alexey Shchepin  <alexey@sevcom.net>
 
        * src/mod_roster_odbc.erl: Bugfix
index 636cd96a2563ab2a19e4a21f5b96e2fefb1e28c7..f1db47da6e190bba1ab2e21da5d8f768bf3cd603 100644 (file)
@@ -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 ->