]> granicus.if.org Git - ejabberd/commitdiff
Don't use binary:match to extract lines from binaries
authorPaweł Chmielowski <pchmielowski@process-one.net>
Fri, 6 Apr 2012 16:55:27 +0000 (18:55 +0200)
committerPaweł Chmielowski <pchmielowski@process-one.net>
Fri, 6 Apr 2012 16:55:27 +0000 (18:55 +0200)
This was added in R13B3, lets roll our own implementation to make sure it
works on older erlang versions.

src/web/ejabberd_http.erl

index f9d390dbef11f64f920a97c900e2eba5817d5557..067ed07d93d0be076d5167d585e56b1ae0e9c17a 100644 (file)
@@ -923,12 +923,22 @@ old_integer_to_hex(I) when I>=16 ->
 
 % The following code is mostly taken from yaws_ssl.erl
 
+extract_line(_, <<>>, _) ->
+    none;
+extract_line(0, <<"\r", Rest/binary>>, Line) ->
+    extract_line(1, Rest, Line);
+extract_line(0, <<A:8, Rest/binary>>, Line) ->
+    extract_line(0, Rest, <<Line/binary, A>>);
+extract_line(1, <<"\n", Rest/binary>>, Line) ->
+    {Line, Rest};
+extract_line(1, Data, Line) ->
+    extract_line(0, Data, <<Line/binary, "\r">>).
+
 decode_packet(_, <<"\r\n", Rest/binary>>) ->
     {ok, http_eoh, Rest};
 decode_packet(Type, Data) ->
-    case binary:match(Data, <<"\r\n">>) of
-        {Start, _Len} ->
-            <<LineB:Start/binary, _:2/binary, Rest/binary>> = Data,
+    case extract_line(0, Data, <<>>) of
+        {LineB, Rest} ->
             Line = binary_to_list(LineB),
             Result = case Type of
                          http ->