Skip to content

Commit

Permalink
Added webmachine c25ec2dfaba2 tip from http://bitbucket.org/justin/we…
Browse files Browse the repository at this point in the history
…bmachine/

Patched dispatcher of webmachine to use a custom dispatcher.
  • Loading branch information
mworrell committed Dec 15, 2009
1 parent f189630 commit d67e934
Show file tree
Hide file tree
Showing 61 changed files with 2,901 additions and 937 deletions.
4 changes: 2 additions & 2 deletions Makefile
Expand Up @@ -11,8 +11,8 @@ erl:
@$(ERL) -pa $(EBIN_DIRS) -noinput +B \ @$(ERL) -pa $(EBIN_DIRS) -noinput +B \
-eval 'case make:all() of up_to_date -> halt(0); error -> halt(1) end.' -eval 'case make:all() of up_to_date -> halt(0); error -> halt(1) end.'


docs: edoc:
@erl -noshell -run edoc_run application '$(APP)' '"."' '[]' @$(ERL) -noshell -run edoc_run application '$(APP)' '"."' '[{preprocess, true},{includes, ["."]}]'


clean: clean:
@echo "removing:" @echo "removing:"
Expand Down
5 changes: 4 additions & 1 deletion THANKS
@@ -1,7 +1,8 @@
The following people have contributed to Webmachine: The following people have contributed to Webmachine:


Justin Sheehy
Andy Gross Andy Gross
Justin Sheehy
John Muellerleile
Robert Ahrens Robert Ahrens
Jeremy Latt Jeremy Latt
Bryan Fink Bryan Fink
Expand All @@ -11,4 +12,6 @@ Marc Worrell
Seth Falcon Seth Falcon
Tuncer Ayaz Tuncer Ayaz
Martin Scholl Martin Scholl
Paul Mineiro
Dave Smith


8 changes: 0 additions & 8 deletions include/wm_host_dispatch_list.hrl

This file was deleted.

7 changes: 4 additions & 3 deletions include/wm_reqdata.hrl
@@ -1,7 +1,8 @@
-record(wm_reqdata, {method, version, peer, wmreq, -record(wm_reqdata, {method, version, peer, wm_state,
host, disp_path, path, raw_path, path_info, path_tokens, disp_path, path, raw_path, path_info, path_tokens,
app_root,response_code,max_recv_body, app_root,response_code,max_recv_body,
req_cookie, req_qs, req_headers, req_body, req_cookie, req_qs, req_headers, req_body,
resp_redirect, resp_headers, resp_body resp_redirect, resp_headers, resp_body,
host_tokens, port
}). }).


9 changes: 9 additions & 0 deletions include/wm_reqstate.hrl
@@ -0,0 +1,9 @@
-record(reqstate, {socket=undefined,
metadata=dict:new(),
range=undefined,
peer=undefined,
reqdata=undefined,
bodyfetch=undefined,
log_data=undefined
}).

1 change: 0 additions & 1 deletion priv/skel/deps/.empty
@@ -1 +0,0 @@

1 change: 0 additions & 1 deletion priv/skel/ebin/.empty
@@ -1 +0,0 @@

16 changes: 14 additions & 2 deletions priv/skel/src/skel.erl
Expand Up @@ -5,7 +5,7 @@


-module(skel). -module(skel).
-author('author <author@example.com>'). -author('author <author@example.com>').
-export([start/0, stop/0]). -export([start/0, start_link/0, stop/0]).


ensure_started(App) -> ensure_started(App) ->
case application:start(App) of case application:start(App) of
Expand All @@ -14,12 +14,24 @@ ensure_started(App) ->
{error, {already_started, App}} -> {error, {already_started, App}} ->
ok ok
end. end.


%% @spec start_link() -> {ok,Pid::pid()}
%% @doc Starts the app for inclusion in a supervisor tree
start_link() ->
skel_deps:ensure(),
ensure_started(crypto),
application:set_env(webmachine, webmachine_logger_module,
webmachine_logger),
ensure_started(webmachine),
skel_sup:start_link().

%% @spec start() -> ok %% @spec start() -> ok
%% @doc Start the skel server. %% @doc Start the skel server.
start() -> start() ->
skel_deps:ensure(), skel_deps:ensure(),
ensure_started(crypto), ensure_started(crypto),
application:set_env(webmachine, webmachine_logger_module,
webmachine_logger),
ensure_started(webmachine), ensure_started(webmachine),
application:start(skel). application:start(skel).


