mongrel 0.3.1 → 0.3.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (34) hide show
  1. data/README +4 -1
  2. data/Rakefile +1 -1
  3. data/bin/mongrel_rails +77 -24
  4. data/doc/rdoc/classes/Mongrel.html +0 -30
  5. data/doc/rdoc/classes/Mongrel/DirHandler.html +45 -26
  6. data/doc/rdoc/classes/Mongrel/DirHandler.src/M000022.html +20 -0
  7. data/doc/rdoc/classes/Mongrel/DirHandler.src/M000023.html +29 -7
  8. data/doc/rdoc/classes/Mongrel/DirHandler.src/M000024.html +27 -29
  9. data/doc/rdoc/classes/Mongrel/DirHandler.src/M000025.html +18 -27
  10. data/doc/rdoc/classes/Mongrel/DirHandler.src/M000026.html +25 -18
  11. data/doc/rdoc/classes/Mongrel/DirHandler.src/M000027.html +5 -25
  12. data/doc/rdoc/classes/Mongrel/Error404Handler.src/M000047.html +4 -4
  13. data/doc/rdoc/classes/Mongrel/Error404Handler.src/M000048.html +4 -4
  14. data/doc/rdoc/classes/Mongrel/HttpParser.html +35 -35
  15. data/doc/rdoc/classes/Mongrel/HttpParser.src/{M000022.html → M000015.html} +6 -6
  16. data/doc/rdoc/classes/Mongrel/HttpParser.src/M000016.html +6 -5
  17. data/doc/rdoc/classes/Mongrel/HttpParser.src/M000017.html +7 -7
  18. data/doc/rdoc/classes/Mongrel/HttpParser.src/M000018.html +20 -8
  19. data/doc/rdoc/classes/Mongrel/HttpParser.src/M000019.html +6 -20
  20. data/doc/rdoc/classes/Mongrel/HttpParser.src/M000020.html +5 -5
  21. data/doc/rdoc/classes/Mongrel/HttpParser.src/M000021.html +6 -5
  22. data/doc/rdoc/classes/Mongrel/HttpServer.html +1 -1
  23. data/doc/rdoc/classes/Mongrel/HttpServer.src/M000028.html +16 -9
  24. data/doc/rdoc/classes/Mongrel/HttpServer.src/M000029.html +49 -49
  25. data/doc/rdoc/classes/Mongrel/HttpServer.src/M000030.html +9 -9
  26. data/doc/rdoc/classes/Mongrel/HttpServer.src/M000031.html +4 -4
  27. data/doc/rdoc/classes/Mongrel/HttpServer.src/M000032.html +4 -4
  28. data/doc/rdoc/created.rid +1 -1
  29. data/doc/rdoc/files/README.html +7 -2
  30. data/doc/rdoc/files/lib/mongrel_rb.html +1 -1
  31. data/doc/rdoc/fr_method_index.html +15 -15
  32. data/lib/mongrel.rb +17 -8
  33. metadata +4 -5
  34. data/doc/rdoc/classes/Mongrel.src/M000015.html +0 -18
@@ -5,37 +5,23 @@
5
5
 
6
6
  <html>
7
7
  <head>
8
- <title>execute (Mongrel::HttpParser)</title>
8
+ <title>error? (Mongrel::HttpParser)</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
13
  <pre>/**
14
14
  * call-seq:
15
- * parser.execute(req_hash, data) -&gt; Integer
15
+ * parser.error? -&gt; true/false
16
16
  *
17
- * Takes a Hash and a String of data, parses the String of data filling in the Hash
18
- * returning an Integer to indicate how much of the data has been read. No matter
19
- * what the return value, you should call HttpParser#finished? and HttpParser#error?
20
- * to figure out if it's done parsing or there was an error.
21
- *
22
- * This function now throws an exception when there is a parsing error. This makes
23
- * the logic for working with the parser much easier. You can still test for an
24
- * error, but now you need to wrap the parser with an exception handling block.
17
+ * Tells you whether the parser is in an error state.
25
18
  */
