diff --git a/src/nksip_parse_sipmsg.erl b/src/nksip_parse_sipmsg.erl index 85852265..384306e0 100644 --- a/src/nksip_parse_sipmsg.erl +++ b/src/nksip_parse_sipmsg.erl @@ -125,6 +125,9 @@ first(Bin) -> {Uri, <<"SIP/2.0\r\n", Rest2/binary>>} -> RUri = <<$<, (list_to_binary(Uri))/binary, $>>>, {req, nksip_parse:method(Method), RUri, Rest2}; + {Uri, <<"SIP/2.0\n", Rest3/binary>>} -> + RUri = <<$<, (list_to_binary(Uri))/binary, $>>>, + {req, nksip_parse:method(Method), RUri, Rest3}; _ -> throw({line, ?LINE}) end. @@ -136,6 +139,8 @@ headers(<<>>, _Acc) -> headers(<<"\r\n", Body/binary>>, Acc) -> {lists:reverse(Acc), Body}; +headers(<<"\n", Body/binary>>, Acc) -> + headers(<<$\r, $\n, Body/binary>>, Acc); headers(Bin, Acc) -> {Name, Value, Rest} = name(Bin, []), @@ -150,6 +155,7 @@ headers(Bin, Acc) -> name(<<$\s, Rest/binary>>, Acc) -> colon(remove_ws(Rest), lists:reverse(Acc)); name(<<$\t, Rest/binary>>, Acc) -> colon(remove_ws(Rest), lists:reverse(Acc)); name(<<$\r, $\n, _/binary>>, _Acc) -> throw({line, ?LINE}); +name(<<$\n, Rest/binary>>, Acc) -> name(<<$\r, $\n, Rest/binary>>, Acc); name(<<$:, Rest/binary>>, Acc) -> value(remove_ws(Rest), lists:reverse(Acc), []); name(<>, Acc) when Ch>=$A, Ch=<$Z -> name(Rest, [Ch+32|Acc]); name(<>, Acc) -> name(Rest, [Ch|Acc]); @@ -165,6 +171,7 @@ colon(_, _N) -> throw({line, ?LINE}). value(<<$\r, $\n, $\s, Rest/binary>>, N, Acc) -> value(remove_ws(Rest), N, [$\s|Acc]); value(<<$\r, $\n, $\t, Rest/binary>>, N, Acc) -> value(remove_ws(Rest), N, [$\s|Acc]); value(<<$\r, $\n, Rest/binary>>, N, Acc) -> {N, lists:reverse(Acc), Rest}; +value(<<$\n, Rest/binary>>, N, Acc) -> value(<<$\r, $\n, Rest/binary>>, N, Acc); value(<>, N, Acc) -> value(Rest, N, [Ch|Acc]); value(<<>>, _N, _Acc) -> throw({line, ?LINE}). @@ -178,6 +185,7 @@ until_sp(<>, Acc) -> until_sp(Rest, [Ch|Acc]). %% @private until_rn(<<$\r, $\n, Rest/binary>>, Acc) -> {lists:reverse(Acc), Rest}; +until_rn(<<$\n, Rest/binary>>, Acc) -> until_rn(<<$\r, $\n, Rest/binary>>, Acc); until_rn(<<>>, _Acc) -> throw({line, ?LINE}); until_rn(<>, Acc) -> until_rn(Rest, [Ch|Acc]).