mongrel 0.3.5 → 0.3.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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>