26
- VALUE HttpParser_execute(VALUE self, VALUE req_hash, VALUE data)
19
+ VALUE HttpParser_has_error(VALUE self)
27
20
  {
28
21
  http_parser *http = NULL;
29
22
  DATA_GET(self, http_parser, http);
30
-
31
- http-&gt;data = (void *)req_hash;
32
- http_parser_execute(http, RSTRING(data)-&gt;ptr, RSTRING(data)-&gt;len);
33
-
34
- if(http_parser_has_error(http)) {
35
- rb_raise(rb_eStandardError, &quot;HTTP Parsing failure&quot;);
36
- } else {
37
- return INT2FIX(http_parser_nread(http));
38
- }
23
+
24
+ return http_parser_has_error(http) ? Qtrue : Qfalse;
39
25
  }</pre>
40
26
  </body>
41
27
  </html>
@@ -5,23 +5,23 @@
5
5
 
6
6
  <html>
7
7
  <head>
8
- <title>error? (Mongrel::HttpParser)</title>
8
+ <title>finished? (Mongrel::HttpParser)</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
13
  <pre>/**
14
14
  * call-seq:
15
- * parser.error? -&gt; true/false
15
+ * parser.finished? -&gt; true/false
16
16
  *
17
- * Tells you whether the parser is in an error state.
17
+ * Tells you whether the parser is finished or not and in a good state.
18
18
  */
19
- VALUE HttpParser_has_error(VALUE self)
19
+ VALUE HttpParser_is_finished(VALUE self)
20
20
  {
21
21
  http_parser *http = NULL;
22
22
  DATA_GET(self, http_parser, http);
23
23
 
24
- return http_parser_has_error(http) ? Qtrue : Qfalse;
24
+ return http_parser_is_finished(http) ? Qtrue : Qfalse;
25
25
  }</pre>
26
26
  </body>
27
27
  </html>
@@ -5,23 +5,24 @@
5
5
 
6
6
  <html>
7
7
  <head>
8
- <title>finished? (Mongrel::HttpParser)</title>
8
+ <title>nread (Mongrel::HttpParser)</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
13
  <pre>/**
14
14
  * call-seq:
15
- * parser.finished? -&gt; true/false
15
+ * parser.nread -&gt; Integer
16
16
  *
17
- * Tells you whether the parser is finished or not and in a good state.
17
+ * Returns the amount of data processed so far during this processing cycle. It is
18
+ * set to 0 on initialize or reset calls and is incremented each time execute is called.
18
19
  */
19
- VALUE HttpParser_is_finished(VALUE self)
20
+ VALUE HttpParser_nread(VALUE self)
20
21
  {
21
22
  http_parser *http = NULL;
22
23
  DATA_GET(self, http_parser, http);
23
24
 
24
- return http_parser_is_finished(http) ? Qtrue : Qfalse;
25
+ return INT2FIX(http-&gt;nread);
25
26
  }</pre>
26
27
  </body>
27
28
  </html>
@@ -164,7 +164,7 @@ finally useful.
164
164
  <div class="method-heading">
165
165
  <a href="HttpServer.src/M000028.html" target="Code" class="method-signature"
166
166
  onclick="popupCode('HttpServer.src/M000028.html');return false;">
167
- <span class="method-name">new</span><span class="method-args">(host, port, num_processors=20)</span>
167
+ <span class="method-name">new</span><span class="method-args">(host, port, num_processors=20, timeout=120)</span>
168
168
  </a>
169
169
  </div>
170
170
 
@@ -11,7 +11,7 @@
11
11
  </head>
12
12
  <body class="standalone-code">
13
13
  <pre> <span class="ruby-comment cmt"># File lib/mongrel.rb, line 317</span>
14
- 317: <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>)
14
+ 317: <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
15
  318: <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
16
  319:
17
17
  320: <span class="ruby-ivar">@classifier</span> = <span class="ruby-constant">URIClassifier</span>.<span class="ruby-identifier">new</span>
@@ -19,13 +19,20 @@
19
19
  322: <span class="ruby-ivar">@host</span> = <span class="ruby-identifier">host</span>
20
20
  323: <span class="ruby-ivar">@port</span> = <span class="ruby-identifier">port</span>
21
21
  324: <span class="ruby-ivar">@num_processors</span> = <span class="ruby-identifier">num_processors</span>
