-
Notifications
You must be signed in to change notification settings - Fork 0
/
appmods.html
165 lines (126 loc) · 6.69 KB
/
appmods.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<meta name="keywords" content="Yaws"/>
<title>Yaws</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<link rel="stylesheet" type="text/css" href="stil.css"/>
<link rel="shortcut icon" href="/icons/yaws_y.gif" type="image/x-icon"/>
</head>
<body>
<div class="logo">
<img src="icons/yaws_head.gif" width="600" alt="YAWS"/>
</div>
<div id="sidebar">
<h4> Yaws </h4>
<div class=""> <a href="index.html" id="index" >Top Page</a> </div>
<div class=""> <a href="configuration.html" id="configuration">Build Config and Run</a></div>
<div class=""> <a href="dynamic.html" id="dynamic" >Dynamic Content</a> </div>
<div class=""> <a href="https://github.com/erlyaws/yaws/releases/" id="download">Download </a> </div>
<div class=""> <a href="contact.html" id="contact">Contact </a> </div>
<div class=""> <a href="doc.html" id="doc">Documentation</a> </div>
<div class=""> <a href="articles.html" id="resources">Articles</a> </div>
<h4> Examples </h4>
<div class=""> <a href="/json_intro.html">AJAX/JSON RPC</a></div>
<div class="choosen"> <a href="/appmods.html">Appmods</a> </div>
<div class=""> <a href="/arg.html">Arg</a> </div>
<div class=""> <a href="/privbind.html">Binding to Privileged Ports</a></div>
<div class=""> <a href="/bindings.html">Bindings</a> </div>
<div class=""> <a href="/cgi.html">CGI</a></div>
<div class=""> <a href="/session.html">Cookie Sessions</a> </div>
<div class=""> <a href="/cookies.html">Cookies</a> </div>
<div class=""> <a href="/dynamic.html">Dynamic Content</a> </div>
<div class=""> <a href="/embed.html">Embedding Yaws</a></div>
<div class=""> <a href="/upload0.html">File Upload</a> </div>
<div class=""> <a href="/form.html">Forms</a> </div>
<div class=""> <a href="/haxe_intro.html">haXe Remoting</a></div>
<div class=""> <a href="/pcookie.html">Persistent Cookies</a> </div>
<div class=""> <a href="/query.html">Query Part of URL</a></div>
<div class=""> <a href="/rebar_release.html">Rebar Releases</a></div>
<div class=""> <a href="/redirect.html">Redirect</a> </div>
<div class=""> <a href="/server_sent_events.html">Server-Sent Events</a> </div>
<div class=""> <a href="/ssi.html">Server Side Includes</a> </div>
<div class=""> <a href="/simple.html">Simple</a> </div>
<div class=""> <a href="/soap_intro.html">SOAP with Yaws</a></div>
<div class=""> <a href="/stream.html">Streaming Data</a> </div>
<div class=""> <a href="/websockets.html">Web Sockets</a> </div>
<a href="/shoppingcart/index.html">Tiny Shopping Cart</a>
<div class=""> <a href="/yapp_intro.html">Yaws Applications (yapps)</a></div>
<div class=""> <a href="/logger_mod.html">Write Your Own Logger</a></div>
<h4> Misc </h4>
<div class=""> <a href="/internals.html">Internals</a> </div>
</div>
<div id="entry">
<h1>Appmods (Application modules)</h1>
<p>Appmods are a way to let the application programmer take control over the URL path. Or put in another way, to let the application programmer fake real paths in URLs where in reality an Erlang module is executing. Possibly an example will make this easy to understand. Say we have the following URL</p>
<div class="box">
<pre>http://yaws.hyber.org/pathelem/foo/bar/x.pdf</pre></div>
<p>With the above URL, the webserver would try to deliver the file "/pathelem/foo/bar/x.pdf" relative to the docroot. However if we had specified "pathelem" as an appmod, the server would stop processing the URL after seeing the "pathelem" part of the URL. Say we had the following in our yaws.conf configuration file</p>
<div class="box">
<pre>
<server tita>
port = 8001
listen = 0.0.0.0
docroot = /home/klacke/yaws/yaws/scripts/../www
appmods = <pathelem, myappmod>
</server></pre></div>
<p>Then the webserver would invoke <tt>myappmod:out(A)</tt> instead of trying to deliver the actual file. When shipping such an <a href="/pathelem/foo/bar/x.pdf">Url</a> there are 2 fields in the #arg record which are especially interesting. If we have the following code in "myappmod.erl":</p>
<div class="box">
<pre>-module(myappmod).
-author('[email protected]').
-include("../../include/yaws_api.hrl").
-export([out/1]).
box(Str) ->
{'div',[{class,"box"}],
{pre,[],Str}}.
out(A) ->
{ehtml,
[{p,[],
box(io_lib:format("A#arg.appmoddata = ~p~n"
"A#arg.appmod_prepath = ~p~n"
"A#arg.querydata = ~p~n",
[A#arg.appmoddata,
A#arg.appmod_prepath,
A#arg.querydata]))}]}.
</pre></div>
<p>The #arg field called "appmoddata" contains the remainder of the path following the encountered appmod and the field "appmod_prepath" contains the part of the URL path leading up to the appmod.</p>
<p>Thus the following URL</p>
<div class="box">
<pre>http://yaws.hyber.org/zap/pathelem/foo/bar/x.pdf?a=b</pre></div>
<p>Produces the following output:</p>
<div class="box">
<pre>
A#arg.appmoddata = "/foo/bar/x.pdf"
A#arg.appmod_prepath = "/zap/"
A#arg.querydata = "a=b"</pre></div><br></br>
<p>Appmods would typically be used by web applications that want to provide the illusion of proper paths to the browser. </p>
<p>A special case of an appmod that is particularly interesting is the '/' appmod. This is used when we want the application code to handle all requests. This is common with web frameworks such as Nitrogen.</p>
<div class="box">
<pre>
<server tita>
port = 8001
listen = 0.0.0.0
docroot = /home/klacke/yaws/yaws/scripts/../www
appmods = </, myappmod>
</server></pre></div>
<p>The above configuration snippet is an example of a slash appmod. One complication with the slash appmod is that usually we have a set of folders containing static data, images and java script, and we want yaws to just deliver those files without intervention from the slash appmod. This can be achieved by excluding a set of directories.</p>
<div class="box">
<pre>
<server tita>
port = 8001
listen = 0.0.0.0
docroot = /home/klacke/yaws/yaws/scripts/../www
appmods = </, myappmod exclude_paths icons js top/static>
</server></pre></div>
<p>The above configuration will invoke the 'myappmod' erlang module on everything except any file found in directories 'icons', 'js' and 'top/static' relative to the docroot</p></div><div class="logo">
<img src="/icons/yaws_pb.gif" alt="pbyaws" />
</div>
<p>
<a href="https://validator.w3.org/check?uri=referer"><img
src="https://www.w3.org/Icons/valid-xhtml10"
alt="Valid XHTML 1.0!" height="31" width="88" /></a>
</p>
</body>
</html>