diff options
-rw-r--r-- | src/cow_http_hd.erl | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/src/cow_http_hd.erl b/src/cow_http_hd.erl index fb1a2b2..2305f1f 100644 --- a/src/cow_http_hd.erl +++ b/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. |