22
- 325:
23
- 326: <span class="ruby-ivar">@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> <span class="ruby-constant">Thread</span>.<span class="ruby-identifier">new</span> <span class="ruby-keyword kw">do</span>
24
- 327: <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>
25
- 328: <span class="ruby-identifier">process_client</span>(<span class="ruby-identifier">client</span>)
26
- 329: <span class="ruby-keyword kw">end</span>
27
- 330: <span class="ruby-keyword kw">end</span>
28
- 331: }
29
- 332: <span class="ruby-keyword kw">end</span></pre>
22
+ 325: <span class="ruby-ivar">@timeout</span> = <span class="ruby-identifier">timeout</span>
23
+ 326:
24
+ 327: <span class="ruby-ivar">@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> <span class="ruby-constant">Thread</span>.<span class="ruby-identifier">new</span> <span class="ruby-keyword kw">do</span>
25
+ 328: <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>
26
+ 329: <span class="ruby-keyword kw">begin</span>
27
+ 330: <span class="ruby-constant">Timeout</span>.<span class="ruby-identifier">timeout</span>(<span class="ruby-ivar">@timeout</span>) <span class="ruby-keyword kw">do</span>
28
+ 331: <span class="ruby-identifier">process_client</span>(<span class="ruby-identifier">client</span>)
29
+ 332: <span class="ruby-keyword kw">end</span>
30
+ 333: <span class="ruby-keyword kw">rescue</span> <span class="ruby-constant">Timeout</span><span class="ruby-operator">::</span><span class="ruby-constant">Error</span>
31
+ 334: <span class="ruby-constant">STDERR</span>.<span class="ruby-identifier">puts</span> <span class="ruby-value str">&quot;WARNING: Request took longer than #@timeout second timeout&quot;</span>
32
+ 335: <span class="ruby-keyword kw">end</span>
33
+ 336: <span class="ruby-keyword kw">end</span>
34
+ 337: <span class="ruby-keyword kw">end</span>
35
+ 338: }
36
+ 339: <span class="ruby-keyword kw">end</span></pre>
30
37
  </body>
31
38
  </html>
