add scheme to hixie_handshake
Project: http://git-wip-us.apache.org/repos/asf/couchdb-mochiweb/repo Commit: http://git-wip-us.apache.org/repos/asf/couchdb-mochiweb/commit/55011262 Tree: http://git-wip-us.apache.org/repos/asf/couchdb-mochiweb/tree/55011262 Diff: http://git-wip-us.apache.org/repos/asf/couchdb-mochiweb/diff/55011262 Branch: refs/heads/1843-feature-bigcouch Commit: 550112627ba671ab6a6e0aeaf30d6f2b6e02f6af Parents: ecee927 Author: Bob Ippolito <[email protected]> Authored: Wed Dec 25 15:22:23 2013 -0800 Committer: Bob Ippolito <[email protected]> Committed: Wed Dec 25 15:22:23 2013 -0800 ---------------------------------------------------------------------- src/mochiweb_request_tests.erl | 182 --------------------------------- src/mochiweb_websocket.erl | 15 ++- src/mochiweb_websocket_tests.erl | 70 ------------- test/mochiweb_request_tests.erl | 182 +++++++++++++++++++++++++++++++++ test/mochiweb_websocket_tests.erl | 71 +++++++++++++ 5 files changed, 265 insertions(+), 255 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/couchdb-mochiweb/blob/55011262/src/mochiweb_request_tests.erl ---------------------------------------------------------------------- diff --git a/src/mochiweb_request_tests.erl b/src/mochiweb_request_tests.erl deleted file mode 100644 index b40c867..0000000 --- a/src/mochiweb_request_tests.erl +++ /dev/null @@ -1,182 +0,0 @@ --module(mochiweb_request_tests). - --ifdef(TEST). --include_lib("eunit/include/eunit.hrl"). - -accepts_content_type_test() -> - Req1 = mochiweb_request:new(nil, 'GET', "/foo", {1, 1}, - mochiweb_headers:make([{"Accept", "multipart/related"}])), - ?assertEqual(true, Req1:accepts_content_type("multipart/related")), - ?assertEqual(true, Req1:accepts_content_type(<<"multipart/related">>)), - - Req2 = mochiweb_request:new(nil, 'GET', "/foo", {1, 1}, - mochiweb_headers:make([{"Accept", "text/html"}])), - ?assertEqual(false, Req2:accepts_content_type("multipart/related")), - - Req3 = mochiweb_request:new(nil, 'GET', "/foo", {1, 1}, - mochiweb_headers:make([{"Accept", "text/html, multipart/*"}])), - ?assertEqual(true, Req3:accepts_content_type("multipart/related")), - - Req4 = mochiweb_request:new(nil, 'GET', "/foo", {1, 1}, - mochiweb_headers:make([{"Accept", "text/html, multipart/*; q=0.0"}])), - ?assertEqual(false, Req4:accepts_content_type("multipart/related")), - - Req5 = mochiweb_request:new(nil, 'GET', "/foo", {1, 1}, - mochiweb_headers:make([{"Accept", "text/html, multipart/*; q=0"}])), - ?assertEqual(false, Req5:accepts_content_type("multipart/related")), - - Req6 = mochiweb_request:new(nil, 'GET', "/foo", {1, 1}, - mochiweb_headers:make([{"Accept", "text/html, */*; q=0.0"}])), - ?assertEqual(false, Req6:accepts_content_type("multipart/related")), - - Req7 = mochiweb_request:new(nil, 'GET', "/foo", {1, 1}, - mochiweb_headers:make([{"Accept", "multipart/*; q=0.0, */*"}])), - ?assertEqual(false, Req7:accepts_content_type("multipart/related")), - - Req8 = mochiweb_request:new(nil, 'GET', "/foo", {1, 1}, - mochiweb_headers:make([{"Accept", "*/*; q=0.0, multipart/*"}])), - ?assertEqual(true, Req8:accepts_content_type("multipart/related")), - - Req9 = mochiweb_request:new(nil, 'GET', "/foo", {1, 1}, - mochiweb_headers:make([{"Accept", "*/*; q=0.0, multipart/related"}])), - ?assertEqual(true, Req9:accepts_content_type("multipart/related")), - - Req10 = mochiweb_request:new(nil, 'GET', "/foo", {1, 1}, - mochiweb_headers:make([{"Accept", "text/html; level=1"}])), - ?assertEqual(true, Req10:accepts_content_type("text/html;level=1")), - - Req11 = mochiweb_request:new(nil, 'GET', "/foo", {1, 1}, - mochiweb_headers:make([{"Accept", "text/html; level=1, text/html"}])), - ?assertEqual(true, Req11:accepts_content_type("text/html")), - - Req12 = mochiweb_request:new(nil, 'GET', "/foo", {1, 1}, - mochiweb_headers:make([{"Accept", "text/html; level=1; q=0.0, text/html"}])), - ?assertEqual(false, Req12:accepts_content_type("text/html;level=1")), - - Req13 = mochiweb_request:new(nil, 'GET', "/foo", {1, 1}, - mochiweb_headers:make([{"Accept", "text/html; level=1; q=0.0, text/html"}])), - ?assertEqual(false, Req13:accepts_content_type("text/html; level=1")), - - Req14 = mochiweb_request:new(nil, 'GET', "/foo", {1, 1}, - mochiweb_headers:make([{"Accept", "text/html;level=1;q=0.1, text/html"}])), - ?assertEqual(true, Req14:accepts_content_type("text/html; level=1")). - -accepted_encodings_test() -> - Req1 = mochiweb_request:new(nil, 'GET', "/foo", {1, 1}, - mochiweb_headers:make([])), - ?assertEqual(["identity"], - Req1:accepted_encodings(["gzip", "identity"])), - - Req2 = mochiweb_request:new(nil, 'GET', "/foo", {1, 1}, - mochiweb_headers:make([{"Accept-Encoding", "gzip, deflate"}])), - ?assertEqual(["gzip", "identity"], - Req2:accepted_encodings(["gzip", "identity"])), - - Req3 = mochiweb_request:new(nil, 'GET', "/foo", {1, 1}, - mochiweb_headers:make([{"Accept-Encoding", "gzip;q=0.5, deflate"}])), - ?assertEqual(["deflate", "gzip", "identity"], - Req3:accepted_encodings(["gzip", "deflate", "identity"])), - - Req4 = mochiweb_request:new(nil, 'GET', "/foo", {1, 1}, - mochiweb_headers:make([{"Accept-Encoding", "identity, *;q=0"}])), - ?assertEqual(["identity"], - Req4:accepted_encodings(["gzip", "deflate", "identity"])), - - Req5 = mochiweb_request:new(nil, 'GET', "/foo", {1, 1}, - mochiweb_headers:make([{"Accept-Encoding", "gzip; q=0.1, *;q=0"}])), - ?assertEqual(["gzip"], - Req5:accepted_encodings(["gzip", "deflate", "identity"])), - - Req6 = mochiweb_request:new(nil, 'GET', "/foo", {1, 1}, - mochiweb_headers:make([{"Accept-Encoding", "gzip; q=, *;q=0"}])), - ?assertEqual(bad_accept_encoding_value, - Req6:accepted_encodings(["gzip", "deflate", "identity"])), - - Req7 = mochiweb_request:new(nil, 'GET', "/foo", {1, 1}, - mochiweb_headers:make([{"Accept-Encoding", "gzip;q=2.0, *;q=0"}])), - ?assertEqual(bad_accept_encoding_value, - Req7:accepted_encodings(["gzip", "identity"])), - - Req8 = mochiweb_request:new(nil, 'GET', "/foo", {1, 1}, - mochiweb_headers:make([{"Accept-Encoding", "deflate, *;q=0.0"}])), - ?assertEqual([], - Req8:accepted_encodings(["gzip", "identity"])). - -accepted_content_types_test() -> - Req1 = mochiweb_request:new(nil, 'GET', "/foo", {1, 1}, - mochiweb_headers:make([{"Accept", "text/html"}])), - ?assertEqual(["text/html"], - Req1:accepted_content_types(["text/html", "application/json"])), - - Req2 = mochiweb_request:new(nil, 'GET', "/foo", {1, 1}, - mochiweb_headers:make([{"Accept", "text/html, */*;q=0"}])), - ?assertEqual(["text/html"], - Req2:accepted_content_types(["text/html", "application/json"])), - - Req3 = mochiweb_request:new(nil, 'GET', "/foo", {1, 1}, - mochiweb_headers:make([{"Accept", "text/*, */*;q=0"}])), - ?assertEqual(["text/html"], - Req3:accepted_content_types(["text/html", "application/json"])), - - Req4 = mochiweb_request:new(nil, 'GET', "/foo", {1, 1}, - mochiweb_headers:make([{"Accept", "text/*;q=0.8, */*;q=0.5"}])), - ?assertEqual(["text/html", "application/json"], - Req4:accepted_content_types(["application/json", "text/html"])), - - Req5 = mochiweb_request:new(nil, 'GET', "/foo", {1, 1}, - mochiweb_headers:make([{"Accept", "text/*;q=0.8, */*;q=0.5"}])), - ?assertEqual(["text/html", "application/json"], - Req5:accepted_content_types(["text/html", "application/json"])), - - Req6 = mochiweb_request:new(nil, 'GET', "/foo", {1, 1}, - mochiweb_headers:make([{"Accept", "text/*;q=0.5, */*;q=0.5"}])), - ?assertEqual(["application/json", "text/html"], - Req6:accepted_content_types(["application/json", "text/html"])), - - Req7 = mochiweb_request:new(nil, 'GET', "/foo", {1, 1}, - mochiweb_headers:make( - [{"Accept", "text/html;q=0.5, application/json;q=0.5"}])), - ?assertEqual(["application/json", "text/html"], - Req7:accepted_content_types(["application/json", "text/html"])), - - Req8 = mochiweb_request:new(nil, 'GET', "/foo", {1, 1}, - mochiweb_headers:make([{"Accept", "text/html"}])), - ?assertEqual([], - Req8:accepted_content_types(["application/json"])), - - Req9 = mochiweb_request:new(nil, 'GET', "/foo", {1, 1}, - mochiweb_headers:make([{"Accept", "text/*;q=0.9, text/html;q=0.5, */*;q=0.7"}])), - ?assertEqual(["application/json", "text/html"], - Req9:accepted_content_types(["text/html", "application/json"])). - -should_close_test() -> - F = fun (V, H) -> - (mochiweb_request:new( - nil, 'GET', "/", V, - mochiweb_headers:make(H) - )):should_close() - end, - ?assertEqual( - true, - F({1, 1}, [{"Connection", "close"}])), - ?assertEqual( - true, - F({1, 0}, [{"Connection", "close"}])), - ?assertEqual( - true, - F({1, 1}, [{"Connection", "ClOSe"}])), - ?assertEqual( - false, - F({1, 1}, [{"Connection", "closer"}])), - ?assertEqual( - false, - F({1, 1}, [])), - ?assertEqual( - true, - F({1, 0}, [])), - ?assertEqual( - false, - F({1, 0}, [{"Connection", "Keep-Alive"}])), - ok. - --endif. http://git-wip-us.apache.org/repos/asf/couchdb-mochiweb/blob/55011262/src/mochiweb_websocket.erl ---------------------------------------------------------------------- diff --git a/src/mochiweb_websocket.erl b/src/mochiweb_websocket.erl index 8309a11..5224312 100644 --- a/src/mochiweb_websocket.erl +++ b/src/mochiweb_websocket.erl @@ -111,7 +111,8 @@ make_handshake(Req) -> Host = Req:get_header_value("Host"), Path = Req:get(path), Body = Req:recv(8), - hixie_handshake(Host, Path, Sec1Key, Sec2Key, Body, Origin); + Scheme = scheme(Req), + hixie_handshake(Scheme, Host, Path, Sec1Key, Sec2Key, Body, Origin); true -> error @@ -127,7 +128,15 @@ hybi_handshake(SecKey) -> {"Sec-Websocket-Accept", Challenge}], ""}, {hybi, Response}. -hixie_handshake(Host, Path, Key1, Key2, Body, Origin) -> +scheme(Req) -> + case mochiweb_request:get(scheme, Req) of + http -> + "ws://"; + https -> + "wss://" + end. + +hixie_handshake(Scheme, Host, Path, Key1, Key2, Body, Origin) -> Ikey1 = [D || D <- Key1, $0 =< D, D =< $9], Ikey2 = [D || D <- Key2, $0 =< D, D =< $9], Blank1 = length([D || D <- Key1, D =:= 32]), @@ -137,7 +146,7 @@ hixie_handshake(Host, Path, Key1, Key2, Body, Origin) -> Ckey = <<Part1:4/big-unsigned-integer-unit:8, Part2:4/big-unsigned-integer-unit:8, Body/binary>>, Challenge = erlang:md5(Ckey), - Location = lists:concat(["ws://", Host, Path]), + Location = lists:concat([Scheme, Host, Path]), Response = {101, [{"Upgrade", "WebSocket"}, {"Connection", "Upgrade"}, http://git-wip-us.apache.org/repos/asf/couchdb-mochiweb/blob/55011262/src/mochiweb_websocket_tests.erl ---------------------------------------------------------------------- diff --git a/src/mochiweb_websocket_tests.erl b/src/mochiweb_websocket_tests.erl deleted file mode 100644 index a98a9ea..0000000 --- a/src/mochiweb_websocket_tests.erl +++ /dev/null @@ -1,70 +0,0 @@ --module(mochiweb_websocket_tests). --author('[email protected]'). - -%% The MIT License (MIT) - -%% Copyright (c) 2012 Zadane.pl sp. z o.o. - -%% Permission is hereby granted, free of charge, to any person obtaining a copy -%% of this software and associated documentation files (the "Software"), to deal -%% in the Software without restriction, including without limitation the rights -%% to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -%% copies of the Software, and to permit persons to whom the Software is -%% furnished to do so, subject to the following conditions: - -%% The above copyright notice and this permission notice shall be included in -%% all copies or substantial portions of the Software. - -%% THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -%% IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -%% FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -%% AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -%% LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -%% OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -%% THE SOFTWARE. - --ifdef(TEST). --include_lib("eunit/include/eunit.hrl"). - -make_handshake_for_correct_client_test() -> - %% Hybi handshake - Req1 = mochiweb_request:new(nil, 'GET', "/foo", {1, 1}, - mochiweb_headers:make([{"Sec-WebSocket-Key", "Xn3fdKyc3qEXPuj2A3O+ZA=="}])), - - {Version1, {HttpCode1, Headers1, _}} = mochiweb_websocket:make_handshake(Req1), - ?assertEqual(hybi, Version1), - ?assertEqual(101, HttpCode1), - ?assertEqual("Upgrade", proplists:get_value("Connection", Headers1)), - ?assertEqual(<<"BIFTHkJk4r5t8kuud82tZJaQsCE=">>, proplists:get_value("Sec-Websocket-Accept", Headers1)), - - %% Hixie handshake - {Version2, {HttpCode2, Headers2, Body2}} = mochiweb_websocket:hixie_handshake( - "localhost", "/", - "33j284 9 z63 e 9 7", - "TF'3|6D12659H 7 70", - <<175,181,191,215,128,195,144,120>>, - "null"), - ?assertEqual(hixie, Version2), - ?assertEqual(101, HttpCode2), - ?assertEqual("null", proplists:get_value("Sec-WebSocket-Origin", Headers2)), - ?assertEqual("ws://localhost/", proplists:get_value("Sec-WebSocket-Location", Headers2)), - ?assertEqual(<<230,144,237,94,84,214,41,69,244,150,134,167,221,103,239,246>>, Body2). - -hybi_frames_decode_test() -> - Resp1 = mochiweb_websocket:parse_hybi_frames(nil, <<129,131,118,21,153,58,16,122,246>>, []), - ?assertEqual([{1, <<"foo">>}], Resp1), - - Resp2 = mochiweb_websocket:parse_hybi_frames(nil, <<129,131,1,225,201,42,103,142,166,129,131,93,222,214,66,63,191,164>>, []), - ?assertEqual([{1, <<"foo">>}, {1, <<"bar">>}], Resp2). - -hixie_frames_decode_test() -> - Resp1 = mochiweb_websocket:parse_hixie_frames(<<>>, []), - ?assertEqual([], Resp1), - - Resp2 = mochiweb_websocket:parse_hixie_frames(<<0,102,111,111,255>>, []), - ?assertEqual([<<"foo">>], Resp2), - - Resp3 = mochiweb_websocket:parse_hixie_frames(<<0,102,111,111,255,0,98,97,114,255>>, []), - ?assertEqual([<<"foo">>, <<"bar">>], Resp3). - --endif. http://git-wip-us.apache.org/repos/asf/couchdb-mochiweb/blob/55011262/test/mochiweb_request_tests.erl ---------------------------------------------------------------------- diff --git a/test/mochiweb_request_tests.erl b/test/mochiweb_request_tests.erl new file mode 100644 index 0000000..b40c867 --- /dev/null +++ b/test/mochiweb_request_tests.erl @@ -0,0 +1,182 @@ +-module(mochiweb_request_tests). + +-ifdef(TEST). +-include_lib("eunit/include/eunit.hrl"). + +accepts_content_type_test() -> + Req1 = mochiweb_request:new(nil, 'GET', "/foo", {1, 1}, + mochiweb_headers:make([{"Accept", "multipart/related"}])), + ?assertEqual(true, Req1:accepts_content_type("multipart/related")), + ?assertEqual(true, Req1:accepts_content_type(<<"multipart/related">>)), + + Req2 = mochiweb_request:new(nil, 'GET', "/foo", {1, 1}, + mochiweb_headers:make([{"Accept", "text/html"}])), + ?assertEqual(false, Req2:accepts_content_type("multipart/related")), + + Req3 = mochiweb_request:new(nil, 'GET', "/foo", {1, 1}, + mochiweb_headers:make([{"Accept", "text/html, multipart/*"}])), + ?assertEqual(true, Req3:accepts_content_type("multipart/related")), + + Req4 = mochiweb_request:new(nil, 'GET', "/foo", {1, 1}, + mochiweb_headers:make([{"Accept", "text/html, multipart/*; q=0.0"}])), + ?assertEqual(false, Req4:accepts_content_type("multipart/related")), + + Req5 = mochiweb_request:new(nil, 'GET', "/foo", {1, 1}, + mochiweb_headers:make([{"Accept", "text/html, multipart/*; q=0"}])), + ?assertEqual(false, Req5:accepts_content_type("multipart/related")), + + Req6 = mochiweb_request:new(nil, 'GET', "/foo", {1, 1}, + mochiweb_headers:make([{"Accept", "text/html, */*; q=0.0"}])), + ?assertEqual(false, Req6:accepts_content_type("multipart/related")), + + Req7 = mochiweb_request:new(nil, 'GET', "/foo", {1, 1}, + mochiweb_headers:make([{"Accept", "multipart/*; q=0.0, */*"}])), + ?assertEqual(false, Req7:accepts_content_type("multipart/related")), + + Req8 = mochiweb_request:new(nil, 'GET', "/foo", {1, 1}, + mochiweb_headers:make([{"Accept", "*/*; q=0.0, multipart/*"}])), + ?assertEqual(true, Req8:accepts_content_type("multipart/related")), + + Req9 = mochiweb_request:new(nil, 'GET', "/foo", {1, 1}, + mochiweb_headers:make([{"Accept", "*/*; q=0.0, multipart/related"}])), + ?assertEqual(true, Req9:accepts_content_type("multipart/related")), + + Req10 = mochiweb_request:new(nil, 'GET', "/foo", {1, 1}, + mochiweb_headers:make([{"Accept", "text/html; level=1"}])), + ?assertEqual(true, Req10:accepts_content_type("text/html;level=1")), + + Req11 = mochiweb_request:new(nil, 'GET', "/foo", {1, 1}, + mochiweb_headers:make([{"Accept", "text/html; level=1, text/html"}])), + ?assertEqual(true, Req11:accepts_content_type("text/html")), + + Req12 = mochiweb_request:new(nil, 'GET', "/foo", {1, 1}, + mochiweb_headers:make([{"Accept", "text/html; level=1; q=0.0, text/html"}])), + ?assertEqual(false, Req12:accepts_content_type("text/html;level=1")), + + Req13 = mochiweb_request:new(nil, 'GET', "/foo", {1, 1}, + mochiweb_headers:make([{"Accept", "text/html; level=1; q=0.0, text/html"}])), + ?assertEqual(false, Req13:accepts_content_type("text/html; level=1")), + + Req14 = mochiweb_request:new(nil, 'GET', "/foo", {1, 1}, + mochiweb_headers:make([{"Accept", "text/html;level=1;q=0.1, text/html"}])), + ?assertEqual(true, Req14:accepts_content_type("text/html; level=1")). + +accepted_encodings_test() -> + Req1 = mochiweb_request:new(nil, 'GET', "/foo", {1, 1}, + mochiweb_headers:make([])), + ?assertEqual(["identity"], + Req1:accepted_encodings(["gzip", "identity"])), + + Req2 = mochiweb_request:new(nil, 'GET', "/foo", {1, 1}, + mochiweb_headers:make([{"Accept-Encoding", "gzip, deflate"}])), + ?assertEqual(["gzip", "identity"], + Req2:accepted_encodings(["gzip", "identity"])), + + Req3 = mochiweb_request:new(nil, 'GET', "/foo", {1, 1}, + mochiweb_headers:make([{"Accept-Encoding", "gzip;q=0.5, deflate"}])), + ?assertEqual(["deflate", "gzip", "identity"], + Req3:accepted_encodings(["gzip", "deflate", "identity"])), + + Req4 = mochiweb_request:new(nil, 'GET', "/foo", {1, 1}, + mochiweb_headers:make([{"Accept-Encoding", "identity, *;q=0"}])), + ?assertEqual(["identity"], + Req4:accepted_encodings(["gzip", "deflate", "identity"])), + + Req5 = mochiweb_request:new(nil, 'GET', "/foo", {1, 1}, + mochiweb_headers:make([{"Accept-Encoding", "gzip; q=0.1, *;q=0"}])), + ?assertEqual(["gzip"], + Req5:accepted_encodings(["gzip", "deflate", "identity"])), + + Req6 = mochiweb_request:new(nil, 'GET', "/foo", {1, 1}, + mochiweb_headers:make([{"Accept-Encoding", "gzip; q=, *;q=0"}])), + ?assertEqual(bad_accept_encoding_value, + Req6:accepted_encodings(["gzip", "deflate", "identity"])), + + Req7 = mochiweb_request:new(nil, 'GET', "/foo", {1, 1}, + mochiweb_headers:make([{"Accept-Encoding", "gzip;q=2.0, *;q=0"}])), + ?assertEqual(bad_accept_encoding_value, + Req7:accepted_encodings(["gzip", "identity"])), + + Req8 = mochiweb_request:new(nil, 'GET', "/foo", {1, 1}, + mochiweb_headers:make([{"Accept-Encoding", "deflate, *;q=0.0"}])), + ?assertEqual([], + Req8:accepted_encodings(["gzip", "identity"])). + +accepted_content_types_test() -> + Req1 = mochiweb_request:new(nil, 'GET', "/foo", {1, 1}, + mochiweb_headers:make([{"Accept", "text/html"}])), + ?assertEqual(["text/html"], + Req1:accepted_content_types(["text/html", "application/json"])), + + Req2 = mochiweb_request:new(nil, 'GET', "/foo", {1, 1}, + mochiweb_headers:make([{"Accept", "text/html, */*;q=0"}])), + ?assertEqual(["text/html"], + Req2:accepted_content_types(["text/html", "application/json"])), + + Req3 = mochiweb_request:new(nil, 'GET', "/foo", {1, 1}, + mochiweb_headers:make([{"Accept", "text/*, */*;q=0"}])), + ?assertEqual(["text/html"], + Req3:accepted_content_types(["text/html", "application/json"])), + + Req4 = mochiweb_request:new(nil, 'GET', "/foo", {1, 1}, + mochiweb_headers:make([{"Accept", "text/*;q=0.8, */*;q=0.5"}])), + ?assertEqual(["text/html", "application/json"], + Req4:accepted_content_types(["application/json", "text/html"])), + + Req5 = mochiweb_request:new(nil, 'GET', "/foo", {1, 1}, + mochiweb_headers:make([{"Accept", "text/*;q=0.8, */*;q=0.5"}])), + ?assertEqual(["text/html", "application/json"], + Req5:accepted_content_types(["text/html", "application/json"])), + + Req6 = mochiweb_request:new(nil, 'GET', "/foo", {1, 1}, + mochiweb_headers:make([{"Accept", "text/*;q=0.5, */*;q=0.5"}])), + ?assertEqual(["application/json", "text/html"], + Req6:accepted_content_types(["application/json", "text/html"])), + + Req7 = mochiweb_request:new(nil, 'GET', "/foo", {1, 1}, + mochiweb_headers:make( + [{"Accept", "text/html;q=0.5, application/json;q=0.5"}])), + ?assertEqual(["application/json", "text/html"], + Req7:accepted_content_types(["application/json", "text/html"])), + + Req8 = mochiweb_request:new(nil, 'GET', "/foo", {1, 1}, + mochiweb_headers:make([{"Accept", "text/html"}])), + ?assertEqual([], + Req8:accepted_content_types(["application/json"])), + + Req9 = mochiweb_request:new(nil, 'GET', "/foo", {1, 1}, + mochiweb_headers:make([{"Accept", "text/*;q=0.9, text/html;q=0.5, */*;q=0.7"}])), + ?assertEqual(["application/json", "text/html"], + Req9:accepted_content_types(["text/html", "application/json"])). + +should_close_test() -> + F = fun (V, H) -> + (mochiweb_request:new( + nil, 'GET', "/", V, + mochiweb_headers:make(H) + )):should_close() + end, + ?assertEqual( + true, + F({1, 1}, [{"Connection", "close"}])), + ?assertEqual( + true, + F({1, 0}, [{"Connection", "close"}])), + ?assertEqual( + true, + F({1, 1}, [{"Connection", "ClOSe"}])), + ?assertEqual( + false, + F({1, 1}, [{"Connection", "closer"}])), + ?assertEqual( + false, + F({1, 1}, [])), + ?assertEqual( + true, + F({1, 0}, [])), + ?assertEqual( + false, + F({1, 0}, [{"Connection", "Keep-Alive"}])), + ok. + +-endif. http://git-wip-us.apache.org/repos/asf/couchdb-mochiweb/blob/55011262/test/mochiweb_websocket_tests.erl ---------------------------------------------------------------------- diff --git a/test/mochiweb_websocket_tests.erl b/test/mochiweb_websocket_tests.erl new file mode 100644 index 0000000..98cb860 --- /dev/null +++ b/test/mochiweb_websocket_tests.erl @@ -0,0 +1,71 @@ +-module(mochiweb_websocket_tests). +-author('[email protected]'). + +%% The MIT License (MIT) + +%% Copyright (c) 2012 Zadane.pl sp. z o.o. + +%% Permission is hereby granted, free of charge, to any person obtaining a copy +%% of this software and associated documentation files (the "Software"), to deal +%% in the Software without restriction, including without limitation the rights +%% to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +%% copies of the Software, and to permit persons to whom the Software is +%% furnished to do so, subject to the following conditions: + +%% The above copyright notice and this permission notice shall be included in +%% all copies or substantial portions of the Software. + +%% THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +%% IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +%% FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +%% AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +%% LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +%% OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +%% THE SOFTWARE. + +-ifdef(TEST). +-include_lib("eunit/include/eunit.hrl"). + +make_handshake_for_correct_client_test() -> + %% Hybi handshake + Req1 = mochiweb_request:new(nil, 'GET', "/foo", {1, 1}, + mochiweb_headers:make([{"Sec-WebSocket-Key", "Xn3fdKyc3qEXPuj2A3O+ZA=="}])), + + {Version1, {HttpCode1, Headers1, _}} = mochiweb_websocket:make_handshake(Req1), + ?assertEqual(hybi, Version1), + ?assertEqual(101, HttpCode1), + ?assertEqual("Upgrade", proplists:get_value("Connection", Headers1)), + ?assertEqual(<<"BIFTHkJk4r5t8kuud82tZJaQsCE=">>, proplists:get_value("Sec-Websocket-Accept", Headers1)), + + %% Hixie handshake + {Version2, {HttpCode2, Headers2, Body2}} = mochiweb_websocket:hixie_handshake( + "ws://", + "localhost", "/", + "33j284 9 z63 e 9 7", + "TF'3|6D12659H 7 70", + <<175,181,191,215,128,195,144,120>>, + "null"), + ?assertEqual(hixie, Version2), + ?assertEqual(101, HttpCode2), + ?assertEqual("null", proplists:get_value("Sec-WebSocket-Origin", Headers2)), + ?assertEqual("ws://localhost/", proplists:get_value("Sec-WebSocket-Location", Headers2)), + ?assertEqual(<<230,144,237,94,84,214,41,69,244,150,134,167,221,103,239,246>>, Body2). + +hybi_frames_decode_test() -> + Resp1 = mochiweb_websocket:parse_hybi_frames(nil, <<129,131,118,21,153,58,16,122,246>>, []), + ?assertEqual([{1, <<"foo">>}], Resp1), + + Resp2 = mochiweb_websocket:parse_hybi_frames(nil, <<129,131,1,225,201,42,103,142,166,129,131,93,222,214,66,63,191,164>>, []), + ?assertEqual([{1, <<"foo">>}, {1, <<"bar">>}], Resp2). + +hixie_frames_decode_test() -> + Resp1 = mochiweb_websocket:parse_hixie_frames(<<>>, []), + ?assertEqual([], Resp1), + + Resp2 = mochiweb_websocket:parse_hixie_frames(<<0,102,111,111,255>>, []), + ?assertEqual([<<"foo">>], Resp2), + + Resp3 = mochiweb_websocket:parse_hixie_frames(<<0,102,111,111,255,0,98,97,114,255>>, []), + ?assertEqual([<<"foo">>, <<"bar">>], Resp3). + +-endif.
