Webmachine
a practical executable model for HTTP
Steve Vinoski
Architect, Basho Technologies
QCon SF 2011 16 Nov 2011 @stevevinoski http://steve.vinoski.net/
vinoski@ieee.org
1
Webmachine a practical executable model for HTTP Steve Vinoski - - PowerPoint PPT Presentation
Webmachine a practical executable model for HTTP Steve Vinoski Architect, Basho Technologies QCon SF 2011 16 Nov 2011 @stevevinoski http://steve.vinoski.net/ vinoski@ieee.org 1 Webmachine a practical executable model for HTTP a toolkit
a practical executable model for HTTP
Architect, Basho Technologies
QCon SF 2011 16 Nov 2011 @stevevinoski http://steve.vinoski.net/
vinoski@ieee.org
1
a practical executable model for HTTP
2
a practical executable model for HTTP
3
a practical executable model for HTTP
3
a practical executable model for HTTP
4
a practical executable model for HTTP
5
(see http://webmachine.basho.com/)
6
7
init([]) -> {ok, undefined}. to_html(ReqData, State) -> {"Hello, Webmachine world", ReqData, State}.
8
9
generate_etag(RD, State) -> {mochihex:to_hex(erlang:phash2(State)), RD, State}. last_modified(RD, State) -> {filelib:last_modified(State#s.fpath), RD, State}.
10
to_html(ReqData,State) -> {Body,ReqData,State}. generate_etag(ReqData,State) -> {ETag,ReqData,State}. last_modified(ReqData,State) -> {Time,ReqData,State}. resource_exists(ReqData,State) -> {bool,ReqData,State}. is_authorized(ReqData,State) -> {bool,ReqData,State}. ... f(ReqData,State) -> {RetV,ReqData,State}.
11
f(ReqData,State) -> {RetV,ReqData,State}.
12
f(ReqData,State) -> {RetV,ReqData,State}.
12
f(ReqData,State) -> {RetV,ReqData,State}.
12
f(ReqData,State) -> {RetV,ReqData,State}.
12
f(ReqData,State) -> {RetV,ReqData,State}.
12
f(ReqData,State) -> {RetV,ReqData,State}.
wrq:get_req_header(HdrName,ReqData) -> 'undefined' | HdrVal wrq:get_qs_value(Key,Default,ReqData) -> Value wrq:set_resp_header(HdrName,HdrVal,ReqData) -> NewReqData
13
14
15
16
16
17
17
18
19
20
21
21
22
22
23
23
24
25
{["wiki"], redirect_resource, "/wiki/Welcome"}. {["wiki",'*'], wiki_resource, []}. {[], redirect_resource, "/wiki/Welcome"}. {["user"], login_form_resource, []}. {["user",name], user_resource, []}. {["user",name,session], session_resource, []}. {["static",'*'], static_resource, "www"}.
26
{["wiki"], redirect_resource, "/wiki/Welcome"}.
27
{["wiki"], redirect_resource, "/wiki/..."}.
28
{[...], redirect_resource, "/wiki/Welcome"}.
29
{["wiki"], redirect_resource, "/wiki/Welcome"}. {[], redirect_resource, "/wiki/Welcome"}.
30
init(Target) -> {ok, Target}.
31
moved_permanently(RD, Target) -> {{true, Target}, RD, Target}.
32
33
init([]) -> {ok, Client} = wrc:connect(), {ok, #ctx{client = Client}}.
34
GET allowed_methods(RD, Ctx) -> {['HEAD','GET','POST','PUT'], RD, Ctx}.
35
types) a wiki page allows
MIME type
data
content_types_accepted(RD, Ctx) -> MT = "application/x-www-form-urlencoded", {[{MT, accept_form}], RD, Ctx}.
36
37
38
39
40
40
41
41
42
malformed_request(ReqData, State) -> {case catch list_to_integer(wrq:get_qs_value("q","0",ReqData)) of {'EXIT', _} -> true; _ -> false end, ReqData, State}.
43
malformed_request(ReqData, State) -> {case catch list_to_integer(wrq:get_qs_value("q","0",ReqData)) of {'EXIT', _} -> true; _ -> false end, ReqData, State}.
43
44
400 Bad Request
44
45
45
46
47
48
49
a practical executable model for HTTP http://webmachine.basho.com/
vinoski@ieee.org
50