aboutsummaryrefslogtreecommitdiffstats
path: root/src/cow_http_hd.erl
diff options
context:
space:
mode:
authorLoïc Hoguin <[email protected]>2014-12-24 19:42:30 +0200
committerLoïc Hoguin <[email protected]>2014-12-24 19:44:04 +0200
commitbbec976ff68de29a25f769f54b4d535e1de0ff8c (patch)
tree8be23cfb52918d6335eb59a08c49e17a053de89c /src/cow_http_hd.erl
parent4a08cff7389e67e270c5d5477e569104287b6918 (diff)
downloadcowlib-bbec976ff68de29a25f769f54b4d535e1de0ff8c.tar.gz
cowlib-bbec976ff68de29a25f769f54b4d535e1de0ff8c.tar.bz2
cowlib-bbec976ff68de29a25f769f54b4d535e1de0ff8c.zip
Add cow_http_hd:parse_sec_websocket_protocol_resp/1
From RFC6455.
Diffstat (limited to 'src/cow_http_hd.erl')
-rw-r--r--src/cow_http_hd.erl43
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.