From bbec976ff68de29a25f769f54b4d535e1de0ff8c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Hoguin?= Date: Wed, 24 Dec 2014 19:42:30 +0200 Subject: Add cow_http_hd:parse_sec_websocket_protocol_resp/1 From RFC6455. --- src/cow_http_hd.erl | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) 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. -- cgit v1.2.3