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:
Removed dict dependency
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:13 2008
@@ -63,8 +63,8 @@
-export([parse_qs/1, parse_post/1, urlencode/1, quote/1,
normalize_header/1,
unquote_path/1, path_components/3]).
-%% dict module for "overflow" variable bags
--define(DICT, dict).
+%% Header methods
+-export([insert_header/3]).
%%====================================================================
%% API
@@ -197,13 +197,21 @@
get_header1("x-http-method-override",
#ewgi_context{request=#ewgi_request{http_headers=#ewgi_http_headers{http_x_http_method_override=V}}})
->
V;
get_header1(Hdr,
#ewgi_context{request=#ewgi_request{http_headers=#ewgi_http_headers{other=D}}})
->
- case ?DICT:find(Hdr, D) of
- {ok, V} ->
- V;
- error ->
+ case gb_trees:lookup(Hdr, D) of
+ {value, V} ->
+ merge_header_values(V);
+ none ->
undefined
end.
+%% Inefficient
+merge_header_values(V) when is_list(V) ->
+ lists:foldl(fun({_, Val}, []) ->
+ Val;
+ ({_, Val}, Acc) ->
+ Acc ++ ", " ++ Val
+ end, [], V).
+
auth_type(V, #ewgi_context{request=Req0}=Ctx0) ->
Req = Req0#ewgi_request{auth_type=V},
Ctx0#ewgi_context{request=Req}.
@@ -277,7 +285,11 @@
Ctx0#ewgi_context{request=Req}.
get_all_headers(#ewgi_context{request=#ewgi_request{http_headers=#ewgi_http_headers{other=HDict}=H}})
->
- Acc = ?DICT:to_list(HDict),
+ F = fun ({K, L}, Acc0) ->
+ L1 = lists:reverse(L),
+ lists:foldl(fun (V, Acc) -> [{K, V}|Acc] end, Acc0, L1)
+ end,
+ Acc = lists:reverse(lists:foldl(F, [], gb_trees:values(HDict))),
[{"accept", H#ewgi_http_headers.http_accept},
{"cookie", H#ewgi_http_headers.http_cookie},
{"host", H#ewgi_http_headers.http_host},
@@ -325,15 +337,15 @@
find_data(Key, Ctx, undefined).
find_data(Key,
#ewgi_context{request=#ewgi_request{ewgi=#ewgi_spec{data=D}}}, Default) ->
- case ?DICT:find(Key, D) of
- {ok, V} ->
+ case gb_trees:lookup(Key, D) of
+ {value, V} ->
V;
- error ->
+ none ->
Default
end.
store_data(Key, Val,
#ewgi_context{request=#ewgi_request{ewgi=#ewgi_spec{data=D0}=E}=Req}=Ctx) ->
- D = ?DICT:store(Key, Val, D0),
+ D = gb_trees:enter(Key, Val, D0),
Ctx#ewgi_context{request=Req#ewgi_request{ewgi=E#ewgi_spec{data=D}}}.
%%--------------------------------------------------------------------
@@ -658,3 +670,14 @@
F(Rec, V)
end
end, EmptyRec, Fields).
+
+tlookup_default(K, T, Default) ->
+ case gb_trees:lookup(K, T) of
+ {value, V} ->
+ V;
+ none ->
+ Default
+ end.
+
+insert_header(K, Pair, T) ->
+ gb_trees:enter(K, [Pair|tlookup_default(K, T, [])], 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:13 2008
@@ -32,8 +32,6 @@
-define(EWGI2MOCHI(Err, Hdrs), {element(1, Err), Hdrs, element(2, Err)}).
--define(DICT, dict).
-
%%====================================================================
%% ewgi_server callbacks
%%====================================================================
@@ -247,7 +245,7 @@
{1, 0};
parse_ewgi_element(data, _Req) ->
- ?DICT:new();
+ gb_trees:new();
%% Ignore others
parse_ewgi_element(_, _) ->
@@ -272,7 +270,7 @@
Req:get_header_value("x-http-method-override");
parse_http_header_element(other, Req) ->
- lists:foldl(fun(Pair, Acc) ->
+ lists:foldl(fun({K0, _}=Pair, Acc) ->
{K, V} = ewgi_api:normalize_header(Pair),
case K of
K when K =:= "content-length"
@@ -285,9 +283,21 @@
orelse K =:= "x-http-method-override" ->
Acc;
_ ->
- ?DICT:store(K, V, Acc)
+ ewgi_api:insert_header(K, {K0, V}, Acc)
end
- end, ?DICT:new(),
mochiweb_headers:to_list(Req:get(headers)));
+ 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:13 2008
@@ -30,8 +30,6 @@
-include_lib("yaws_api.hrl").
-include("ewgi.hrl").
--define(DICT, dict).
-
-define(INTERNAL_ERROR, [{status, 500}, {content, "text/plain",
<<"Internal Server Error">>}]).
-define(BAD_REQUEST, [{status, 400}, {content, "text/plain", <<"Bad
Request">>}]).
@@ -188,7 +186,7 @@
{1, 0};
parse_ewgi_element(data, _) ->
- ?DICT:new();
+ gb_trees:new();
parse_ewgi_element(_, _) ->
undefined.
@@ -222,11 +220,12 @@
parse_http_header_element(other, #arg{headers=#headers{other=HOther}=H}) ->
Dict0 = lists:foldl(fun(El, DAcc) ->
- {K, V} =
ewgi_api:normalize_header({element(3, El), element(5, El)}),
- ?DICT:store(K, V, DAcc)
- end, ?DICT:new(), HOther),
+ K0 = element(3, El),
+ {K, V} = ewgi_api:normalize_header({K0,
element(5, El)}),
+ ewgi_api:insert_header(K0, {K, V}, DAcc)
+ end, gb_trees:new(), HOther),
lists:foldl(fun({K, V}, DAcc) ->
- ?DICT:store(K, V, DAcc)
+ gb_trees:insert(K, V, DAcc)
end, Dict0, [{"connection", H#headers.connection},
{"if-match", H#headers.if_match},
{"if-none-match", H#headers.if_none_match},