|
@@ -38,6 +38,7 @@
|
|
|
-export([parse_sec_websocket_extensions/1]).
|
|
|
-export([parse_sec_websocket_key/1]).
|
|
|
-export([parse_sec_websocket_protocol_req/1]).
|
|
|
+-export([parse_sec_websocket_protocol_resp/1]).
|
|
|
-export([parse_sec_websocket_version_req/1]).
|
|
|
-export([parse_te/1]).
|
|
|
-export([parse_trailer/1]).
|
|
@@ -1954,6 +1955,48 @@ horse_parse_sec_websocket_protocol_req() ->
|
|
|
).
|
|
|
-endif.
|
|
|
|
|
|
+%% @doc Parse the Sec-Websocket-Protocol response header.
|
|
|
+
|
|
|
+-spec parse_sec_websocket_protocol_resp(binary()) -> binary().
|
|
|
+parse_sec_websocket_protocol_resp(<< C, R/bits >>) when ?IS_TOKEN(C) ->
|
|
|
+ case C of
|
|
|
+ ?INLINE_LOWERCASE(token_ci, R, <<>>)
|
|
|
+ end.
|
|
|
+
|
|
|
+token_ci(<<>>, T) -> T;
|
|
|
+token_ci(<< C, R/bits >>, T) when ?IS_TOKEN(C) ->
|
|
|
+ case C of
|
|
|
+ ?INLINE_LOWERCASE(token_ci, R, T)
|
|
|
+ end.
|
|
|
+
|
|
|
+-ifdef(TEST).
|
|
|
+prop_parse_sec_websocket_protocol_resp() ->
|
|
|
+ ?FORALL(T,
|
|
|
+ token(),
|
|
|
+ ?INLINE_LOWERCASE_BC(T) =:= parse_sec_websocket_protocol_resp(T)).
|
|
|
+
|
|
|
+parse_sec_websocket_protocol_resp_test_() ->
|
|
|
+ Tests = [
|
|
|
+ {<<"chat">>, <<"chat">>},
|
|
|
+ {<<"CHAT">>, <<"chat">>}
|
|
|
+ ],
|
|
|
+ [{V, fun() -> R = parse_sec_websocket_protocol_resp(V) end} || {V, R} <- Tests].
|
|
|
+
|
|
|
+parse_sec_websocket_protocol_resp_error_test_() ->
|
|
|
+ Tests = [
|
|
|
+ <<>>
|
|
|
+ ],
|
|
|
+ [{V, fun() -> {'EXIT', _} = (catch parse_sec_websocket_protocol_resp(V)) end}
|
|
|
+ || V <- Tests].
|
|
|
+-endif.
|
|
|
+
|
|
|
+-ifdef(PERF).
|
|
|
+horse_parse_sec_websocket_protocol_resp() ->
|
|
|
+ horse:repeat(200000,
|
|
|
+ parse_sec_websocket_protocol_resp(<<"chat">>)
|
|
|
+ ).
|
|
|
+-endif.
|
|
|
+
|
|
|
%% @doc Parse the Sec-WebSocket-Version request header.
|
|
|
|
|
|
-spec parse_sec_websocket_version_req(binary()) -> 0..255.
|