mongrel 0.3.5 → 0.3.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (72) hide show
  1. data/README +4 -3
  2. data/Rakefile +7 -5
  3. data/bin/mongrel_rails +5 -4
  4. data/bin/mongrel_rails_service +237 -0
  5. data/bin/mongrel_rails_svc +194 -0
  6. data/doc/rdoc/classes/Mongrel.html +1 -4
  7. data/doc/rdoc/classes/Mongrel/Const.html +13 -3
  8. data/doc/rdoc/classes/Mongrel/HeaderOut.html +10 -10
  9. data/doc/rdoc/classes/Mongrel/HeaderOut.src/{M000033.html → M000028.html} +4 -4
  10. data/doc/rdoc/classes/Mongrel/HeaderOut.src/{M000034.html → M000029.html} +7 -7
  11. data/doc/rdoc/classes/Mongrel/HttpRequest.html +5 -5
  12. data/doc/rdoc/classes/Mongrel/HttpRequest.src/M000041.html +39 -0
  13. data/doc/rdoc/classes/Mongrel/HttpResponse.html +36 -36
  14. data/doc/rdoc/classes/Mongrel/HttpResponse.src/M000034.html +21 -0
  15. data/doc/rdoc/classes/Mongrel/HttpResponse.src/{M000041.html → M000035.html} +6 -6
  16. data/doc/rdoc/classes/Mongrel/HttpResponse.src/{M000042.html → M000036.html} +5 -5
  17. data/doc/rdoc/classes/Mongrel/HttpResponse.src/{M000043.html → M000037.html} +5 -5
  18. data/doc/rdoc/classes/Mongrel/HttpResponse.src/{M000044.html → M000038.html} +6 -6
  19. data/doc/rdoc/classes/Mongrel/HttpResponse.src/{M000045.html → M000039.html} +6 -6
  20. data/doc/rdoc/classes/Mongrel/HttpResponse.src/M000040.html +7 -8
  21. data/doc/rdoc/classes/Mongrel/HttpServer.html +47 -28
  22. data/doc/rdoc/classes/Mongrel/HttpServer.src/M000022.html +33 -0
  23. data/doc/rdoc/classes/Mongrel/HttpServer.src/M000023.html +57 -0
  24. data/doc/rdoc/classes/Mongrel/HttpServer.src/M000024.html +46 -0
  25. data/doc/rdoc/classes/Mongrel/HttpServer.src/{M000031.html → M000025.html} +4 -4
  26. data/doc/rdoc/classes/Mongrel/HttpServer.src/{M000032.html → M000026.html} +4 -4
  27. data/doc/rdoc/classes/Mongrel/HttpServer.src/M000027.html +19 -0
  28. data/doc/rdoc/classes/Mongrel/{HttpHandler.html → StopServer.html} +4 -33
  29. data/doc/rdoc/classes/Mongrel/URIClassifier.html +22 -23
  30. data/doc/rdoc/classes/Mongrel/URIClassifier.src/{M000035.html → M000030.html} +0 -0
  31. data/doc/rdoc/classes/Mongrel/URIClassifier.src/{M000036.html → M000031.html} +0 -0
  32. data/doc/rdoc/classes/Mongrel/URIClassifier.src/{M000037.html → M000032.html} +0 -0
  33. data/doc/rdoc/classes/Mongrel/URIClassifier.src/{M000038.html → M000033.html} +0 -0
  34. data/doc/rdoc/created.rid +1 -1
  35. data/doc/rdoc/files/README.html +9 -7
  36. data/doc/rdoc/files/lib/mongrel_rb.html +3 -3
  37. data/doc/rdoc/fr_class_index.html +1 -4
  38. data/doc/rdoc/fr_method_index.html +20 -37
  39. data/examples/mongrel_simple_ctrl.rb +92 -0
  40. data/examples/mongrel_simple_service.rb +116 -0
  41. data/examples/simpletest.rb +3 -1
  42. data/ext/http11/http11_parser.c +176 -263
  43. data/lib/mongrel.rb +56 -343
  44. data/lib/mongrel/cgi.rb +147 -0
  45. data/lib/mongrel/handlers.rb +180 -0
  46. metadata +28 -46
  47. data/doc/rdoc/classes/Mongrel/CGIWrapper.html +0 -346
  48. data/doc/rdoc/classes/Mongrel/CGIWrapper.src/M000047.html +0 -24
  49. data/doc/rdoc/classes/Mongrel/CGIWrapper.src/M000048.html +0 -48
  50. data/doc/rdoc/classes/Mongrel/CGIWrapper.src/M000049.html +0 -34
  51. data/doc/rdoc/classes/Mongrel/CGIWrapper.src/M000050.html +0 -27
  52. data/doc/rdoc/classes/Mongrel/CGIWrapper.src/M000051.html +0 -26
  53. data/doc/rdoc/classes/Mongrel/CGIWrapper.src/M000052.html +0 -18
  54. data/doc/rdoc/classes/Mongrel/CGIWrapper.src/M000053.html +0 -18
  55. data/doc/rdoc/classes/Mongrel/CGIWrapper.src/M000054.html +0 -18
  56. data/doc/rdoc/classes/Mongrel/CGIWrapper.src/M000055.html +0 -19
  57. data/doc/rdoc/classes/Mongrel/DirHandler.html +0 -283
  58. data/doc/rdoc/classes/Mongrel/DirHandler.src/M000022.html +0 -20
  59. data/doc/rdoc/classes/Mongrel/DirHandler.src/M000023.html +0 -42
  60. data/doc/rdoc/classes/Mongrel/DirHandler.src/M000024.html +0 -40
  61. data/doc/rdoc/classes/Mongrel/DirHandler.src/M000025.html +0 -31
  62. data/doc/rdoc/classes/Mongrel/DirHandler.src/M000026.html +0 -38
  63. data/doc/rdoc/classes/Mongrel/DirHandler.src/M000027.html +0 -18
  64. data/doc/rdoc/classes/Mongrel/Error404Handler.html +0 -171
  65. data/doc/rdoc/classes/Mongrel/Error404Handler.src/M000056.html +0 -18
  66. data/doc/rdoc/classes/Mongrel/Error404Handler.src/M000057.html +0 -18
  67. data/doc/rdoc/classes/Mongrel/HttpHandler.src/M000039.html +0 -17
  68. data/doc/rdoc/classes/Mongrel/HttpRequest.src/M000058.html +0 -31
  69. data/doc/rdoc/classes/Mongrel/HttpResponse.src/M000046.html +0 -20
  70. data/doc/rdoc/classes/Mongrel/HttpServer.src/M000028.html +0 -38
  71. data/doc/rdoc/classes/Mongrel/HttpServer.src/M000029.html +0 -64
  72. data/doc/rdoc/classes/Mongrel/HttpServer.src/M000030.html +0 -23