@@ -10,55 +10,55 @@
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 340</span>
14
- 340: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">process_client</span>(<span class="ruby-identifier">client</span>)
15
- 341: <span class="ruby-keyword kw">begin</span>
16
- 342: <span class="ruby-identifier">parser</span> = <span class="ruby-constant">HttpParser</span>.<span class="ruby-identifier">new</span>
17
- 343: <span class="ruby-identifier">params</span> = {}
18
- 344: <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
- 345:
20
- 346: <span class="ruby-keyword kw">while</span> <span class="ruby-keyword kw">true</span>
21
- 347: <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
- 348: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">parser</span>.<span class="ruby-identifier">finished?</span>
23
- 349: <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
- 350:
25
- 351: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">handler</span>
26
- 352: <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
- 353: <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
- 354: <span class="ruby-identifier">params</span>[<span class="ruby-constant">Const</span><span class="ruby-operator">::</span><span class="ruby-constant">GATEWAY_INTERFACE</span>]=<span class="ruby-constant">Const</span><span class="ruby-operator">::</span><span class="ruby-constant">GATEWAY_INTERFACE_VALUE</span>
29
- 355: <span class="ruby-identifier">params</span>[<span class="ruby-constant">Const</span><span class="ruby-operator">::</span><span class="ruby-constant">REMOTE_ADDR</span>]=<span class="ruby-identifier">client</span>.<span class="ruby-identifier">peeraddr</span>[<span class="ruby-value">3</span>]
30
- 356: <span class="ruby-identifier">params</span>[<span class="ruby-constant">Const</span><span class="ruby-operator">::</span><span class="ruby-constant">SERVER_NAME</span>]=<span class="ruby-ivar">@host</span>
31
- 357: <span class="ruby-identifier">params</span>[<span class="ruby-constant">Const</span><span class="ruby-operator">::</span><span class="ruby-constant">SERVER_PORT</span>]=<span class="ruby-ivar">@port</span>
32
- 358: <span class="ruby-identifier">params</span>[<span class="ruby-constant">Const</span><span class="ruby-operator">::</span><span class="ruby-constant">SERVER_PROTOCOL</span>]=<span class="ruby-constant">Const</span><span class="ruby-operator">::</span><span class="ruby-constant">SERVER_PROTOCOL_VALUE</span>
33
- 359: <span class="ruby-identifier">params</span>[<span class="ruby-constant">Const</span><span class="ruby-operator">::</span><span class="ruby-constant">SERVER_SOFTWARE</span>]=<span class="ruby-constant">Const</span><span class="ruby-operator">::</span><span class="ruby-constant">MONGREL_VERSION</span>
34
- 360:
35
- 361: <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>)
36
- 362: <span class="ruby-identifier">response</span> = <span class="ruby-constant">HttpResponse</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">client</span>)
37
- 363: <span class="ruby-identifier">handler</span>.<span class="ruby-identifier">process</span>(<span class="ruby-identifier">request</span>, <span class="ruby-identifier">response</span>)
38
- 364: <span class="ruby-keyword kw">else</span>
39
- 365: <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>)
40
- 366: <span class="ruby-keyword kw">end</span>
13
+ <pre> <span class="ruby-comment cmt"># File lib/mongrel.rb, line 347</span>
14
+ 347: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">process_client</span>(<span class="ruby-identifier">client</span>)
15
+ 348: <span class="ruby-keyword kw">begin</span>
16
+ 349: <span class="ruby-identifier">parser</span> = <span class="ruby-constant">HttpParser</span>.<span class="ruby-identifier">new</span>
17
+ 350: <span class="ruby-identifier">params</span> = {}
18
+ 351: <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
+ 352:
20
+ 353: <span class="ruby-keyword kw">while</span> <span class="ruby-keyword kw">true</span>
21
+ 354: <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
+ 355: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">parser</span>.<span class="ruby-identifier">finished?</span>
23
+ 356: <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
+ 357:
25
+ 358: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">handler</span>
26
+ 359: <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
+ 360: <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
+ 361: <span class="ruby-identifier">params</span>[<span class="ruby-constant">Const</span><span class="ruby-operator">::</span><span class="ruby-constant">GATEWAY_INTERFACE</span>]=<span class="ruby-constant">Const</span><span class="ruby-operator">::</span><span class="ruby-constant">GATEWAY_INTERFACE_VALUE</span>
29
+ 362: <span class="ruby-identifier">params</span>[<span class="ruby-constant">Const</span><span class="ruby-operator">::</span><span class="ruby-constant">REMOTE_ADDR</span>]=<span class="ruby-identifier">client</span>.<span class="ruby-identifier">peeraddr</span>[<span class="ruby-value">3</span>]
30
+ 363: <span class="ruby-identifier">params</span>[<span class="ruby-constant">Const</span><span class="ruby-operator">::</span><span class="ruby-constant">SERVER_NAME</span>]=<span class="ruby-ivar">@host</span>
31
+ 364: <span class="ruby-identifier">params</span>[<span class="ruby-constant">Const</span><span class="ruby-operator">::</span><span class="ruby-constant">SERVER_PORT</span>]=<span class="ruby-ivar">@port</span>
32
+ 365: <span class="ruby-identifier">params</span>[<span class="ruby-constant">Const</span><span class="ruby-operator">::</span><span class="ruby-constant">SERVER_PROTOCOL</span>]=<span class="ruby-constant">Const</span><span class="ruby-operator">::</span><span class="ruby-constant">SERVER_PROTOCOL_VALUE</span>
33
+ 366: <span class="ruby-identifier">params</span>[<span class="ruby-constant">Const</span><span class="ruby-operator">::</span><span class="ruby-constant">SERVER_SOFTWARE</span>]=<span class="ruby-constant">Const</span><span class="ruby-operator">::</span><span class="ruby-constant">MONGREL_VERSION</span>
41
34
  367:
