serverside 0.1.59 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (48) hide show
  1. data/CHANGELOG +21 -1
  2. data/Rakefile +69 -40
  3. data/bin/serverside +7 -15
  4. data/doc/rdoc/classes/Daemon.html +18 -18
  5. data/doc/rdoc/classes/Daemon/Base.html +8 -6
  6. data/doc/rdoc/classes/Daemon/Cluster.html +36 -36
  7. data/doc/rdoc/classes/Daemon/Cluster/PidFile.html +20 -18
  8. data/doc/rdoc/classes/Daemon/PidFile.html +12 -12
  9. data/doc/rdoc/classes/Object.html +151 -0
  10. data/doc/rdoc/classes/Proc.html +151 -0
  11. data/doc/rdoc/classes/ServerSide.html +69 -0
  12. data/doc/rdoc/classes/ServerSide/Application.html +43 -11
  13. data/doc/rdoc/classes/ServerSide/Application/Base.html +30 -30
  14. data/doc/rdoc/classes/ServerSide/Application/Static.html +20 -18
  15. data/doc/rdoc/classes/ServerSide/Connection.html +3 -3
  16. data/doc/rdoc/classes/ServerSide/Connection/Base.html +142 -99
  17. data/doc/rdoc/classes/ServerSide/Connection/Const.html +11 -13
  18. data/doc/rdoc/classes/ServerSide/Connection/Router.html +464 -0
  19. data/doc/rdoc/classes/ServerSide/Server.html +8 -6
  20. data/doc/rdoc/classes/ServerSide/StaticFiles.html +75 -43
  21. data/doc/rdoc/classes/ServerSide/StaticFiles/Const.html +5 -0
  22. data/doc/rdoc/classes/String.html +20 -18
  23. data/doc/rdoc/classes/Symbol.html +2 -0
  24. data/doc/rdoc/created.rid +1 -1
  25. data/doc/rdoc/files/CHANGELOG.html +32 -2
  26. data/doc/rdoc/files/lib/serverside/application_rb.html +1 -1
  27. data/doc/rdoc/files/lib/serverside/connection_rb.html +1 -1
  28. data/doc/rdoc/files/lib/serverside/core_ext_rb.html +1 -1
  29. data/doc/rdoc/files/lib/serverside/daemon_rb.html +1 -1
  30. data/doc/rdoc/files/lib/serverside/routing_rb.html +101 -0
  31. data/doc/rdoc/files/lib/serverside/static_rb.html +1 -1
  32. data/doc/rdoc/fr_class_index.html +3 -1
  33. data/doc/rdoc/fr_file_index.html +1 -0
  34. data/doc/rdoc/fr_method_index.html +49 -33
  35. data/lib/serverside/application.rb +17 -4
  36. data/lib/serverside/connection.rb +23 -3
  37. data/lib/serverside/core_ext.rb +16 -1
  38. data/lib/serverside/routing.rb +119 -0
  39. data/lib/serverside/static.rb +9 -23
  40. data/test/functional/routing_server.rb +14 -0
  41. data/test/functional/routing_server_test.rb +41 -0
  42. data/test/functional/static_server_test.rb +8 -2
  43. data/test/unit/connection_test.rb +13 -0
  44. data/test/unit/core_ext_test.rb +14 -0
  45. data/test/unit/routing_test.rb +171 -0
  46. data/test/unit/static_test.rb +34 -1
  47. metadata +10 -3
  48. data/doc/rdoc/classes/ServerSide/Connection/Static.html +0 -172
@@ -58,10 +58,6 @@
58
58
  <a href="../../../files/lib/serverside/connection_rb.html">
59
59
  lib/serverside/connection.rb
60
60
  </a>
61
- <br />
62
- <a href="../../../files/lib/serverside/static_rb.html">
63
- lib/serverside/static.rb
64
- </a>
65
61
  <br />
66
62
  </td>
67
63
  </tr>