@@ -5,17 +5,16 @@
5
5
 
6
6
  <html>
7
7
  <head>
8
- <title>new (Mongrel::HttpResponse)</title>
8
+ <title>finished (Mongrel::HttpResponse)</title>
9
9
  <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
10
10
  <link rel="stylesheet" href="../../.././rdoc-style.css" type="text/css" media="screen" />
11
11
  </head>
12
12
  <body class="standalone-code">
13
- <pre> <span class="ruby-comment cmt"># File lib/mongrel.rb, line 223</span>
14
- 223: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">initialize</span>(<span class="ruby-identifier">socket</span>)
15
- 224: <span class="ruby-ivar">@socket</span> = <span class="ruby-identifier">socket</span>
16
- 225: <span class="ruby-ivar">@body</span> = <span class="ruby-constant">StringIO</span>.<span class="ruby-identifier">new</span>
17
- 226: <span class="ruby-ivar">@status</span> = <span class="ruby-value">404</span>
18
- 227: <span class="ruby-ivar">@header</span> = <span class="ruby-constant">HeaderOut</span>.<span class="ruby-identifier">new</span>(<span class="ruby-constant">StringIO</span>.<span class="ruby-identifier">new</span>)
19
- 228: <span class="ruby-keyword kw">end</span></pre>
13
+ <pre> <span class="ruby-comment cmt"># File lib/mongrel.rb, line 280</span>
14
+ 280: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">finished</span>
15
+ 281: <span class="ruby-identifier">send_status</span>
16
+ 282: <span class="ruby-identifier">send_header</span>
17
+ 283: <span class="ruby-identifier">send_body</span>
18
+ 284: <span class="ruby-keyword kw">end</span></pre>
20
19
  </body>
21
20
  </html>
@@ -85,7 +85,7 @@ Mognrel::HttpParser and <a
85
85
  href="URIClassifier.html">Mongrel::URIClassifier</a> make up the majority
86
86
  of how the server functions. It&#8217;s a very simple class that just has a
87
87
  thread accepting connections and a simple <a
88
- href="HttpServer.html#M000029">HttpServer.process_client</a> function to do
88
+ href="HttpServer.html#M000023">HttpServer.process_client</a> function to do
89
89
  the heavy lifting with the IO and Ruby.
90
90
  </p>
91
91
  <p>
@@ -119,11 +119,12 @@ finally useful.
119
119
  <h3 class="section-bar">Methods</h3>
120
120
 
121
121
  <div class="name-list">
122
- <a href="#M000028">new</a>&nbsp;&nbsp;
123
- <a href="#M000029">process_client</a>&nbsp;&nbsp;
124
- <a href="#M000031">register</a>&nbsp;&nbsp;
125
- <a href="#M000030">run</a>&nbsp;&nbsp;
126
- <a href="#M000032">unregister</a>&nbsp;&nbsp;
122
+ <a href="#M000022">new</a>&nbsp;&nbsp;
123
+ <a href="#M000023">process_client</a>&nbsp;&nbsp;
124
+ <a href="#M000025">register</a>&nbsp;&nbsp;
125
+ <a href="#M000024">run</a>&nbsp;&nbsp;
126
+ <a href="#M000027">stop</a>&nbsp;&nbsp;
127
+ <a href="#M000026">unregister</a>&nbsp;&nbsp;
127
128
  </div>
128
129
  </div>
129
130
 