42
- 368: <span class="ruby-keyword kw">break</span>
43
- 369: <span class="ruby-keyword kw">else</span>
44
- 370: <span class="ruby-comment cmt"># gotta stream and read again until we can get the parser to be character safe</span>
45
- 371: <span class="ruby-comment cmt"># TODO: make this more efficient since this means we're parsing a lot repeatedly</span>
46
- 372: <span class="ruby-identifier">parser</span>.<span class="ruby-identifier">reset</span>
47
- 373: <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>)
48
- 374: <span class="ruby-keyword kw">end</span>
49
- 375: <span class="ruby-keyword kw">end</span>
50
- 376: <span class="ruby-keyword kw">rescue</span> <span class="ruby-constant">EOFError</span>
51
- 377: <span class="ruby-comment cmt"># ignored</span>
52
- 378: <span class="ruby-keyword kw">rescue</span> <span class="ruby-constant">Errno</span><span class="ruby-operator">::</span><span class="ruby-constant">ECONNRESET</span>
53
- 379: <span class="ruby-comment cmt"># ignored</span>
54
- 380: <span class="ruby-keyword kw">rescue</span> <span class="ruby-constant">Errno</span><span class="ruby-operator">::</span><span class="ruby-constant">EPIPE</span>
55
- 381: <span class="ruby-comment cmt"># ignored</span>
56
- 382: <span class="ruby-keyword kw">rescue</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">details</span>
57
- 383: <span class="ruby-constant">STDERR</span>.<span class="ruby-identifier">puts</span> <span class="ruby-node">&quot;ERROR(#{details.class}): #{details}&quot;</span>
58
- 384: <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>)
59
- 385: <span class="ruby-keyword kw">ensure</span>
60
- 386: <span class="ruby-identifier">client</span>.<span class="ruby-identifier">close</span>
61
- 387: <span class="ruby-keyword kw">end</span>
62
- 388: <span class="ruby-keyword kw">end</span></pre>
35
+ 368: <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>)
36
+ 369: <span class="ruby-identifier">response</span> = <span class="ruby-constant">HttpResponse</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">client</span>)
37
+ 370: <span class="ruby-identifier">handler</span>.<span class="ruby-identifier">process</span>(<span class="ruby-identifier">request</span>, <span class="ruby-identifier">response</span>)
38
+ 371: <span class="ruby-keyword kw">else</span>
39
+ 372: <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>)
40
+ 373: <span class="ruby-keyword kw">end</span>
41
+ 374:
42
+ 375: <span class="ruby-keyword kw">break</span>
43
+ 376: <span class="ruby-keyword kw">else</span>
44
+ 377: <span class="ruby-comment cmt"># gotta stream and read again until we can get the parser to be character safe</span>
45
+ 378: <span class="ruby-comment cmt"># TODO: make this more efficient since this means we're parsing a lot repeatedly</span>
46
+ 379: <span class="ruby-identifier">parser</span>.<span class="ruby-identifier">reset</span>
47
+ 380: <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>)
48
+ 381: <span class="ruby-keyword kw">end</span>
49
+ 382: <span class="ruby-keyword kw">end</span>
50
+ 383: <span class="ruby-keyword kw">rescue</span> <span class="ruby-constant">EOFError</span>
51
+ 384: <span class="ruby-comment cmt"># ignored</span>
52
+ 385: <span class="ruby-keyword kw">rescue</span> <span class="ruby-constant">Errno</span><span class="ruby-operator">::</span><span class="ruby-constant">ECONNRESET</span>
53
+ 386: <span class="ruby-comment cmt"># ignored</span>
54
+ 387: <span class="ruby-keyword kw">rescue</span> <span class="ruby-constant">Errno</span><span class="ruby-operator">::</span><span class="ruby-constant">EPIPE</span>
55
+ 388: <span class="ruby-comment cmt"># ignored</span>
56
+ 389: <span class="ruby-keyword kw">rescue</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">details</span>
57
+ 390: <span class="ruby-constant">STDERR</span>.<span class="ruby-identifier">puts</span> <span class="ruby-node">&quot;ERROR(#{details.class}): #{details}&quot;</span>
58
+ 391: <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>)
59
+ 392: <span class="ruby-keyword kw">ensure</span>
60
+ 393: <span class="ruby-identifier">client</span>.<span class="ruby-identifier">close</span>
61
+ 394: <span class="ruby-keyword kw">end</span>
62
+ 395: <span class="ruby-keyword kw">end</span></pre>
63
63
  </body>
64
64
  </html>
@@ -10,14 +10,14 @@
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 392</span>
14
- 392: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">run</span>
15
- 393: <span class="ruby-constant">BasicSocket</span>.<span class="ruby-identifier">do_not_reverse_lookup</span>=<span class="ruby-keyword kw">true</span>
16
- 394: <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
- 395: <span class="ruby-keyword kw">while</span> <span class="ruby-keyword kw">true</span>
18
- 396: <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>
19
- 397: <span class="ruby-keyword kw">end</span>
20
- 398: <span class="ruby-keyword kw">end</span>
21
- 399: <span class="ruby-keyword kw">end</span></pre>
13
+ <pre> <span class="ruby-comment cmt"># File lib/mongrel.rb, line 399</span>
14
+ 399: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">run</span>
15
+ 400: <span class="ruby-constant">BasicSocket</span>.<span class="ruby-identifier">do_not_reverse_lookup</span>=<span class="ruby-keyword kw">true</span>
16
+ 401: <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
+ 402: <span class="ruby-keyword kw">while</span> <span class="ruby-keyword kw">true</span>
18
+ 403: <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>
19
+ 404: <span class="ruby-keyword kw">end</span>
20
+ 405: <span class="ruby-keyword kw">end</span>
21
+ 406: <span class="ruby-keyword kw">end</span></pre>
22
22
  </body>