@@ -109,10 +105,12 @@ of responses faster than otherwise.
109
105
  <tr class="top-aligned-row context-row">
110
106
  <td class="context-item-name">RequestRegexp</td>
111
107
  <td>=</td>
112
- <td class="context-item-value">/([A-Za-z0-9]+)\s(\/[^\/\?]*(\/[^\/\?]+)*)\/?(\?(.*))?\sHTTP\/(.+)\r/.freeze</td>
108
+ <td class="context-item-value">/([A-Za-z0-9]+)\s(\/[^\/\?]*(?:\/[^\/\?]+)*)\/?(?:\?(.*))?\sHTTP\/(.+)\r/.freeze</td>
113
109
  <td width="3em">&nbsp;</td>
114
110
  <td class="context-item-desc">
115
- Here&#8217;s a nice one - parses the first line of a request.
111
+ Here&#8217;s a nice one - parses the first line of a request. The expected
112
+ format is as follows: &lt;method&gt; &lt;/path&gt;[/][?&lt;query&gt;]
113
+ HTTP/&lt;version&gt;
116
114
 
117
115
  </td>
118
116
  </tr>
@@ -181,6 +179,11 @@ Regexp for parsing URI parameters.
181
179
  <td>=</td>
182
180
  <td class="context-item-value">&quot;HTTP/1.1 %d\r\nContent-Type: %s\r\n%sContent-Length: %d\r\n\r\n&quot;.freeze</td>
183
181
  </tr>
182
+ <tr class="top-aligned-row context-row">
183
+ <td class="context-item-name">StatusRedirect</td>
184
+ <td>=</td>
185
+ <td class="context-item-value">&quot;HTTP/1.1 %d\r\nConnection: close\r\nLocation: %s\r\n\r\n&quot;.freeze</td>
186
+ </tr>
184
187
  <tr class="top-aligned-row context-row">
185
188
  <td class="context-item-name">Header</td>
186
189
  <td>=</td>
@@ -197,14 +200,9 @@ Regexp for parsing URI parameters.
197
200
  <td class="context-item-value">'/'.freeze</td>
198
201
  </tr>
199
202
  <tr class="top-aligned-row context-row">
200
- <td class="context-item-name">WD</td>
201
- <td>=</td>
202
- <td class="context-item-value">'.'.freeze</td>
203
- </tr>
204
- <tr class="top-aligned-row context-row">
205
- <td class="context-item-name">FileNotFound</td>
203
+ <td class="context-item-name">Location</td>
206
204
  <td>=</td>
207
- <td class="context-item-value">&quot;Couldn't open file %s.&quot;.freeze</td>
205
+ <td class="context-item-value">'Location'</td>
208
206
  </tr>
209
207
  </table>
210
208
  </div>
