aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorYAMAMOTO Takashi <[email protected]>2013-08-24 02:13:44 +0900
committerYAMAMOTO Takashi <[email protected]>2013-09-03 02:08:55 +0900
commit77f7427b4162d518bd4c22806e5acdb40f4fa675 (patch)
tree5b465c3960fab4f984ca62b76596cff4b2d4d8c2 /src
parentd68b3de9d96dbe0fab56b78cdfeb699055446746 (diff)
downloadcowboy-77f7427b4162d518bd4c22806e5acdb40f4fa675.tar.gz
cowboy-77f7427b4162d518bd4c22806e5acdb40f4fa675.tar.bz2
cowboy-77f7427b4162d518bd4c22806e5acdb40f4fa675.zip
cowboy_protocol: accept host using ipv6 literal
Diffstat (limited to 'src')
-rw-r--r--src/cowboy_protocol.erl68
-rw-r--r--src/cowboy_spdy.erl2
2 files changed, 37 insertions, 33 deletions
diff --git a/src/cowboy_protocol.erl b/src/cowboy_protocol.erl
index 40be2c0..887e3aa 100644
--- a/src/cowboy_protocol.erl
+++ b/src/cowboy_protocol.erl
@@ -54,7 +54,7 @@
%% Internal.
-export([init/4]).
-export([parse_request/3]).
--export([parse_host/2]).
+-export([parse_host/3]).
-export([resume/6]).
-type opts() :: [{compress, boolean()}
@@ -426,7 +426,7 @@ request(B, State=#state{transport=Transport}, M, P, Q, Version, Headers) ->
request(B, State, M, P, Q, Version, Headers,
<<>>, default_port(Transport:name()));
{_, RawHost} ->
- case catch parse_host(RawHost, <<>>) of
+ case catch parse_host(RawHost, false, <<>>) of
{'EXIT', _} ->
error_terminate(400, State);
{Host, undefined} ->
@@ -443,39 +443,43 @@ default_port(ssl) -> 443;
default_port(_) -> 80.
%% Another hurtful block of code. :)
-parse_host(<<>>, Acc) ->
+parse_host(<< $[, Rest/bits >>, false, <<>>) ->
+ parse_host(Rest, true, << $[ >>);
+parse_host(<<>>, false, Acc) ->
{Acc, undefined};
-parse_host(<< $:, Rest/bits >>, Acc) ->
+parse_host(<< $:, Rest/bits >>, false, Acc) ->
{Acc, list_to_integer(binary_to_list(Rest))};
-parse_host(<< C, Rest/bits >>, Acc) ->
+parse_host(<< $], Rest/bits >>, true, Acc) ->
+ parse_host(Rest, false, << Acc/binary, $] >>);
+parse_host(<< C, Rest/bits >>, E, Acc) ->
case C of
- $A -> parse_host(Rest, << Acc/binary, $a >>);
- $B -> parse_host(Rest, << Acc/binary, $b >>);
- $C -> parse_host(Rest, << Acc/binary, $c >>);
- $D -> parse_host(Rest, << Acc/binary, $d >>);
- $E -> parse_host(Rest, << Acc/binary, $e >>);
- $F -> parse_host(Rest, << Acc/binary, $f >>);
- $G -> parse_host(Rest, << Acc/binary, $g >>);
- $H -> parse_host(Rest, << Acc/binary, $h >>);
- $I -> parse_host(Rest, << Acc/binary, $i >>);
- $J -> parse_host(Rest, << Acc/binary, $j >>);
- $K -> parse_host(Rest, << Acc/binary, $k >>);
- $L -> parse_host(Rest, << Acc/binary, $l >>);
- $M -> parse_host(Rest, << Acc/binary, $m >>);
- $N -> parse_host(Rest, << Acc/binary, $n >>);
- $O -> parse_host(Rest, << Acc/binary, $o >>);
- $P -> parse_host(Rest, << Acc/binary, $p >>);
- $Q -> parse_host(Rest, << Acc/binary, $q >>);
- $R -> parse_host(Rest, << Acc/binary, $r >>);
- $S -> parse_host(Rest, << Acc/binary, $s >>);
- $T -> parse_host(Rest, << Acc/binary, $t >>);
- $U -> parse_host(Rest, << Acc/binary, $u >>);
- $V -> parse_host(Rest, << Acc/binary, $v >>);
- $W -> parse_host(Rest, << Acc/binary, $w >>);
- $X -> parse_host(Rest, << Acc/binary, $x >>);
- $Y -> parse_host(Rest, << Acc/binary, $y >>);
- $Z -> parse_host(Rest, << Acc/binary, $z >>);
- _ -> parse_host(Rest, << Acc/binary, C >>)
+ $A -> parse_host(Rest, E, << Acc/binary, $a >>);
+ $B -> parse_host(Rest, E, << Acc/binary, $b >>);
+ $C -> parse_host(Rest, E, << Acc/binary, $c >>);
+ $D -> parse_host(Rest, E, << Acc/binary, $d >>);
+ $E -> parse_host(Rest, E, << Acc/binary, $e >>);
+ $F -> parse_host(Rest, E, << Acc/binary, $f >>);
+ $G -> parse_host(Rest, E, << Acc/binary, $g >>);
+ $H -> parse_host(Rest, E, << Acc/binary, $h >>);
+ $I -> parse_host(Rest, E, << Acc/binary, $i >>);
+ $J -> parse_host(Rest, E, << Acc/binary, $j >>);
+ $K -> parse_host(Rest, E, << Acc/binary, $k >>);
+ $L -> parse_host(Rest, E, << Acc/binary, $l >>);
+ $M -> parse_host(Rest, E, << Acc/binary, $m >>);
+ $N -> parse_host(Rest, E, << Acc/binary, $n >>);
+ $O -> parse_host(Rest, E, << Acc/binary, $o >>);
+ $P -> parse_host(Rest, E, << Acc/binary, $p >>);
+ $Q -> parse_host(Rest, E, << Acc/binary, $q >>);
+ $R -> parse_host(Rest, E, << Acc/binary, $r >>);
+ $S -> parse_host(Rest, E, << Acc/binary, $s >>);
+ $T -> parse_host(Rest, E, << Acc/binary, $t >>);
+ $U -> parse_host(Rest, E, << Acc/binary, $u >>);
+ $V -> parse_host(Rest, E, << Acc/binary, $v >>);
+ $W -> parse_host(Rest, E, << Acc/binary, $w >>);
+ $X -> parse_host(Rest, E, << Acc/binary, $x >>);
+ $Y -> parse_host(Rest, E, << Acc/binary, $y >>);
+ $Z -> parse_host(Rest, E, << Acc/binary, $z >>);
+ _ -> parse_host(Rest, E, << Acc/binary, C >>)
end.
%% End of request parsing.
diff --git a/src/cowboy_spdy.erl b/src/cowboy_spdy.erl
index cc4d867..32d65df 100644
--- a/src/cowboy_spdy.erl
+++ b/src/cowboy_spdy.erl
@@ -474,7 +474,7 @@ request_init(Parent, StreamID, Peer,
#special_headers{method=Method, path=Path, version=Version,
host=Host}) ->
Version2 = parse_version(Version),
- {Host2, Port} = cowboy_protocol:parse_host(Host, <<>>),
+ {Host2, Port} = cowboy_protocol:parse_host(Host, false, <<>>),
{Path2, Query} = parse_path(Path, <<>>),
Req = cowboy_req:new({Parent, StreamID}, ?MODULE, Peer,
Method, Path2, Query, Version2, Headers,