Modified:
branches/RB-0.2/lib/ewgi/src/ewgi_api.erl
branches/RB-0.2/lib/ewgi/src/ewgi_mochiweb.erl
branches/RB-0.2/lib/ewgi/src/ewgi_yaws.erl
Log:
Correct header implementation
Modified: branches/RB-0.2/lib/ewgi/src/ewgi_api.erl
==============================================================================
--- branches/RB-0.2/lib/ewgi/src/ewgi_api.erl (original)
+++ branches/RB-0.2/lib/ewgi/src/ewgi_api.erl Tue Oct 21 10:17:27 2008
@@ -52,9 +52,10 @@
server_protocol/2, server_software/2]).
%% Additional request methods
--export([get_header/2, get_all_headers/1, read_input/1, read_input/3,
- read_input_string/2, write_error/2, url_scheme/1, version/1,
- get_all_data/1, find_data/2, store_data/3]).
+-export([get_header_value/2, set_header/3, insert_header/3,
+ get_all_headers/1, read_input/1, read_input/3,
read_input_string/2,
+ write_error/2, url_scheme/1, version/1, get_all_data/1,
find_data/2,
+ store_data/3]).
%% Server methods
-export([server_request_foldl/4]).
@@ -63,9 +64,6 @@
-export([parse_qs/1, parse_post/1, urlencode/1, quote/1,
normalize_header/1,
unquote_path/1, path_components/3]).
-%% Header methods
--export([insert_header/3]).
-
%%====================================================================
%% API
%%====================================================================
@@ -180,7 +178,7 @@
server_software(#ewgi_context{request=#ewgi_request{server_software=V}}) ->
V.
-get_header(Hdr0, Ctx) when is_list(Hdr0) ->
+get_header_value(Hdr0, Ctx) when is_list(Hdr0) ->
Hdr = string:to_lower(Hdr0),
get_header1(Hdr, Ctx).
@@ -199,18 +197,26 @@
get_header1(Hdr,
#ewgi_context{request=#ewgi_request{http_headers=#ewgi_http_headers{other=D}}})
->
case gb_trees:lookup(Hdr, D) of
{value, V} ->
- merge_header_values(V);
+ V;
none ->
undefined
end.
-%% Inefficient
-merge_header_values(V) when is_list(V) ->
- lists:foldl(fun({_, Val}, []) ->
- Val;
- ({_, Val}, Acc) ->
- Acc ++ ", " ++ Val
- end, [], V).
+insert_header(K0, V,
#ewgi_context{request=#ewgi_request{http_headers=#ewgi_http_headers{other=D0}=H0}=R0}=Ctx0)
->
+ K = string:to_lower(K0),
+ D = t_insert_header(K, {K0, V}, D0),
+ H = H0#ewgi_http_headers{other=D},
+ R = R0#ewgi_request{http_headers=H},
+ Ctx = Ctx0#ewgi_context{request=R},
+ Ctx.
+
+set_header(K0, V,
#ewgi_context{request=#ewgi_request{http_headers=#ewgi_http_headers{other=D0}=H0}=R0}=Ctx0)
->
+ K = string:to_lower(K0),
+ D = t_enter_header(K, {K0, V}, D0),
+ H = H0#ewgi_http_headers{other=D},
+ R = R0#ewgi_request{http_headers=H},
+ Ctx = Ctx0#ewgi_context{request=R},
+ Ctx.
auth_type(V, #ewgi_context{request=Req0}=Ctx0) ->
Req = Req0#ewgi_request{auth_type=V},
@@ -573,7 +579,7 @@
%% @spec join([string()], Sep::string()) -> string()
%%
%% @doc Joins a list of elements using a separator.
-%% The result is reversed for efficiecy.
+%% The result is reversed for efficiency.
%% @end
%%--------------------------------------------------------------------
join(Strings, Sep) ->
@@ -671,7 +677,7 @@
end
end, EmptyRec, Fields).
-tlookup_default(K, T, Default) ->
+t_lookup_default(K, T, Default) ->
case gb_trees:lookup(K, T) of
{value, V} ->
V;
@@ -679,5 +685,8 @@
Default
end.
-insert_header(K, Pair, T) ->
- gb_trees:enter(K, [Pair|tlookup_default(K, T, [])], T).
+t_insert_header(K, Pair, T) ->
+ gb_trees:enter(K, lists:reverse([Pair|
lists:reverse(t_lookup_default(K, T, []))]), T).
+
+t_enter_header(K, Pair, T) ->
+ gb_trees:enter(K, Pair, T).
Modified: branches/RB-0.2/lib/ewgi/src/ewgi_mochiweb.erl
==============================================================================
--- branches/RB-0.2/lib/ewgi/src/ewgi_mochiweb.erl (original)
+++ branches/RB-0.2/lib/ewgi/src/ewgi_mochiweb.erl Tue Oct 21 10:17:27 2008
@@ -283,21 +283,15 @@
orelse K =:= "x-http-method-override" ->
Acc;
_ ->
- ewgi_api:insert_header(K, {K0, V}, Acc)
+ Ex = case gb_trees:lookup(K, Acc) of
+ {value, L} ->
+ L;
+ none ->
+ []
+ end,
+ gb_trees:insert(K, lists:reverse([{K0, V}|
lists:reverse(Ex)]), Acc)
end
end, gb_trees:new(),
mochiweb_headers:to_list(Req:get(headers)));
-
-insert(K, V, T) ->
- K1 = normalize(K),
- V1 = any_to_list(V),
- try gb_trees:insert(K1, {K, V1}, T)
- catch
- error:{key_exists, _} ->
- {K0, V0} = gb_trees:get(K1, T),
- V2 = merge(K1, V1, V0),
- gb_trees:update(K1, {K0, V2}, T)
- end.
-
parse_http_header_element(_, _) ->
undefined.
Modified: branches/RB-0.2/lib/ewgi/src/ewgi_yaws.erl
==============================================================================
--- branches/RB-0.2/lib/ewgi/src/ewgi_yaws.erl (original)
+++ branches/RB-0.2/lib/ewgi/src/ewgi_yaws.erl Tue Oct 21 10:17:27 2008
@@ -222,7 +222,13 @@
Dict0 = lists:foldl(fun(El, DAcc) ->
K0 = element(3, El),
{K, V} = ewgi_api:normalize_header({K0,
element(5, El)}),
- ewgi_api:insert_header(K0, {K, V}, DAcc)
+ Ex = case gb_trees:lookup(K, Acc) of
+ {value, L} ->
+ L;
+ none ->
+ []
+ end,
+ gb_trees:insert(K, lists:reverse([{K0, V}|
lists:reverse(Ex)]), DAcc)
end, gb_trees:new(), HOther),
lists:foldl(fun({K, V}, DAcc) ->
gb_trees:insert(K, V, DAcc)