@@ -0,0 +1,464 @@
1
+ <?xml version="1.0" encoding="iso-8859-1"?>
2
+ <!DOCTYPE html
3
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
4
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
5
+
6
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
7
+ <head>
8
+ <title>Class: ServerSide::Connection::Router</title>
9
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
10
+ <meta http-equiv="Content-Script-Type" content="text/javascript" />
11
+ <link rel="stylesheet" href="../../.././rdoc-style.css" type="text/css" media="screen" />
12
+ <script type="text/javascript">
13
+ // <![CDATA[
14
+
15
+ function popupCode( url ) {
16
+ window.open(url, "Code", "resizable=yes,scrollbars=yes,toolbar=no,status=no,height=150,width=400")
17
+ }
18
+
19
+ function toggleCode( id ) {
20
+ if ( document.getElementById )
21
+ elem = document.getElementById( id );
22
+ else if ( document.all )
23
+ elem = eval( "document.all." + id );
24
+ else
25
+ return false;
26
+
27
+ elemStyle = elem.style;
28
+
29
+ if ( elemStyle.display != "block" ) {
30
+ elemStyle.display = "block"
31
+ } else {
32
+ elemStyle.display = "none"
33
+ }
34
+
35
+ return true;
36
+ }
37
+
38
+ // Make codeblocks hidden by default
39
+ document.writeln( "<style type=\"text/css\">div.method-source-code { display: none }</style>" )
40
+
41
+ // ]]>
42
+ </script>
43
+
44
+ </head>
45
+ <body>
46
+
47
+
48
+
49
+ <div id="classHeader">
50
+ <table class="header-table">
51
+ <tr class="top-aligned-row">
52
+ <td><strong>Class</strong></td>
53
+ <td class="class-name-in-header">ServerSide::Connection::Router</td>
54
+ </tr>
55
+ <tr class="top-aligned-row">
56
+ <td><strong>In:</strong></td>
57
+ <td>
58
+ <a href="../../../files/lib/serverside/routing_rb.html">
59
+ lib/serverside/routing.rb
60
+ </a>
61
+ <br />
62
+ </td>
63
+ </tr>
64
+
65
+ <tr class="top-aligned-row">
66
+ <td><strong>Parent:</strong></td>
67
+ <td>
68
+ <a href="Base.html">
69
+ Base
70
+ </a>
71
+ </td>
72
+ </tr>
73
+ </table>
74
+ </div>
75
+ <!-- banner header -->
76
+
77
+ <div id="bodyContent">
78
+
79
+
80
+
81
+ <div id="contextContent">
82
+
83
+ <div id="description">
84
+ <p>
85
+ The <a href="Router.html">Router</a> class defines a kind of connection
86
+ that can route requests to different handlers based on rules that can be
87
+ specified either by lambdas or by hashes containing keys corresponding to
88
+ patterns.
89
+ </p>
90
+
91
+ </div>
92
+
93
+
94
+ </div>
95
+
96
+ <div id="method-list">
97
+ <h3 class="section-bar">Methods</h3>
98
+
99
+ <div class="name-list">
100
+ <a href="#M000046">cache_constant</a>&nbsp;&nbsp;
101
+ <a href="#M000042">compile_rules</a>&nbsp;&nbsp;
102
+ <a href="#M000044">condition_part</a>&nbsp;&nbsp;
103
+ <a href="#M000049">default_handler</a>&nbsp;&nbsp;
104
+ <a href="#M000045">define_proc</a>&nbsp;&nbsp;
105
+ <a href="#M000040">has_routes?</a>&nbsp;&nbsp;
106
+ <a href="#M000041">route</a>&nbsp;&nbsp;
107
+ <a href="#M000047">route_default</a>&nbsp;&nbsp;
108
+ <a href="#M000043">rule_to_statement</a>&nbsp;&nbsp;
109
+ <a href="#M000048">unhandled</a>&nbsp;&nbsp;
110
+ </div>
111
+ </div>
112
+
113
+ </div>
114
+
115
+
116
+ <!-- if includes -->
117
+
118
+ <div id="section">
119
+
120
+
121
+ <div id="constants-list">
122
+ <h3 class="section-bar">Constants</h3>
123
+
124
+ <div class="name-list">
125
+ <table summary="Constants">
126
+ <tr class="top-aligned-row context-row">
127
+ <td class="context-item-name">ParamRegexp</td>
128
+ <td>=</td>
129
+ <td class="context-item-value">/(?::([a-z]+))/</td>
130
+ <td width="3em">&nbsp;</td>
131
+ <td class="context-item-desc">
132
+ Pattern for finding parameters inside patterns. Parameters are parts of the
133
+ pattern, which the routing pre-processor turns into sub-regexp that are
134
+ used to extract parameter values from the pattern.
135
+
136
+ <p>
137
+ For example, matching &#8217;/controller/show&#8217; against
138
+ &#8217;/controller/:action&#8217; will give us @parameters[:action] #=&gt;
139
+ &quot;show&quot;
140
+ </p>
141
+ </td>
142
+ </tr>
143
+ </table>
144
+ </div>
145
+ </div>
146
+
147
+
148
+
149
+
150
+
151
+
152
+ <!-- if method_list -->
153
+ <div id="methods">
154
+ <h3 class="section-bar">Public Class methods</h3>
155
+
156
+ <div id="method-M000046" class="method-detail">
157
+ <a name="M000046"></a>
158
+
159
+ <div class="method-heading">
160
+ <a href="#M000046" class="method-signature">
161
+ <span class="method-name">cache_constant</span><span class="method-args">(value)</span>
162
+ </a>
163
+ </div>
164
+
165
+ <div class="method-description">
166
+ <p>
167
+ Converts a value into a local constant and freezes it. Returns the
168
+ constant&#8217;s tag name
169
+ </p>
170
+ <p><a class="source-toggle" href="#"
171
+ onclick="toggleCode('M000046-source');return false;">[Source]</a></p>
172
+ <div class="method-source-code" id="M000046-source">
173
+ <pre>
174
+ <span class="ruby-comment cmt"># File lib/serverside/routing.rb, line 90</span>
175
+ 90: <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">cache_constant</span>(<span class="ruby-identifier">value</span>)
176
+ 91: <span class="ruby-identifier">tag</span> = <span class="ruby-identifier">value</span>.<span class="ruby-identifier">const_tag</span>
177
+ 92: <span class="ruby-identifier">class_eval</span> <span class="ruby-node">&quot;#{tag} = #{value.inspect}.freeze&quot;</span> <span class="ruby-keyword kw">rescue</span> <span class="ruby-keyword kw">nil</span>
178
+ 93: <span class="ruby-identifier">tag</span>
179
+ 94: <span class="ruby-keyword kw">end</span>
180
+ </pre>
181
+ </div>
182
+ </div>
183
+ </div>
184
+
185
+ <div id="method-M000042" class="method-detail">
186
+ <a name="M000042"></a>
187
+
188
+ <div class="method-heading">
189
+ <a href="#M000042" class="method-signature">
190
+ <span class="method-name">compile_rules</span><span class="method-args">()</span>
191
+ </a>
192
+ </div>
193
+
194
+ <div class="method-description">
195
+ <p>
196
+ Compiles all rules into a respond method that is invoked when a request is
197
+ received.
198
+ </p>
199
+ <p><a class="source-toggle" href="#"
200
+ onclick="toggleCode('M000042-source');return false;">[Source]</a></p>
201
+ <div class="method-source-code" id="M000042-source">
202
+ <pre>
203
+ <span class="ruby-comment cmt"># File lib/serverside/routing.rb, line 25</span>
204
+ 25: <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">compile_rules</span>
205
+ 26: <span class="ruby-ivar">@@rules</span> <span class="ruby-operator">||=</span> []
206
+ 27: <span class="ruby-identifier">code</span> = <span class="ruby-ivar">@@rules</span>.<span class="ruby-identifier">inject</span>(<span class="ruby-value str">'lambda {'</span>) {<span class="ruby-operator">|</span><span class="ruby-identifier">m</span>, <span class="ruby-identifier">r</span><span class="ruby-operator">|</span> <span class="ruby-identifier">m</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">rule_to_statement</span>(<span class="ruby-identifier">r</span>[<span class="ruby-value">0</span>], <span class="ruby-identifier">r</span>[<span class="ruby-value">1</span>])}
207
+ 28: <span class="ruby-identifier">code</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-value str">'default_handler}'</span>
208
+ 29: <span class="ruby-identifier">define_method</span>(<span class="ruby-identifier">:respond</span>, <span class="ruby-operator">&amp;</span><span class="ruby-identifier">eval</span>(<span class="ruby-identifier">code</span>))
209
+ 30: <span class="ruby-keyword kw">end</span>
210
+ </pre>
211
+ </div>
212
+ </div>
213
+ </div>
214
+
215
+ <div id="method-M000044" class="method-detail">
216
+ <a name="M000044"></a>
217
+
218
+ <div class="method-heading">
219
+ <a href="#M000044" class="method-signature">
220
+ <span class="method-name">condition_part</span><span class="method-args">(key, value)</span>
221
+ </a>
222
+ </div>
223
+
224
+ <div class="method-description">
225
+ <p>
226
+ Returns the condition part for the key and value specified. The key is the
227
+ name of an instance variable and the value is a pattern to match against.
228
+ If the pattern contains parameters (for example, /controller/:action,) the
229
+ method creates a lambda for extracting the parameter values.
230
+ </p>
231
+ <p><a class="source-toggle" href="#"
232
+ onclick="toggleCode('M000044-source');return false;">[Source]</a></p>
233
+ <div class="method-source-code" id="M000044-source">
234
+ <pre>
235
+ <span class="ruby-comment cmt"># File lib/serverside/routing.rb, line 62</span>
236
+ 62: <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">condition_part</span>(<span class="ruby-identifier">key</span>, <span class="ruby-identifier">value</span>)
237
+ 63: <span class="ruby-identifier">p_parse</span>, <span class="ruby-identifier">p_count</span> = <span class="ruby-value str">''</span>, <span class="ruby-value">0</span>
238
+ 64: <span class="ruby-keyword kw">while</span> (<span class="ruby-constant">String</span> <span class="ruby-operator">===</span> <span class="ruby-identifier">value</span>) <span class="ruby-operator">&amp;&amp;</span> (<span class="ruby-identifier">value</span> <span class="ruby-operator">=~</span> <span class="ruby-constant">ParamRegexp</span>)
239
+ 65: <span class="ruby-identifier">value</span> = <span class="ruby-identifier">value</span>.<span class="ruby-identifier">dup</span>
240
+ 66: <span class="ruby-identifier">p_name</span> = <span class="ruby-identifier">$1</span>
241
+ 67: <span class="ruby-identifier">p_count</span> <span class="ruby-operator">+=</span> <span class="ruby-value">1</span>
242
+ 68: <span class="ruby-identifier">value</span>.<span class="ruby-identifier">sub!</span>(<span class="ruby-constant">ParamRegexp</span>, <span class="ruby-value str">'(.+)'</span>)
243
+ 69: <span class="ruby-identifier">p_parse</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-node">&quot;@parameters[:#{p_name}] = $#{p_count}\n&quot;</span>
244
+ 70: <span class="ruby-keyword kw">end</span>
245
+ 71: <span class="ruby-identifier">cond</span> = <span class="ruby-node">&quot;(@#{key} =~ #{cache_constant(Regexp.new(value))})&quot;</span>
246
+ 72: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">p_count</span> <span class="ruby-operator">==</span> <span class="ruby-value">0</span>
247
+ 73: <span class="ruby-identifier">cond</span>
248
+ 74: <span class="ruby-keyword kw">else</span>
249
+ 75: <span class="ruby-identifier">tag</span> = <span class="ruby-identifier">define_proc</span>(<span class="ruby-operator">&amp;</span><span class="ruby-identifier">eval</span>(
250
+ 76: <span class="ruby-node">&quot;lambda {if #{cond}\n#{p_parse}true\nelse\nfalse\nend}&quot;</span>))
251
+ 77: <span class="ruby-node">&quot;(#{tag})&quot;</span>
252
+ 78: <span class="ruby-keyword kw">end</span>
253
+ 79: <span class="ruby-keyword kw">end</span>
254
+ </pre>
255
+ </div>
256
+ </div>
257
+ </div>
258
+
259
+ <div id="method-M000045" class="method-detail">
260
+ <a name="M000045"></a>
261
+
262
+ <div class="method-heading">
263
+ <a href="#M000045" class="method-signature">
264
+ <span class="method-name">define_proc</span><span class="method-args">(&amp;block)</span>
265
+ </a>
266
+ </div>
267
+
268
+ <div class="method-description">
269
+ <p>
270
+ Converts a proc into a method, returning the method&#8217;s name (as a
271
+ symbol)
272
+ </p>
273
+ <p><a class="source-toggle" href="#"
274
+ onclick="toggleCode('M000045-source');return false;">[Source]</a></p>
275
+ <div class="method-source-code" id="M000045-source">
276
+ <pre>
277
+ <span class="ruby-comment cmt"># File lib/serverside/routing.rb, line 82</span>
278
+ 82: <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">define_proc</span>(<span class="ruby-operator">&amp;</span><span class="ruby-identifier">block</span>)
279
+ 83: <span class="ruby-identifier">tag</span> = <span class="ruby-identifier">block</span>.<span class="ruby-identifier">proc_tag</span>
280
+ 84: <span class="ruby-identifier">define_method</span>(<span class="ruby-identifier">tag</span>.<span class="ruby-identifier">to_sym</span>, <span class="ruby-operator">&amp;</span><span class="ruby-identifier">block</span>) <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">instance_methods</span>.<span class="ruby-identifier">include?</span>(<span class="ruby-identifier">tag</span>)
281
+ 85: <span class="ruby-identifier">tag</span>.<span class="ruby-identifier">to_sym</span>
282
+ 86: <span class="ruby-keyword kw">end</span>
283
+ </pre>
284
+ </div>
285
+ </div>
286
+ </div>
287
+
288
+ <div id="method-M000040" class="method-detail">
289
+ <a name="M000040"></a>
290
+
291
+ <div class="method-heading">
292
+ <a href="#M000040" class="method-signature">
293
+ <span class="method-name">has_routes?</span><span class="method-args">()</span>
294
+ </a>
295
+ </div>
296
+
297
+ <div class="method-description">
298
+ <p>
299
+ Returns true if routes were defined.
300
+ </p>
301
+ <p><a class="source-toggle" href="#"
302
+ onclick="toggleCode('M000040-source');return false;">[Source]</a></p>
303
+ <div class="method-source-code" id="M000040-source">
304
+ <pre>
305
+ <span class="ruby-comment cmt"># File lib/serverside/routing.rb, line 8</span>
306
+ 8: <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">has_routes?</span>
307
+ 9: <span class="ruby-ivar">@@rules</span> <span class="ruby-operator">&amp;&amp;</span> <span class="ruby-operator">!</span><span class="ruby-ivar">@@rules</span>.<span class="ruby-identifier">empty?</span> <span class="ruby-keyword kw">rescue</span> <span class="ruby-keyword kw">false</span>
308
+ 10: <span class="ruby-keyword kw">end</span>
309
+ </pre>
310
+ </div>
311
+ </div>
312
+ </div>
313
+
314
+ <div id="method-M000041" class="method-detail">
315
+ <a name="M000041"></a>
316
+
317
+ <div class="method-heading">
318
+ <a href="#M000041" class="method-signature">
319
+ <span class="method-name">route</span><span class="method-args">(rule, &amp;block)</span>
320
+ </a>
321
+ </div>
322
+
323
+ <div class="method-description">
324
+ <p>
325
+ Adds a routing rule. The normalized rule is a hash containing keys (acting
326
+ as instance variable names) with patterns as values. If the rule is not a
327
+ hash, it is normalized into a pattern checked against the request path.
328
+ Pattern values can also be arrays, in any array member is checked as a
329
+ pattern.
330
+ </p>
331
+ <p><a class="source-toggle" href="#"
332
+ onclick="toggleCode('M000041-source');return false;">[Source]</a></p>
333
+ <div class="method-source-code" id="M000041-source">
334
+ <pre>
335
+ <span class="ruby-comment cmt"># File lib/serverside/routing.rb, line 16</span>
336
+ 16: <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">route</span>(<span class="ruby-identifier">rule</span>, <span class="ruby-operator">&amp;</span><span class="ruby-identifier">block</span>)
337
+ 17: <span class="ruby-ivar">@@rules</span> <span class="ruby-operator">||=</span> []
338
+ 18: <span class="ruby-identifier">rule</span> = {<span class="ruby-identifier">:path</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">rule</span>} <span class="ruby-keyword kw">unless</span> (<span class="ruby-constant">Hash</span> <span class="ruby-operator">===</span> <span class="ruby-identifier">rule</span>) <span class="ruby-operator">||</span> (<span class="ruby-constant">Proc</span> <span class="ruby-operator">===</span> <span class="ruby-identifier">rule</span>)
339
+ 19: <span class="ruby-ivar">@@rules</span>.<span class="ruby-identifier">unshift</span> [<span class="ruby-identifier">rule</span>, <span class="ruby-identifier">block</span>]
340
+ 20: <span class="ruby-identifier">compile_rules</span>
341
+ 21: <span class="ruby-keyword kw">end</span>
342
+ </pre>
343
+ </div>
344
+ </div>
345
+ </div>
346
+
347
+ <div id="method-M000047" class="method-detail">
348
+ <a name="M000047"></a>
349
+
350
+ <div class="method-heading">
351
+ <a href="#M000047" class="method-signature">
352
+ <span class="method-name">route_default</span><span class="method-args">(&amp;block)</span>
353
+ </a>
354
+ </div>
355
+
356
+ <div class="method-description">
357
+ <p>
358
+ Sets the default handler for incoming requests.
359
+ </p>
360
+ <p><a class="source-toggle" href="#"
361
+ onclick="toggleCode('M000047-source');return false;">[Source]</a></p>
362
+ <div class="method-source-code" id="M000047-source">
363
+ <pre>
364
+ <span class="ruby-comment cmt"># File lib/serverside/routing.rb, line 97</span>
365
+ 97: <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">route_default</span>(<span class="ruby-operator">&amp;</span><span class="ruby-identifier">block</span>)
366
+ 98: <span class="ruby-identifier">define_method</span>(<span class="ruby-identifier">:default_handler</span>, <span class="ruby-operator">&amp;</span><span class="ruby-identifier">block</span>)
367
+ 99: <span class="ruby-identifier">compile_rules</span>
368
+ 100: <span class="ruby-keyword kw">end</span>
369
+ </pre>
370
+ </div>
371
+ </div>
372
+ </div>
373
+
374
+ <div id="method-M000043" class="method-detail">
375
+ <a name="M000043"></a>
376
+
377
+ <div class="method-heading">
378
+ <a href="#M000043" class="method-signature">
379
+ <span class="method-name">rule_to_statement</span><span class="method-args">(rule, block)</span>
380
+ </a>
381
+ </div>
382
+
383
+ <div class="method-description">
384
+ <p>
385
+ Converts a rule into an if statement. All keys in the rule are matched
386
+ against their respective values.
387
+ </p>
388
+ <p><a class="source-toggle" href="#"
389
+ onclick="toggleCode('M000043-source');return false;">[Source]</a></p>
390
+ <div class="method-source-code" id="M000043-source">
391
+ <pre>
392
+ <span class="ruby-comment cmt"># File lib/serverside/routing.rb, line 34</span>
393
+ 34: <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">rule_to_statement</span>(<span class="ruby-identifier">rule</span>, <span class="ruby-identifier">block</span>)
394
+ 35: <span class="ruby-identifier">proc_tag</span> = <span class="ruby-identifier">define_proc</span>(<span class="ruby-operator">&amp;</span><span class="ruby-identifier">block</span>)
395
+ 36: <span class="ruby-keyword kw">if</span> <span class="ruby-constant">Proc</span> <span class="ruby-operator">===</span> <span class="ruby-identifier">rule</span>
396
+ 37: <span class="ruby-identifier">cond</span> = <span class="ruby-identifier">define_proc</span>(<span class="ruby-operator">&amp;</span><span class="ruby-identifier">rule</span>).<span class="ruby-identifier">to_s</span>
397
+ 38: <span class="ruby-keyword kw">else</span>
398
+ 39: <span class="ruby-identifier">cond</span> = <span class="ruby-identifier">rule</span>.<span class="ruby-identifier">to_a</span>.<span class="ruby-identifier">map</span> {<span class="ruby-operator">|</span><span class="ruby-identifier">kv</span><span class="ruby-operator">|</span>
399
+ 40: <span class="ruby-keyword kw">if</span> <span class="ruby-constant">Array</span> <span class="ruby-operator">===</span> <span class="ruby-identifier">kv</span>[<span class="ruby-value">1</span>]
400
+ 41: <span class="ruby-value str">'('</span> <span class="ruby-operator">+</span> <span class="ruby-identifier">kv</span>[<span class="ruby-value">1</span>].<span class="ruby-identifier">map</span> {<span class="ruby-operator">|</span><span class="ruby-identifier">v</span><span class="ruby-operator">|</span> <span class="ruby-identifier">condition_part</span>(<span class="ruby-identifier">kv</span>[<span class="ruby-value">0</span>], <span class="ruby-identifier">v</span>)}.<span class="ruby-identifier">join</span>(<span class="ruby-value str">'||'</span>) <span class="ruby-operator">+</span> <span class="ruby-value str">')'</span>
401
+ 42: <span class="ruby-keyword kw">else</span>
402
+ 43: <span class="ruby-identifier">condition_part</span>(<span class="ruby-identifier">kv</span>[<span class="ruby-value">0</span>], <span class="ruby-identifier">kv</span>[<span class="ruby-value">1</span>])
403
+ 44: <span class="ruby-keyword kw">end</span>
404
+ 45: }.<span class="ruby-identifier">join</span>(<span class="ruby-value str">'&amp;&amp;'</span>)
405
+ 46: <span class="ruby-keyword kw">end</span>
406
+ 47: <span class="ruby-node">&quot;return #{proc_tag} if #{cond}\n&quot;</span>
407
+ 48: <span class="ruby-keyword kw">end</span>
408
+ </pre>
409
+ </div>
410
+ </div>
411
+ </div>
412
+
413
+ <h3 class="section-bar">Public Instance methods</h3>
414
+
415
+ <div id="method-M000049" class="method-detail">
416
+ <a name="M000049"></a>
417
+
418
+ <div class="method-heading">
419
+ <span class="method-name">default_handler</span><span class="method-args">()</span>
420
+ </div>
421
+
422
+ <div class="method-description">
423
+ <p>
424
+ Alias for <a href="Router.html#M000048">unhandled</a>
425
+ </p>
426
+ </div>
427
+ </div>
428
+
429
+ <div id="method-M000048" class="method-detail">
430
+ <a name="M000048"></a>
431
+
432
+ <div class="method-heading">
433
+ <a href="#M000048" class="method-signature">
434
+ <span class="method-name">unhandled</span><span class="method-args">()</span>
435
+ </a>
436
+ </div>
437
+
438
+ <div class="method-description">
439
+ <p><a class="source-toggle" href="#"
440
+ onclick="toggleCode('M000048-source');return false;">[Source]</a></p>
441
+ <div class="method-source-code" id="M000048-source">
442
+ <pre>
443
+ <span class="ruby-comment cmt"># File lib/serverside/routing.rb, line 102</span>
444
+ 102: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">unhandled</span>
445
+ 103: <span class="ruby-identifier">send_response</span>(<span class="ruby-value">403</span>, <span class="ruby-value str">'text'</span>, <span class="ruby-value str">'No handler found.'</span>)
446
+ 104: <span class="ruby-keyword kw">end</span>
447
+ </pre>
448
+ </div>
449
+ </div>
450
+ </div>
451
+
452
+
453
+ </div>
454
+
455
+
456
+ </div>
457
+
458
+
459
+ <div id="validator-badges">
460
+ <p><small><a href="http://validator.w3.org/check/referer">[Validate]</a></small></p>
461
+ </div>
462
+
463
+ </body>
464
+ </html>