23
23
  </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 405</span>
14
- 405: <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
- 406: <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
- 407: <span class="ruby-keyword kw">end</span></pre>
13
+ <pre> <span class="ruby-comment cmt"># File lib/mongrel.rb, line 412</span>
14
+ 412: <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
+ 413: <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
+ 414: <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 411</span>
14
- 411: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">unregister</span>(<span class="ruby-identifier">uri</span>)
15
- 412: <span class="ruby-ivar">@classifier</span>.<span class="ruby-identifier">unregister</span>(<span class="ruby-identifier">uri</span>)
16
- 413: <span class="ruby-keyword kw">end</span></pre>
13
+ <pre> <span class="ruby-comment cmt"># File lib/mongrel.rb, line 418</span>
14
+ 418: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">unregister</span>(<span class="ruby-identifier">uri</span>)
15
+ 419: <span class="ruby-ivar">@classifier</span>.<span class="ruby-identifier">unregister</span>(<span class="ruby-identifier">uri</span>)
16
+ 420: <span class="ruby-keyword kw">end</span></pre>
17
17
  </body>
18
18
  </html>
@@ -1 +1 @@
1
- Sun Feb 12 15:12:16 EST 2006
1
+ Mon Feb 13 18:33:47 EST 2006
@@ -56,7 +56,7 @@
56
56
  </tr>
57
57
  <tr class="top-aligned-row">
58
58
  <td><strong>Last Update:</strong></td>
59
- <td>Sat Feb 11 22:46:26 EST 2006</td>
59
+ <td>Mon Feb 13 18:33:41 EST 2006</td>
60
60
  </tr>
61
61
  </table>
62
62
  </div>
@@ -84,7 +84,7 @@ portability issues.
84
84
  </p>
85
85
  <h2>Status</h2>
86
86
  <p>
87
- The 0.3.1 release support Ruby On Rails much better than previously, and
87
+ The 0.3.2 release supports Ruby On Rails much better than previously, and
88
88
  also sports the beginning of a command and plugin infrastructure. This last
89
89
  part isn&#8217;t documented yet.
90
90
  </p>
@@ -121,6 +121,11 @@ And you can stop it whenever you like with:
121
121
  All of which should be done from your application&#8217;s directory. It
122
122
  writes the PID of the process you ran into log/mongrel.pid.
123
123
  </p>
124
+ <p>
125
+ There are also many more new options for configuring the rails runner
126
+ including changing to a different directory, adding more MIME types, and
127
+ setting processor threads and timeouts.
128
+ </p>
124
129
  <h2>Install</h2>
125
130
  <p>
126
131
  It doesn&#8217;t explicitly require Camping, but if you want to run the
@@ -56,7 +56,7 @@
56
56
  </tr>
57
57
  <tr class="top-aligned-row">
58
58
  <td><strong>Last Update:</strong></td>
59
- <td>Sun Feb 12 00:50:22 EST 2006</td>
59
+ <td>Mon Feb 13 18:04:38 EST 2006</td>
60
60
  </tr>
61
61
  </table>
62
62
  </div>
@@ -21,18 +21,18 @@
21
21
  <h1 class="section-bar">Methods</h1>
22
22
  <div id="index-entries">
23
23
  <a href="classes/Mongrel/HeaderOut.html#M000034">[]= (Mongrel::HeaderOut)</a><br />
24
- <a href="classes/Mongrel.html#M000015">add_mime_type (Mongrel)</a><br />
25
- <a href="classes/Mongrel/DirHandler.html#M000024">can_serve (Mongrel::DirHandler)</a><br />
24
+ <a href="classes/Mongrel/DirHandler.html#M000027">add_mime_type (Mongrel::DirHandler)</a><br />
25
+ <a href="classes/Mongrel/DirHandler.html#M000023">can_serve (Mongrel::DirHandler)</a><br />
26
26
  <a href="classes/PluginFactory.html#M000009">create (PluginFactory)</a><br />
27
27
  <a href="classes/PluginFactory.html#M000008">derivativeClasses (PluginFactory)</a><br />