Expand Down
6 changes: 4 additions & 2 deletions priv/skel/src/skel_sup.erl
Expand Up @@ -41,8 +41,10 @@ upgrade() ->
%% @spec init([]) -> SupervisorTree %% @spec init([]) -> SupervisorTree
%% @doc supervisor callback. %% @doc supervisor callback.
init([]) -> init([]) ->
Ip = case os:getenv("WEBMACHINE_IP") of false -> "0.0.0.0"; Any -> Any end, Ip = case os:getenv("WEBMACHINE_IP") of false -> "0.0.0.0"; Any -> Any end,
{ok, Dispatch} = file:consult("priv/dispatch.conf"), {ok, Dispatch} = file:consult(filename:join(
[filename:dirname(code:which(?MODULE)),
"..", "priv", "dispatch.conf"])),
WebConfig = [ WebConfig = [
{ip, Ip}, {ip, Ip},
{port, 8000}, {port, 8000},
Expand Down
4 changes: 3 additions & 1 deletion src/webmachine.app
@@ -1,6 +1,6 @@
{application, webmachine, {application, webmachine,
[{description, "webmachine"}, [{description, "webmachine"},
{vsn, "1.3"}, {vsn, "1.5"},
{modules, [ {modules, [
webmachine, webmachine,
webmachine_app, webmachine_app,
Expand All @@ -13,8 +13,10 @@
webmachine_resource, webmachine_resource,
webmachine_request, webmachine_request,
webmachine_request_srv, webmachine_request_srv,
webmachine_skel,
webmachine_sup, webmachine_sup,
webmachine_mochiweb, webmachine_mochiweb,
webmachine_multipart,
webmachine_util, webmachine_util,
wrq, wrq,
wmtrace_resource wmtrace_resource
Expand Down
23 changes: 21 additions & 2 deletions src/webmachine.erl
Expand Up @@ -20,6 +20,10 @@
-export([start/0, stop/0]). -export([start/0, stop/0]).
-export([new_request/2]). -export([new_request/2]).


-include("webmachine_logger.hrl").
-include_lib("include/wm_reqstate.hrl").
-include_lib("include/wm_reqdata.hrl").

%% @spec start() -> ok %% @spec start() -> ok
%% @doc Start the webmachine server. %% @doc Start the webmachine server.
start() -> start() ->
Expand All @@ -38,8 +42,23 @@ new_request(mochiweb, Request) ->
RawPath = Request:get(raw_path), RawPath = Request:get(raw_path),
Version = Request:get(version), Version = Request:get(version),
Headers = Request:get(headers), Headers = Request:get(headers),
{ok, Pid} = webmachine_request_srv:start_link(Socket, Method, RawPath, Version, Headers), InitState = #reqstate{socket=Socket,
webmachine_request:new(Pid). reqdata=wrq:create(Method,Version,RawPath,Headers)},
InitReq = {webmachine_request,InitState},
{Peer, ReqState} = InitReq:get_peer(),
PeerState = ReqState#reqstate{reqdata=wrq:set_peer(Peer,
ReqState#reqstate.reqdata)},
LogData = #wm_log_data{start_time=now(),
method=Method,
headers=Headers,
peer=PeerState#reqstate.peer,
path=RawPath,
version=Version,
response_code=404,
response_length=0},
webmachine_request:new(PeerState#reqstate{log_data=LogData}).








69 changes: 45 additions & 24 deletions src/webmachine_decision_core.erl
Expand Up @@ -25,9 +25,9 @@
-export([do_log/1]). -export([do_log/1]).
-include("webmachine_logger.hrl"). -include("webmachine_logger.hrl").


handle_request(Req, Resource) -> handle_request(Resource, ReqState) ->
put(req, Req),
put(resource, Resource), put(resource, Resource),
put(reqstate, ReqState),
try try
d(v3b13) d(v3b13)
catch catch
Expand All @@ -36,8 +36,18 @@ handle_request(Req, Resource) ->
end. end.


wrcall(X) -> wrcall(X) ->
Req = get(req), RS0 = get(reqstate),
Req:call(X). Req = webmachine_request:new(RS0),
{Response, RS1} = Req:call(X),
put(reqstate, RS1),
Response.

resource_call(Fun) ->
Resource = get(resource),
{Reply, NewResource, NewRS} = Resource:do(Fun,get()),
put(resource, NewResource),
put(reqstate, NewRS),
Reply.


get_header_val(H) -> wrcall({get_req_header, H}). get_header_val(H) -> wrcall({get_req_header, H}).


Expand All @@ -55,7 +65,9 @@ respond(Code) ->
404 -> 404 ->
{ok, ErrorHandler} = application:get_env(webmachine, error_handler), {ok, ErrorHandler} = application:get_env(webmachine, error_handler),
Reason = {none, none, []}, Reason = {none, none, []},
ErrorHTML = ErrorHandler:render_error(Code, get(req), Reason), {ErrorHTML,ReqState} = ErrorHandler:render_error(
Code, {webmachine_request,get(reqstate)}, Reason),
put(reqstate, ReqState),
wrcall({set_resp_body, ErrorHTML}); wrcall({set_resp_body, ErrorHTML});
304 -> 304 ->
wrcall({remove_resp_header, "Content-Type"}), wrcall({remove_resp_header, "Content-Type"}),
Expand All @@ -81,17 +93,16 @@ respond(Code) ->
LogData = LogData0#wm_log_data{resource_module=RMod, LogData = LogData0#wm_log_data{resource_module=RMod,
end_time=EndTime}, end_time=EndTime},
spawn(fun() -> do_log(LogData) end), spawn(fun() -> do_log(LogData) end),
Resource:stop(), Resource:stop().
Req = get(req),
Req:stop().


respond(Code, Headers) -> respond(Code, Headers) ->
wrcall({set_resp_headers, Headers}), wrcall({set_resp_headers, Headers}),
respond(Code). respond(Code).


error_response(Code, Reason) -> error_response(Code, Reason) ->
{ok, ErrorHandler} = application:get_env(webmachine, error_handler), {ok, ErrorHandler} = application:get_env(webmachine, error_handler),
ErrorHTML = ErrorHandler:render_error(Code, get(req), Reason), ErrorHTML = ErrorHandler:render_error(
Code, {webmachine_request,get(reqstate)}, Reason),
wrcall({set_resp_body, ErrorHTML}), wrcall({set_resp_body, ErrorHTML}),
respond(Code). respond(Code).
error_response(Reason) -> error_response(Reason) ->
Expand All @@ -115,25 +126,17 @@ decision_flow({ErrCode, Reason}, _TestResult) when is_integer(ErrCode) ->
error_response(ErrCode, Reason). error_response(ErrCode, Reason).


do_log(LogData) -> do_log(LogData) ->
LoggerModule = case application:get_env(webmachine, webmachine_logger_module) of
case application:get_env(webmachine, webmachine_logger_module) of {ok, LoggerModule} -> LoggerModule:log_access(LogData);
{ok, Val} -> Val; _ -> nop
_ -> webmachine_logger end,
end,
LoggerModule:log_access(LogData),
case application:get_env(webmachine, enable_perf_logger) of case application:get_env(webmachine, enable_perf_logger) of
{ok, true} -> {ok, true} ->
webmachine_perf_logger:log(LogData); webmachine_perf_logger:log(LogData);
_ -> _ ->
ignore ignore
end. end.


resource_call(Fun) ->
Resource = get(resource),
{Reply, NewResource} = Resource:do(Fun,get()),
put(resource, NewResource),
Reply.

log_decision(DecisionID) -> log_decision(DecisionID) ->
Resource = get(resource), Resource = get(resource),
Resource:log_d(DecisionID). Resource:log_d(DecisionID).
Expand Down Expand Up @@ -417,7 +420,9 @@ decision(v3n11) ->
end; end;
_ -> _ ->
case resource_call(process_post) of case resource_call(process_post) of
true -> stage1_ok; true ->
encode_body_if_set(),
stage1_ok;
{halt, Code} -> respond(Code); {halt, Code} -> respond(Code);
Err -> error_response(Err) Err -> error_response(Err)
end end
Expand Down Expand Up @@ -539,7 +544,21 @@ accept_helper() ->
[] -> {respond,415}; [] -> {respond,415};
AcceptedContentList -> AcceptedContentList ->
F = hd(AcceptedContentList), F = hd(AcceptedContentList),
resource_call(F) case resource_call(F) of
true ->
encode_body_if_set(),
true;
Result -> Result
end
end.

encode_body_if_set() ->
case wrcall(has_resp_body) of
true ->
Body = wrcall(resp_body),
wrcall({set_resp_body, encode_body(Body)}),
true;
_ -> false
end. end.


encode_body(Body) -> encode_body(Body) ->
Expand All @@ -555,6 +574,8 @@ encode_body(Body) ->
case Body of case Body of
{stream, StreamBody} -> {stream, StreamBody} ->
{stream, make_encoder_stream(Encoder, Charsetter, StreamBody)}; {stream, make_encoder_stream(Encoder, Charsetter, StreamBody)};
{writer, BodyFun} ->
{writer, {Encoder, Charsetter, BodyFun}};
_ -> _ ->
Encoder(Charsetter(iolist_to_binary(Body))) Encoder(Charsetter(iolist_to_binary(Body)))
end. end.
Expand All @@ -564,7 +585,7 @@ make_encoder_stream(Encoder, Charsetter, {Body, done}) ->
make_encoder_stream(Encoder, Charsetter, {Body, Next}) -> make_encoder_stream(Encoder, Charsetter, {Body, Next}) ->
{Encoder(Charsetter(Body)), {Encoder(Charsetter(Body)),
fun() -> make_encoder_stream(Encoder, Charsetter, Next()) end}. fun() -> make_encoder_stream(Encoder, Charsetter, Next()) end}.

choose_encoding(AccEncHdr) -> choose_encoding(AccEncHdr) ->
Encs = [Enc || {Enc,_Fun} <- resource_call(encodings_provided)], Encs = [Enc || {Enc,_Fun} <- resource_call(encodings_provided)],
case webmachine_util:choose_encoding(Encs, AccEncHdr) of case webmachine_util:choose_encoding(Encs, AccEncHdr) of
Expand Down

0 comments on commit d67e934

Please sign in to comment.