@@ -158,12 +159,12 @@ finally useful.
158
159
  <div id="methods">
159
160
  <h3 class="section-bar">Public Class methods</h3>
160
161
 
161
- <div id="method-M000028" class="method-detail">
162
- <a name="M000028"></a>
162
+ <div id="method-M000022" class="method-detail">
163
+ <a name="M000022"></a>
163
164
 
164
165
  <div class="method-heading">
165
- <a href="HttpServer.src/M000028.html" target="Code" class="method-signature"
166
- onclick="popupCode('HttpServer.src/M000028.html');return false;">
166
+ <a href="HttpServer.src/M000022.html" target="Code" class="method-signature"
167
+ onclick="popupCode('HttpServer.src/M000022.html');return false;">
167
168
  <span class="method-name">new</span><span class="method-args">(host, port, num_processors=20, timeout=120)</span>
168
169
  </a>
169
170
  </div>
@@ -195,12 +196,12 @@ href="../Mongrel.html">Mongrel</a> will make this more dynamic (hopefully).
195
196
 
196
197
  <h3 class="section-bar">Public Instance methods</h3>
197
198
 
198
- <div id="method-M000029" class="method-detail">
199
- <a name="M000029"></a>
199
+ <div id="method-M000023" class="method-detail">
200
+ <a name="M000023"></a>
200
201
 
201
202
  <div class="method-heading">
202
- <a href="HttpServer.src/M000029.html" target="Code" class="method-signature"
203
- onclick="popupCode('HttpServer.src/M000029.html');return false;">
203
+ <a href="HttpServer.src/M000023.html" target="Code" class="method-signature"
204
+ onclick="popupCode('HttpServer.src/M000023.html');return false;">
204
205
  <span class="method-name">process_client</span><span class="method-args">(client)</span>
205
206
  </a>
206
207
  </div>
@@ -217,12 +218,12 @@ crack at it.
217
218
  </div>
218
219
  </div>
219
220
 
220
- <div id="method-M000031" class="method-detail">
221
- <a name="M000031"></a>
221
+ <div id="method-M000025" class="method-detail">
222
+ <a name="M000025"></a>
222
223
 
223
224
  <div class="method-heading">
224
- <a href="HttpServer.src/M000031.html" target="Code" class="method-signature"
225
- onclick="popupCode('HttpServer.src/M000031.html');return false;">
225
+ <a href="HttpServer.src/M000025.html" target="Code" class="method-signature"
226
+ onclick="popupCode('HttpServer.src/M000025.html');return false;">
226
227
  <span class="method-name">register</span><span class="method-args">(uri, handler)</span>
227
228
  </a>
228
229
  </div>
@@ -233,18 +234,18 @@ Simply registers a handler with the internal <a
233
234
  href="URIClassifier.html">URIClassifier</a>. When the URI is found in the
234
235
  prefix of a request then your handler&#8217;s HttpHandler::process method
235
236
  is called. See <a
236
- href="URIClassifier.html#M000036">Mongrel::URIClassifier#register</a> for
237
+ href="URIClassifier.html#M000031">Mongrel::URIClassifier#register</a> for
237
238
  more information.
238
239
  </p>
239
240
  </div>
240
241
  </div>
241
242
 
242
- <div id="method-M000030" class="method-detail">
243
- <a name="M000030"></a>
243
+ <div id="method-M000024" class="method-detail">
244
+ <a name="M000024"></a>
244
245
 
245
246
  <div class="method-heading">
246
- <a href="HttpServer.src/M000030.html" target="Code" class="method-signature"
247
- onclick="popupCode('HttpServer.src/M000030.html');return false;">
247
+ <a href="HttpServer.src/M000024.html" target="Code" class="method-signature"
248
+ onclick="popupCode('HttpServer.src/M000024.html');return false;">
248
249
  <span class="method-name">run</span><span class="method-args">()</span>
249
250
  </a>
250
251
  </div>
@@ -258,12 +259,30 @@ later.
258
259
  </div>
259
260
  </div>
260
261
 
261
- <div id="method-M000032" class="method-detail">
262
- <a name="M000032"></a>
262
+ <div id="method-M000027" class="method-detail">
263
+ <a name="M000027"></a>
263
264
 
264
265
  <div class="method-heading">
265
- <a href="HttpServer.src/M000032.html" target="Code" class="method-signature"
266
- onclick="popupCode('HttpServer.src/M000032.html');return false;">
266
+ <a href="HttpServer.src/M000027.html" target="Code" class="method-signature"
267
+ onclick="popupCode('HttpServer.src/M000027.html');return false;">
268
+ <span class="method-name">stop</span><span class="method-args">()</span>
269
+ </a>
270
+ </div>
271
+
272
+ <div class="method-description">
273
+ <p>
274
+ Stops the acceptor thread and then causes the worker threads to finish off
275
+ the request queue before finally exiting.
276
+ </p>
277
+ </div>
278
+ </div>
279
+
280
+ <div id="method-M000026" class="method-detail">
281
+ <a name="M000026"></a>
282
+
283
+ <div class="method-heading">
284
+ <a href="HttpServer.src/M000026.html" target="Code" class="method-signature"
285
+ onclick="popupCode('HttpServer.src/M000026.html');return false;">
267
286
  <span class="method-name">unregister</span><span class="method-args">(uri)</span>