28
28
  <a href="classes/PluginFactory.html#M000005">derivatives (PluginFactory)</a><br />
29
- <a href="classes/Mongrel/HttpParser.html#M000020">error? (Mongrel::HttpParser)</a><br />
30
- <a href="classes/Mongrel/HttpParser.html#M000019">execute (Mongrel::HttpParser)</a><br />
29
+ <a href="classes/Mongrel/HttpParser.html#M000019">error? (Mongrel::HttpParser)</a><br />
30
+ <a href="classes/Mongrel/HttpParser.html#M000018">execute (Mongrel::HttpParser)</a><br />
31
31
  <a href="classes/PluginFactory.html#M000004">extend_object (PluginFactory)</a><br />
32
32
  <a href="classes/PluginFactory.html#M000006">factoryType (PluginFactory)</a><br />
33
- <a href="classes/Mongrel/HttpParser.html#M000018">finish (Mongrel::HttpParser)</a><br />
33
+ <a href="classes/Mongrel/HttpParser.html#M000017">finish (Mongrel::HttpParser)</a><br />
34
34
  <a href="classes/Mongrel/HttpResponse.html#M000046">finished (Mongrel::HttpResponse)</a><br />
35
- <a href="classes/Mongrel/HttpParser.html#M000021">finished? (Mongrel::HttpParser)</a><br />
35
+ <a href="classes/Mongrel/HttpParser.html#M000020">finished? (Mongrel::HttpParser)</a><br />
36
36
  <a href="classes/PluginFactory.html#M000012">getModuleName (PluginFactory)</a><br />
37
37
  <a href="classes/PluginFactory.html#M000010">getSubclass (PluginFactory)</a><br />
38
38
  <a href="classes/PluginFactory.html#M000003">included (PluginFactory)</a><br />
@@ -40,30 +40,30 @@
40
40
  <a href="classes/PluginFactory.html#M000011">loadDerivative (PluginFactory)</a><br />
41
41
  <a href="classes/PluginFactory.html#M000002">log (PluginFactory)</a><br />
42
42
  <a href="classes/PluginFactory.html#M000014">makeRequirePath (PluginFactory)</a><br />
43
- <a href="classes/FactoryError.html#M000001">new (FactoryError)</a><br />
43
+ <a href="classes/Mongrel/HttpParser.html#M000015">new (Mongrel::HttpParser)</a><br />
44
+ <a href="classes/Mongrel/DirHandler.html#M000022">new (Mongrel::DirHandler)</a><br />
44
45
  <a href="classes/Mongrel/HttpResponse.html#M000040">new (Mongrel::HttpResponse)</a><br />
45
- <a href="classes/Mongrel/DirHandler.html#M000023">new (Mongrel::DirHandler)</a><br />
46
- <a href="classes/Mongrel/HttpParser.html#M000016">new (Mongrel::HttpParser)</a><br />
47
- <a href="classes/Mongrel/HeaderOut.html#M000033">new (Mongrel::HeaderOut)</a><br />
48
46
  <a href="classes/Mongrel/URIClassifier.html#M000035">new (Mongrel::URIClassifier)</a><br />
47
+ <a href="classes/Mongrel/HeaderOut.html#M000033">new (Mongrel::HeaderOut)</a><br />
49
48
  <a href="classes/Mongrel/Error404Handler.html#M000047">new (Mongrel::Error404Handler)</a><br />
49
+ <a href="classes/FactoryError.html#M000001">new (FactoryError)</a><br />
50
50
  <a href="classes/Mongrel/HttpServer.html#M000028">new (Mongrel::HttpServer)</a><br />
51
51
  <a href="classes/Mongrel/HttpRequest.html#M000049">new (Mongrel::HttpRequest)</a><br />
52
- <a href="classes/Mongrel/HttpParser.html#M000022">nread (Mongrel::HttpParser)</a><br />
52
+ <a href="classes/Mongrel/HttpParser.html#M000021">nread (Mongrel::HttpParser)</a><br />
53
53
  <a href="classes/Mongrel/Error404Handler.html#M000048">process (Mongrel::Error404Handler)</a><br />
54
54
  <a href="classes/Mongrel/HttpHandler.html#M000039">process (Mongrel::HttpHandler)</a><br />
