aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSteven Gravell <[email protected]>2011-06-27 13:02:07 +0100
committerSteven Gravell <[email protected]>2011-06-27 15:25:30 +0100
commitbebe3dc5d2012877cdaf349012517eed40a93112 (patch)
tree31030dbaeb3ec0e835404ad95a9a8f1e770cead4
parentf03dbf4d0662a231454f7c188c10e2892c2733ce (diff)
downloadcowboy-bebe3dc5d2012877cdaf349012517eed40a93112.tar.gz
cowboy-bebe3dc5d2012877cdaf349012517eed40a93112.tar.bz2
cowboy-bebe3dc5d2012877cdaf349012517eed40a93112.zip
do not send ports 80 and 443 - browsers get mad
Browsers get mad that the returned location address is not the same as what they sent, since the :(80|443) is stripped. Add a simple eunit test due to existing ct websockets tests not covering this case.
-rw-r--r--src/cowboy_http_websocket.erl33
-rw-r--r--test/http_SUITE.erl2
2 files changed, 28 insertions, 7 deletions
diff --git a/src/cowboy_http_websocket.erl b/src/cowboy_http_websocket.erl
index 6a972da..8463ff5 100644
--- a/src/cowboy_http_websocket.erl
+++ b/src/cowboy_http_websocket.erl
@@ -17,6 +17,7 @@
-export([handler_loop/4]). %% Internal.
-include("include/http.hrl").
+-include_lib("eunit/include/eunit.hrl").
-record(state, {
handler :: module(),
@@ -102,12 +103,18 @@ websocket_handshake(State=#state{origin=Origin, challenge=Challenge},
-spec websocket_location(atom(), binary(), inet:ip_port(), binary())
-> binary().
-websocket_location(ssl, Host, Port, Path) ->
- << "wss://", Host/binary, ":",
- (list_to_binary(integer_to_list(Port)))/binary, Path/binary >>;
-websocket_location(_Any, Host, Port, Path) ->
- << "ws://", Host/binary, ":",
- (list_to_binary(integer_to_list(Port)))/binary, Path/binary >>.
+websocket_location(Protocol, Host, Port, Path) ->
+ << (websocket_location_protocol(Protocol))/binary, "://", Host/binary,
+ (websocket_location_port(ssl, Port))/binary, Path/binary >>.
+
+-spec websocket_location_protocol(atom()) -> binary().
+websocket_location_protocol(ssl) -> <<"wss">>;
+websocket_location_protocol(_) -> <<"ws">>.
+
+-spec websocket_location_port(atom(), inet:ip_port()) -> binary().
+websocket_location_port(ssl, 443) -> <<"">>;
+websocket_location_port(_, 80) -> <<"">>;
+websocket_location_port(_, Port) -> <<":", (list_to_binary(integer_to_list(Port)))/binary>>.
-spec handler_before_loop(#state{}, #http_req{}, any(), binary()) -> ok.
handler_before_loop(State=#state{hibernate=true},
@@ -218,3 +225,17 @@ handler_terminate(#state{handler=Handler, opts=Opts},
[Handler, Class, Reason, TerminateReason, Opts,
HandlerState, Req, erlang:get_stacktrace()])
end.
+
+%% eunit
+
+-ifdef(TEST).
+
+websocket_location_test() ->
+ ?assertEqual(<<"ws://localhost/path">>, websocket_location(other, <<"localhost">>, 80, <<"/path">>)),
+ ?assertEqual(<<"ws://localhost:8080/path">>, websocket_location(other, <<"localhost">>, 8080, <<"/path">>)),
+ ?assertEqual(<<"wss://localhost/path">>, websocket_location(ssl, <<"localhost">>, 443, <<"/path">>)),
+ ?assertEqual(<<"wss://localhost:8443/path">>, websocket_location(ssl, <<"localhost">>, 8443, <<"/path">>)),
+ ok.
+
+-endif.
+
diff --git a/test/http_SUITE.erl b/test/http_SUITE.erl
index b5b615d..409914d 100644
--- a/test/http_SUITE.erl
+++ b/test/http_SUITE.erl
@@ -212,7 +212,7 @@ websocket(Config) ->
[Headers, Body] = websocket_headers(erlang:decode_packet(httph, Rest, []), []),
{'Connection', "Upgrade"} = lists:keyfind('Connection', 1, Headers),
{'Upgrade', "WebSocket"} = lists:keyfind('Upgrade', 1, Headers),
- {"sec-websocket-location", "ws://localhost:80/websocket"}
+ {"sec-websocket-location", "ws://localhost/websocket"}
= lists:keyfind("sec-websocket-location", 1, Headers),
{"sec-websocket-origin", "http://localhost"}
= lists:keyfind("sec-websocket-origin", 1, Headers),