268
287
  </a>
269
288
  </div>
@@ -271,7 +290,7 @@ later.
271
290
  <div class="method-description">
272
291
  <p>
273
292
  Removes any handler registered at the given URI. See <a
274
- href="URIClassifier.html#M000037">Mongrel::URIClassifier#unregister</a> for
293
+ href="URIClassifier.html#M000032">Mongrel::URIClassifier#unregister</a> for
275
294
  more information.
276
295
  </p>
277
296
  </div>
@@ -0,0 +1,33 @@
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>
7
+ <head>
8
+ <title>new (Mongrel::HttpServer)</title>
9
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
10
+ <link rel="stylesheet" href="../../.././rdoc-style.css" type="text/css" media="screen" />
11
+ </head>
12
+ <body class="standalone-code">
13
+ <pre> <span class="ruby-comment cmt"># File lib/mongrel.rb, line 324</span>
14
+ 324: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">initialize</span>(<span class="ruby-identifier">host</span>, <span class="ruby-identifier">port</span>, <span class="ruby-identifier">num_processors</span>=<span class="ruby-value">20</span>, <span class="ruby-identifier">timeout</span>=<span class="ruby-value">120</span>)
15
+ 325: <span class="ruby-ivar">@socket</span> = <span class="ruby-constant">TCPServer</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">host</span>, <span class="ruby-identifier">port</span>)
16
+ 326:
17
+ 327: <span class="ruby-ivar">@classifier</span> = <span class="ruby-constant">URIClassifier</span>.<span class="ruby-identifier">new</span>
18
+ 328: <span class="ruby-ivar">@req_queue</span> = <span class="ruby-constant">Queue</span>.<span class="ruby-identifier">new</span>
19
+ 329: <span class="ruby-ivar">@host</span> = <span class="ruby-identifier">host</span>
20
+ 330: <span class="ruby-ivar">@port</span> = <span class="ruby-identifier">port</span>
21
+ 331: <span class="ruby-ivar">@processors</span> = []
22
+ 332: <span class="ruby-ivar">@timeout</span> = <span class="ruby-identifier">timeout</span>
23
+ 333:
24
+ 334: <span class="ruby-identifier">num_processors</span>.<span class="ruby-identifier">times</span> {<span class="ruby-operator">|</span><span class="ruby-identifier">i</span><span class="ruby-operator">|</span>
25
+ 335: <span class="ruby-ivar">@processors</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-constant">Thread</span>.<span class="ruby-identifier">new</span> <span class="ruby-keyword kw">do</span>
26
+ 336: <span class="ruby-keyword kw">while</span> <span class="ruby-identifier">client</span> = <span class="ruby-ivar">@req_queue</span>.<span class="ruby-identifier">deq</span>
27
+ 337: <span class="ruby-identifier">process_client</span>(<span class="ruby-identifier">client</span>)
28
+ 338: <span class="ruby-keyword kw">end</span>
29
+ 339: <span class="ruby-keyword kw">end</span>
30
+ 340: }
31
+ 341: <span class="ruby-keyword kw">end</span></pre>
32
+ </body>
33
+ </html>
@@ -0,0 +1,57 @@
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>
7
+ <head>
8
+ <title>process_client (Mongrel::HttpServer)</title>
9
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
10
+ <link rel="stylesheet" href="../../.././rdoc-style.css" type="text/css" media="screen" />
11
+ </head>
12
+ <body class="standalone-code">
13
+ <pre> <span class="ruby-comment cmt"># File lib/mongrel.rb, line 349</span>
14
+ 349: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">process_client</span>(<span class="ruby-identifier">client</span>)
15
+ 350: <span class="ruby-keyword kw">begin</span>
16
+ 351: <span class="ruby-identifier">parser</span> = <span class="ruby-constant">HttpParser</span>.<span class="ruby-identifier">new</span>
17
+ 352: <span class="ruby-identifier">params</span> = {}
18
+ 353: <span class="ruby-identifier">data</span> = <span class="ruby-identifier">client</span>.<span class="ruby-identifier">readpartial</span>(<span class="ruby-constant">Const</span><span class="ruby-operator">::</span><span class="ruby-constant">CHUNK_SIZE</span>)
19
+ 354:
20
+ 355: <span class="ruby-keyword kw">while</span> <span class="ruby-keyword kw">true</span>
21
+ 356: <span class="ruby-identifier">nread</span> = <span class="ruby-identifier">parser</span>.<span class="ruby-identifier">execute</span>(<span class="ruby-identifier">params</span>, <span class="ruby-identifier">data</span>)
22
+ 357: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">parser</span>.<span class="ruby-identifier">finished?</span>
23
+ 358: <span class="ruby-identifier">script_name</span>, <span class="ruby-identifier">path_info</span>, <span class="ruby-identifier">handler</span> = <span class="ruby-ivar">@classifier</span>.<span class="ruby-identifier">resolve</span>(<span class="ruby-identifier">params</span>[<span class="ruby-constant">Const</span><span class="ruby-operator">::</span><span class="ruby-constant">REQUEST_URI</span>])
24
+ 359:
25
+ 360: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">handler</span>
26
+ 361: <span class="ruby-identifier">params</span>[<span class="ruby-constant">Const</span><span class="ruby-operator">::</span><span class="ruby-constant">PATH_INFO</span>] = <span class="ruby-identifier">path_info</span>
27
+ 362: <span class="ruby-identifier">params</span>[<span class="ruby-constant">Const</span><span class="ruby-operator">::</span><span class="ruby-constant">SCRIPT_NAME</span>] = <span class="ruby-identifier">script_name</span>
28
+ 363: <span class="ruby-identifier">request</span> = <span class="ruby-constant">HttpRequest</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">params</span>, <span class="ruby-identifier">data</span>[<span class="ruby-identifier">nread</span> <span class="ruby-operator">...</span> <span class="ruby-identifier">data</span>.<span class="ruby-identifier">length</span>], <span class="ruby-identifier">client</span>)
29
+ 364: <span class="ruby-identifier">response</span> = <span class="ruby-constant">HttpResponse</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">client</span>)
30
+ 365: <span class="ruby-identifier">handler</span>.<span class="ruby-identifier">process</span>(<span class="ruby-identifier">request</span>, <span class="ruby-identifier">response</span>)
31
+ 366: <span class="ruby-keyword kw">else</span>
32
+ 367: <span class="ruby-identifier">client</span>.<span class="ruby-identifier">write</span>(<span class="ruby-constant">Const</span><span class="ruby-operator">::</span><span class="ruby-constant">ERROR_404_RESPONSE</span>)
33
+ 368: <span class="ruby-keyword kw">end</span>
34
+ 369:
35
+ 370: <span class="ruby-keyword kw">break</span> <span class="ruby-comment cmt">#done</span>
36
+ 371: <span class="ruby-keyword kw">else</span>
37
+ 372: <span class="ruby-comment cmt"># gotta stream and read again until we can get the parser to be character safe</span>
38
+ 373: <span class="ruby-comment cmt"># TODO: make this more efficient since this means we're parsing a lot repeatedly</span>
39
+ 374: <span class="ruby-identifier">parser</span>.<span class="ruby-identifier">reset</span>
40
+ 375: <span class="ruby-identifier">data</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">client</span>.<span class="ruby-identifier">readpartial</span>(<span class="ruby-constant">Const</span><span class="ruby-operator">::</span><span class="ruby-constant">CHUNK_SIZE</span>)
41
+ 376: <span class="ruby-keyword kw">end</span>
42
+ 377: <span class="ruby-keyword kw">end</span>
43
+ 378: <span class="ruby-keyword kw">rescue</span> <span class="ruby-constant">EOFError</span>
44
+ 379: <span class="ruby-comment cmt"># ignored</span>
45
+ 380: <span class="ruby-keyword kw">rescue</span> <span class="ruby-constant">Errno</span><span class="ruby-operator">::</span><span class="ruby-constant">ECONNRESET</span>
46
+ 381: <span class="ruby-comment cmt"># ignored</span>
47
+ 382: <span class="ruby-keyword kw">rescue</span> <span class="ruby-constant">Errno</span><span class="ruby-operator">::</span><span class="ruby-constant">EPIPE</span>
48
+ 383: <span class="ruby-comment cmt"># ignored</span>
49
+ 384: <span class="ruby-keyword kw">rescue</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">details</span>
50
+ 385: <span class="ruby-constant">STDERR</span>.<span class="ruby-identifier">puts</span> <span class="ruby-node">&quot;ERROR(#{details.class}): #{details}&quot;</span>
51
+ 386: <span class="ruby-constant">STDERR</span>.<span class="ruby-identifier">puts</span> <span class="ruby-identifier">details</span>.<span class="ruby-identifier">backtrace</span>.<span class="ruby-identifier">join</span>(<span class="ruby-value str">&quot;\n&quot;</span>)
52
+ 387: <span class="ruby-keyword kw">ensure</span>
53
+ 388: <span class="ruby-identifier">client</span>.<span class="ruby-identifier">close</span>
54
+ 389: <span class="ruby-keyword kw">end</span>
55
+ 390: <span class="ruby-keyword kw">end</span></pre>
56
+ </body>
57
+ </html>
@@ -0,0 +1,46 @@
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>
7
+ <head>
8
+ <title>run (Mongrel::HttpServer)</title>
9
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
10
+ <link rel="stylesheet" href="../../.././rdoc-style.css" type="text/css" media="screen" />
11
+ </head>
12
+ <body class="standalone-code">
13
+ <pre> <span class="ruby-comment cmt"># File lib/mongrel.rb, line 394</span>
14
+ 394: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">run</span>
15
+ 395: <span class="ruby-constant">BasicSocket</span>.<span class="ruby-identifier">do_not_reverse_lookup</span>=<span class="ruby-keyword kw">true</span>
16
+ 396: <span class="ruby-ivar">@acceptor</span> = <span class="ruby-constant">Thread</span>.<span class="ruby-identifier">new</span> <span class="ruby-keyword kw">do</span>
17
+ 397: <span class="ruby-constant">Thread</span>.<span class="ruby-identifier">current</span>[<span class="ruby-identifier">:stopped</span>] = <span class="ruby-keyword kw">false</span>
18
+ 398:
19
+ 399: <span class="ruby-keyword kw">while</span> <span class="ruby-keyword kw">not</span> <span class="ruby-constant">Thread</span>.<span class="ruby-identifier">current</span>[<span class="ruby-identifier">:stopped</span>]
20
+ 400: <span class="ruby-keyword kw">begin</span>
21
+ 401: <span class="ruby-ivar">@req_queue</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-ivar">@socket</span>.<span class="ruby-identifier">accept</span>
22
+ 402: <span class="ruby-keyword kw">rescue</span> <span class="ruby-constant">StopServer</span>
23
+ 403: <span class="ruby-constant">STDERR</span>.<span class="ruby-identifier">puts</span> <span class="ruby-value str">&quot;Server stopped. Exiting.&quot;</span>
24
+ 404: <span class="ruby-ivar">@socket</span>.<span class="ruby-identifier">close</span> <span class="ruby-keyword kw">if</span> <span class="ruby-keyword kw">not</span> <span class="ruby-ivar">@socket</span>.<span class="ruby-identifier">closed?</span>
25
+ 405: <span class="ruby-keyword kw">break</span>
26
+ 406: <span class="ruby-keyword kw">rescue</span> <span class="ruby-constant">Errno</span><span class="ruby-operator">::</span><span class="ruby-constant">EMFILE</span>
27
+ 407: <span class="ruby-constant">STDERR</span>.<span class="ruby-identifier">puts</span> <span class="ruby-value str">&quot;Too many open files. Try increasing ulimits.&quot;</span>
28
+ 408: <span class="ruby-identifier">sleep</span> <span class="ruby-value">0</span><span class="ruby-value">.5</span>
29
+ 409: <span class="ruby-keyword kw">end</span>
30
+ 410: <span class="ruby-keyword kw">end</span>
31
+ 411:
32
+ 412: <span class="ruby-comment cmt"># now that processing is done we feed enough false onto the request queue to get</span>
33
+ 413: <span class="ruby-comment cmt"># each processor to exit and stop processing.</span>
34
+ 414: <span class="ruby-ivar">@processors</span>.<span class="ruby-identifier">length</span>.<span class="ruby-identifier">times</span> { <span class="ruby-ivar">@req_queue</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-keyword kw">false</span> }
35
+ 415:
36
+ 416: <span class="ruby-comment cmt"># finally we wait until the queue is empty</span>
37
+ 417: <span class="ruby-keyword kw">while</span> <span class="ruby-ivar">@req_queue</span>.<span class="ruby-identifier">length</span> <span class="ruby-operator">&gt;</span> <span class="ruby-value">0</span>
38
+ 418: <span class="ruby-constant">STDERR</span>.<span class="ruby-identifier">puts</span> <span class="ruby-node">&quot;Shutdown waiting for #{@req_queue.length} requests&quot;</span> <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@req_queue</span>.<span class="ruby-identifier">length</span> <span class="ruby-operator">&gt;</span> <span class="ruby-value">0</span>
39
+ 419: <span class="ruby-identifier">sleep</span> <span class="ruby-value">1</span>
40
+ 420: <span class="ruby-keyword kw">end</span>
41
+ 421: <span class="ruby-keyword kw">end</span>
42
+ 422:
43
+ 423: <span class="ruby-ivar">@acceptor</span>.<span class="ruby-identifier">priority</span> = <span class="ruby-value">1</span>
44
+ 424: <span class="ruby-keyword kw">end</span></pre>
45
+ </body>
46
+ </html>
@@ -10,9 +10,9 @@
10
10
  <link rel="stylesheet" href="../../.././rdoc-style.css" type="text/css" media="screen" />
11
11
  </head>
12
12
  <body class="standalone-code">
13
- <pre> <span class="ruby-comment cmt"># File lib/mongrel.rb, line 415</span>
14
- 415: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">register</span>(<span class="ruby-identifier">uri</span>, <span class="ruby-identifier">handler</span>)
15
- 416: <span class="ruby-ivar">@classifier</span>.<span class="ruby-identifier">register</span>(<span class="ruby-identifier">uri</span>, <span class="ruby-identifier">handler</span>)
16
- 417: <span class="ruby-keyword kw">end</span></pre>
13
+ <pre> <span class="ruby-comment cmt"># File lib/mongrel.rb, line 430</span>
14
+ 430: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">register</span>(<span class="ruby-identifier">uri</span>, <span class="ruby-identifier">handler</span>)
15
+ 431: <span class="ruby-ivar">@classifier</span>.<span class="ruby-identifier">register</span>(<span class="ruby-identifier">uri</span>, <span class="ruby-identifier">handler</span>)
16
+ 432: <span class="ruby-keyword kw">end</span></pre>
17
17
  </body>
18
18
  </html>
@@ -10,9 +10,9 @@
10
10
  <link rel="stylesheet" href="../../.././rdoc-style.css" type="text/css" media="screen" />
11
11
  </head>
12
12
  <body class="standalone-code">
13
- <pre> <span class="ruby-comment cmt"># File lib/mongrel.rb, line 421</span>
14
- 421: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">unregister</span>(<span class="ruby-identifier">uri</span>)
15
- 422: <span class="ruby-ivar">@classifier</span>.<span class="ruby-identifier">unregister</span>(<span class="ruby-identifier">uri</span>)
16
- 423: <span class="ruby-keyword kw">end</span></pre>
13
+ <pre> <span class="ruby-comment cmt"># File lib/mongrel.rb, line 436</span>
14
+ 436: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">unregister</span>(<span class="ruby-identifier">uri</span>)
15
+ 437: <span class="ruby-ivar">@classifier</span>.<span class="ruby-identifier">unregister</span>(<span class="ruby-identifier">uri</span>)
16
+ 438: <span class="ruby-keyword kw">end</span></pre>
17
17
  </body>
18
18
  </html>
@@ -0,0 +1,19 @@
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>
7
+ <head>
8
+ <title>stop (Mongrel::HttpServer)</title>
9
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
10
+ <link rel="stylesheet" href="../../.././rdoc-style.css" type="text/css" media="screen" />
11
+ </head>
12
+ <body class="standalone-code">
13
+ <pre> <span class="ruby-comment cmt"># File lib/mongrel.rb, line 442</span>
14
+ 442: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">stop</span>
15
+ 443: <span class="ruby-ivar">@acceptor</span>[<span class="ruby-identifier">:stopped</span>] = <span class="ruby-keyword kw">true</span>
16
+ 444: <span class="ruby-ivar">@acceptor</span>.<span class="ruby-identifier">raise</span>(<span class="ruby-constant">StopServer</span>.<span class="ruby-identifier">new</span>)
17
+ 445: <span class="ruby-keyword kw">end</span></pre>
18
+ </body>
19
+ </html>
@@ -5,7 +5,7 @@
5
5
 
6
6
  <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
7
7
  <head>
8
- <title>Class: Mongrel::HttpHandler</title>
8
+ <title>Class: Mongrel::StopServer</title>
9
9
  <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
10
10
  <meta http-equiv="Content-Script-Type" content="text/javascript" />
11
11
  <link rel="stylesheet" href="../.././rdoc-style.css" type="text/css" media="screen" />
@@ -50,7 +50,7 @@
50
50
  <table class="header-table">
51
51
  <tr class="top-aligned-row">
52
52
  <td><strong>Class</strong></td>
53
- <td class="class-name-in-header">Mongrel::HttpHandler</td>
53
+ <td class="class-name-in-header">Mongrel::StopServer</td>
54
54
  </tr>
55
55
  <tr class="top-aligned-row">
56
56
  <td><strong>In:</strong></td>
@@ -65,7 +65,7 @@
65
65
  <tr class="top-aligned-row">
66
66
  <td><strong>Parent:</strong></td>
67
67
  <td>
68
- Object
68
+ Exception
69
69
  </td>
70
70
  </tr>
71
71
  </table>
@@ -80,10 +80,7 @@
80
80
 
81
81
  <div id="description">
82
82
  <p>
83
- You implement your application handler with this. It&#8217;s very light
84
- giving just the minimum necessary for you to handle a request and shoot
85
- back a response. Look at the <a href="HttpRequest.html">HttpRequest</a> and
86
- <a href="HttpResponse.html">HttpResponse</a> objects for how to use them.
83
+ Used to stop the <a href="HttpServer.html">HttpServer</a> via Thread.raise.
87
84
  </p>
88
85
 
89
86
  </div>
@@ -91,13 +88,6 @@ back a response. Look at the <a href="HttpRequest.html">HttpRequest</a> and
91
88
 
92
89
  </div>
93
90
 
94
- <div id="method-list">
95
- <h3 class="section-bar">Methods</h3>
96
-
97
- <div class="name-list">
98
- <a href="#M000039">process</a>&nbsp;&nbsp;
99
- </div>
100
- </div>
101
91
 
102
92
  </div>
103
93
 
@@ -114,25 +104,6 @@ back a response. Look at the <a href="HttpRequest.html">HttpRequest</a> and
114
104
 
115
105
 
116
106
  <!-- if method_list -->
117
- <div id="methods">
118
- <h3 class="section-bar">Public Instance methods</h3>
119
-
120
- <div id="method-M000039" class="method-detail">
121
- <a name="M000039"></a>
122
-
123
- <div class="method-heading">
124
- <a href="HttpHandler.src/M000039.html" target="Code" class="method-signature"
125
- onclick="popupCode('HttpHandler.src/M000039.html');return false;">
126
- <span class="method-name">process</span><span class="method-args">(request, response)</span>
127
- </a>
128
- </div>
129
-
130
- <div class="method-description">
131
- </div>
132
- </div>
133
-
134
-
135
- </div>
136
107
 
137
108
 
138
109
  </div>
@@ -86,10 +86,10 @@
86
86
  <h3 class="section-bar">Methods</h3>
87
87
 
88
88
  <div class="name-list">
89
- <a href="#M000035">new</a>&nbsp;&nbsp;
90
- <a href="#M000036">register</a>&nbsp;&nbsp;
91
- <a href="#M000038">resolve</a>&nbsp;&nbsp;
92
- <a href="#M000037">unregister</a>&nbsp;&nbsp;
89
+ <a href="#M000030">new</a>&nbsp;&nbsp;
90
+ <a href="#M000031">register</a>&nbsp;&nbsp;
91
+ <a href="#M000033">resolve</a>&nbsp;&nbsp;
92
+ <a href="#M000032">unregister</a>&nbsp;&nbsp;
93
93
  </div>
94
94
  </div>
95
95
 
@@ -111,12 +111,12 @@
111
111
  <div id="methods">
112
112
  <h3 class="section-bar">Public Class methods</h3>
113
113
 
114
- <div id="method-M000035" class="method-detail">
115
- <a name="M000035"></a>
114
+ <div id="method-M000030" class="method-detail">
115
+ <a name="M000030"></a>
116
116
 
117
117
  <div class="method-heading">
118
- <a href="URIClassifier.src/M000035.html" target="Code" class="method-signature"
119
- onclick="popupCode('URIClassifier.src/M000035.html');return false;">
118
+ <a href="URIClassifier.src/M000030.html" target="Code" class="method-signature"
119
+ onclick="popupCode('URIClassifier.src/M000030.html');return false;">
120
120
  <span class="method-name">URIClassifier.new &rarr; URIClassifier<br />
121
121
  </span>
122
122
  </a>
@@ -143,12 +143,12 @@ portion.
143
143
 
144
144
  <h3 class="section-bar">Public Instance methods</h3>
145
145
 
146
- <div id="method-M000036" class="method-detail">
147
- <a name="M000036"></a>
146
+ <div id="method-M000031" class="method-detail">
147
+ <a name="M000031"></a>
148
148
 
149
149
  <div class="method-heading">
150
- <a href="URIClassifier.src/M000036.html" target="Code" class="method-signature"
151
- onclick="popupCode('URIClassifier.src/M000036.html');return false;">
150
+ <a href="URIClassifier.src/M000031.html" target="Code" class="method-signature"
151
+ onclick="popupCode('URIClassifier.src/M000031.html');return false;">
152
152
  <span class="method-name">uc.register("/someuri", SampleHandler.new) &rarr; nil<br />
153
153
  </span>
154
154
  </a>
@@ -173,12 +173,12 @@ to get right with a Hash.
173
173
  </div>
174
174
  </div>
175
175
 
176
- <div id="method-M000038" class="method-detail">
177
- <a name="M000038"></a>
176
+ <div id="method-M000033" class="method-detail">
177
+ <a name="M000033"></a>
178
178
 
179
179
  <div class="method-heading">
180
- <a href="URIClassifier.src/M000038.html" target="Code" class="method-signature"
181
- onclick="popupCode('URIClassifier.src/M000038.html');return false;">
180
+ <a href="URIClassifier.src/M000033.html" target="Code" class="method-signature"
181
+ onclick="popupCode('URIClassifier.src/M000033.html');return false;">
182
182
  <span class="method-name">uc.resolve("/someuri") &rarr; "/someuri", "", handler<br />
183
183
  uc.resolve("/someuri/pathinfo") &rarr; "/someuri", "/pathinfo", handler<br />
184
184
  uc.resolve("/notfound/orhere") &rarr; nil, nil, nil<br />
@@ -192,9 +192,8 @@ uc.resolve("/path/from/root") &rarr; "/", "/path/from/root", handler # if uc.re
192
192
  <p>
193
193
  Attempts to resolve either the whole URI or at the longest prefix,
194
194
  returning the prefix (as script_info), path (as path_info), and registered
195
- handler (usually an <a href="HttpHandler.html">HttpHandler</a>). If it
196
- doesn&#8217;t find a handler registered at the longest match then it
197
- returns nil,nil,nil.
195
+ handler (usually an HttpHandler). If it doesn&#8217;t find a handler
196
+ registered at the longest match then it returns nil,nil,nil.
198
197
  </p>
199
198
  <p>
200
199
  Because the resolver uses a trie you are able to register a handler at
@@ -225,12 +224,12 @@ Don&#8216;t try other string-like stuff yet.
225
224
  </div>
226
225
  </div>
227
226
 
228
- <div id="method-M000037" class="method-detail">
229
- <a name="M000037"></a>
227
+ <div id="method-M000032" class="method-detail">
228
+ <a name="M000032"></a>
230
229
 
231
230
  <div class="method-heading">
232
- <a href="URIClassifier.src/M000037.html" target="Code" class="method-signature"
233
- onclick="popupCode('URIClassifier.src/M000037.html');return false;">
231
+ <a href="URIClassifier.src/M000032.html" target="Code" class="method-signature"
232
+ onclick="popupCode('URIClassifier.src/M000032.html');return false;">
234
233
  <span class="method-name">uc.unregister("/someuri")<br />
235
234
  </span>
236
235
  </a>