55
- <a href="classes/Mongrel/DirHandler.html#M000027">process (Mongrel::DirHandler)</a><br />
55
+ <a href="classes/Mongrel/DirHandler.html#M000026">process (Mongrel::DirHandler)</a><br />
56
56
  <a href="classes/Mongrel/HttpServer.html#M000029">process_client (Mongrel::HttpServer)</a><br />
57
57
  <a href="classes/Mongrel/HttpServer.html#M000031">register (Mongrel::HttpServer)</a><br />
58
58
  <a href="classes/Mongrel/URIClassifier.html#M000036">register (Mongrel::URIClassifier)</a><br />
59
59
  <a href="classes/PluginFactory.html#M000013">requireDerivative (PluginFactory)</a><br />
60
60
  <a href="classes/Mongrel/HttpResponse.html#M000042">reset (Mongrel::HttpResponse)</a><br />
61
- <a href="classes/Mongrel/HttpParser.html#M000017">reset (Mongrel::HttpParser)</a><br />
61
+ <a href="classes/Mongrel/HttpParser.html#M000016">reset (Mongrel::HttpParser)</a><br />
62
62
  <a href="classes/Mongrel/URIClassifier.html#M000038">resolve (Mongrel::URIClassifier)</a><br />
63
63
  <a href="classes/Mongrel/HttpServer.html#M000030">run (Mongrel::HttpServer)</a><br />
64
64
  <a href="classes/Mongrel/HttpResponse.html#M000045">send_body (Mongrel::HttpResponse)</a><br />
65
- <a href="classes/Mongrel/DirHandler.html#M000025">send_dir_listing (Mongrel::DirHandler)</a><br />
66
- <a href="classes/Mongrel/DirHandler.html#M000026">send_file (Mongrel::DirHandler)</a><br />
65
+ <a href="classes/Mongrel/DirHandler.html#M000024">send_dir_listing (Mongrel::DirHandler)</a><br />
66
+ <a href="classes/Mongrel/DirHandler.html#M000025">send_file (Mongrel::DirHandler)</a><br />
67
67
  <a href="classes/Mongrel/HttpResponse.html#M000044">send_header (Mongrel::HttpResponse)</a><br />
68
68
  <a href="classes/Mongrel/HttpResponse.html#M000043">send_status (Mongrel::HttpResponse)</a><br />
69
69
  <a href="classes/Mongrel/HttpResponse.html#M000041">start (Mongrel::HttpResponse)</a><br />
@@ -314,7 +314,7 @@ module Mongrel
314
314
  # try changing it higher. If you find that responses are way too slow
315
315
  # try lowering it (after you've tuned your stuff of course).
316
316
  # Future versions of Mongrel will make this more dynamic (hopefully).
317
- def initialize(host, port, num_processors=20)
317
+ def initialize(host, port, num_processors=20, timeout=120)
318
318
  @socket = TCPServer.new(host, port)
319
319
 
320
320
  @classifier = URIClassifier.new
@@ -322,10 +322,17 @@ module Mongrel
322
322
  @host = host
323
323
  @port = port
324
324
  @num_processors = num_processors
325
+ @timeout = timeout
325
326
 
326
327
  @num_processors.times {|i| Thread.new do
327
328
  while client = @req_queue.deq
328
- process_client(client)
329
+ begin
330
+ Timeout.timeout(@timeout) do
331
+ process_client(client)
332
+ end
333
+ rescue Timeout::Error
334
+ STDERR.puts "WARNING: Request took longer than #@timeout second timeout"
335
+ end
329
336
  end
330
337
  end
331
338
  }
@@ -540,7 +547,7 @@ module Mongrel
540
547
  end
541
548
  end
542
549
 
543
- open(req, "r") do |f|
550
+ open(req, "rb") do |f|
544
551
  out.write(f.read)
545
552
  end
546
553
  end
@@ -572,12 +579,14 @@ module Mongrel
572
579
  end
573
580
  end
574
581
  end
575
- end
576
582
 
583
+ # There is a small number of default mime types for extensions, but
584
+ # this lets you add any others you'll need when serving content.
585
+ def DirHandler::add_mime_type(extension, type)
586
+ MIME_TYPES[extension] = type
587
+ end
577
588
 
578
- # There is a small number of default mime types for extensions, but
579
- # this lets you add any others you'll need when serving content.
580
- def add_mime_type(extension, type)
581
- MIME_TYPES[extension] = type
582
589
  end
590
+
591
+
583
592
  end