Browse Source

Add cow_http_hd:parse_sec_websocket_protocol_resp/1

From RFC6455.
Loïc Hoguin 10 years ago
parent
commit
bbec976ff6
1 changed files with 43 additions and 0 deletions
  1. 43 0
      src/cow_http_hd.erl

+ 43 - 0
src/cow_http_hd.erl

@@ -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.