|
@@ -89,6 +89,8 @@
|
|
|
until :: non_neg_integer() | infinity
|
|
|
}).
|
|
|
|
|
|
+-include_lib("cowlib/include/cow_inline.hrl").
|
|
|
+
|
|
|
%% API.
|
|
|
|
|
|
%% @doc Start an HTTP protocol process.
|
|
@@ -292,44 +294,12 @@ match_colon(<< _, Rest/bits >>, N) ->
|
|
|
match_colon(_, _) ->
|
|
|
nomatch.
|
|
|
|
|
|
-%% I know, this isn't exactly pretty. But this is the most critical
|
|
|
-%% code path and as such needs to be optimized to death.
|
|
|
-%%
|
|
|
-%% ... Sorry for your eyes.
|
|
|
-%%
|
|
|
-%% But let's be honest, that's still pretty readable.
|
|
|
parse_hd_name(<< C, Rest/bits >>, S, M, P, Q, V, H, SoFar) ->
|
|
|
case C of
|
|
|
$: -> parse_hd_before_value(Rest, S, M, P, Q, V, H, SoFar);
|
|
|
$\s -> parse_hd_name_ws(Rest, S, M, P, Q, V, H, SoFar);
|
|
|
$\t -> parse_hd_name_ws(Rest, S, M, P, Q, V, H, SoFar);
|
|
|
- $A -> parse_hd_name(Rest, S, M, P, Q, V, H, << SoFar/binary, $a >>);
|
|
|
- $B -> parse_hd_name(Rest, S, M, P, Q, V, H, << SoFar/binary, $b >>);
|
|
|
- $C -> parse_hd_name(Rest, S, M, P, Q, V, H, << SoFar/binary, $c >>);
|
|
|
- $D -> parse_hd_name(Rest, S, M, P, Q, V, H, << SoFar/binary, $d >>);
|
|
|
- $E -> parse_hd_name(Rest, S, M, P, Q, V, H, << SoFar/binary, $e >>);
|
|
|
- $F -> parse_hd_name(Rest, S, M, P, Q, V, H, << SoFar/binary, $f >>);
|
|
|
- $G -> parse_hd_name(Rest, S, M, P, Q, V, H, << SoFar/binary, $g >>);
|
|
|
- $H -> parse_hd_name(Rest, S, M, P, Q, V, H, << SoFar/binary, $h >>);
|
|
|
- $I -> parse_hd_name(Rest, S, M, P, Q, V, H, << SoFar/binary, $i >>);
|
|
|
- $J -> parse_hd_name(Rest, S, M, P, Q, V, H, << SoFar/binary, $j >>);
|
|
|
- $K -> parse_hd_name(Rest, S, M, P, Q, V, H, << SoFar/binary, $k >>);
|
|
|
- $L -> parse_hd_name(Rest, S, M, P, Q, V, H, << SoFar/binary, $l >>);
|
|
|
- $M -> parse_hd_name(Rest, S, M, P, Q, V, H, << SoFar/binary, $m >>);
|
|
|
- $N -> parse_hd_name(Rest, S, M, P, Q, V, H, << SoFar/binary, $n >>);
|
|
|
- $O -> parse_hd_name(Rest, S, M, P, Q, V, H, << SoFar/binary, $o >>);
|
|
|
- $P -> parse_hd_name(Rest, S, M, P, Q, V, H, << SoFar/binary, $p >>);
|
|
|
- $Q -> parse_hd_name(Rest, S, M, P, Q, V, H, << SoFar/binary, $q >>);
|
|
|
- $R -> parse_hd_name(Rest, S, M, P, Q, V, H, << SoFar/binary, $r >>);
|
|
|
- $S -> parse_hd_name(Rest, S, M, P, Q, V, H, << SoFar/binary, $s >>);
|
|
|
- $T -> parse_hd_name(Rest, S, M, P, Q, V, H, << SoFar/binary, $t >>);
|
|
|
- $U -> parse_hd_name(Rest, S, M, P, Q, V, H, << SoFar/binary, $u >>);
|
|
|
- $V -> parse_hd_name(Rest, S, M, P, Q, V, H, << SoFar/binary, $v >>);
|
|
|
- $W -> parse_hd_name(Rest, S, M, P, Q, V, H, << SoFar/binary, $w >>);
|
|
|
- $X -> parse_hd_name(Rest, S, M, P, Q, V, H, << SoFar/binary, $x >>);
|
|
|
- $Y -> parse_hd_name(Rest, S, M, P, Q, V, H, << SoFar/binary, $y >>);
|
|
|
- $Z -> parse_hd_name(Rest, S, M, P, Q, V, H, << SoFar/binary, $z >>);
|
|
|
- C -> parse_hd_name(Rest, S, M, P, Q, V, H, << SoFar/binary, C >>)
|
|
|
+ ?INLINE_LOWERCASE(parse_hd_name, Rest, S, M, P, Q, V, H, SoFar)
|
|
|
end.
|
|
|
|
|
|
parse_hd_name_ws(<< C, Rest/bits >>, S, M, P, Q, V, H, Name) ->
|
|
@@ -441,8 +411,6 @@ request(B, State=#state{transport=Transport}, M, P, Q, Version, Headers) ->
|
|
|
default_port(ssl) -> 443;
|
|
|
default_port(_) -> 80.
|
|
|
|
|
|
-%% Another hurtful block of code. :)
|
|
|
-%%
|
|
|
%% Same code as cow_http:parse_fullhost/1, but inline because we
|
|
|
%% really want this to go fast.
|
|
|
parse_host(<< $[, Rest/bits >>, false, <<>>) ->
|
|
@@ -455,33 +423,7 @@ 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, 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 >>)
|
|
|
+ ?INLINE_LOWERCASE(parse_host, Rest, E, Acc)
|
|
|
end.
|
|
|
|
|
|
%% End of request parsing.
|