mongrel 0.2.0
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.
- data/COPYING +504 -0
- data/LICENSE +504 -0
- data/README +117 -0
- data/Rakefile +30 -0
- data/doc/rdoc/classes/Mongrel.html +144 -0
- data/doc/rdoc/classes/Mongrel/Error404Handler.html +171 -0
- data/doc/rdoc/classes/Mongrel/Error404Handler.src/M000023.html +18 -0
- data/doc/rdoc/classes/Mongrel/Error404Handler.src/M000024.html +18 -0
- data/doc/rdoc/classes/Mongrel/HeaderOut.html +167 -0
- data/doc/rdoc/classes/Mongrel/HeaderOut.src/M000013.html +18 -0
- data/doc/rdoc/classes/Mongrel/HeaderOut.src/M000014.html +21 -0
- data/doc/rdoc/classes/Mongrel/HttpHandler.html +159 -0
- data/doc/rdoc/classes/Mongrel/HttpHandler.src/M000019.html +17 -0
- data/doc/rdoc/classes/Mongrel/HttpParser.html +271 -0
- data/doc/rdoc/classes/Mongrel/HttpParser.src/M000001.html +28 -0
- data/doc/rdoc/classes/Mongrel/HttpParser.src/M000002.html +29 -0
- data/doc/rdoc/classes/Mongrel/HttpParser.src/M000003.html +29 -0
- data/doc/rdoc/classes/Mongrel/HttpParser.src/M000004.html +41 -0
- data/doc/rdoc/classes/Mongrel/HttpParser.src/M000005.html +27 -0
- data/doc/rdoc/classes/Mongrel/HttpParser.src/M000006.html +27 -0
- data/doc/rdoc/classes/Mongrel/HttpParser.src/M000007.html +28 -0
- data/doc/rdoc/classes/Mongrel/HttpRequest.html +177 -0
- data/doc/rdoc/classes/Mongrel/HttpRequest.src/M000025.html +30 -0
- data/doc/rdoc/classes/Mongrel/HttpResponse.html +202 -0
- data/doc/rdoc/classes/Mongrel/HttpResponse.src/M000020.html +21 -0
- data/doc/rdoc/classes/Mongrel/HttpResponse.src/M000021.html +20 -0
- data/doc/rdoc/classes/Mongrel/HttpResponse.src/M000022.html +25 -0
- data/doc/rdoc/classes/Mongrel/HttpServer.html +336 -0
- data/doc/rdoc/classes/Mongrel/HttpServer.src/M000008.html +26 -0
- data/doc/rdoc/classes/Mongrel/HttpServer.src/M000009.html +58 -0
- data/doc/rdoc/classes/Mongrel/HttpServer.src/M000010.html +22 -0
- data/doc/rdoc/classes/Mongrel/HttpServer.src/M000011.html +18 -0
- data/doc/rdoc/classes/Mongrel/HttpServer.src/M000012.html +18 -0
- data/doc/rdoc/classes/Mongrel/URIClassifier.html +257 -0
- data/doc/rdoc/classes/Mongrel/URIClassifier.src/M000015.html +54 -0
- data/doc/rdoc/classes/Mongrel/URIClassifier.src/M000016.html +50 -0
- data/doc/rdoc/classes/Mongrel/URIClassifier.src/M000017.html +36 -0
- data/doc/rdoc/classes/Mongrel/URIClassifier.src/M000018.html +73 -0
- data/doc/rdoc/created.rid +1 -0
- data/doc/rdoc/files/COPYING.html +756 -0
- data/doc/rdoc/files/LICENSE.html +756 -0
- data/doc/rdoc/files/README.html +273 -0
- data/doc/rdoc/files/ext/http11/http11_c.html +101 -0
- data/doc/rdoc/files/lib/mongrel_rb.html +111 -0
- data/doc/rdoc/fr_class_index.html +35 -0
- data/doc/rdoc/fr_file_index.html +31 -0
- data/doc/rdoc/fr_method_index.html +51 -0
- data/doc/rdoc/index.html +24 -0
- data/doc/rdoc/rdoc-style.css +208 -0
- data/examples/camping/blog.rb +300 -0
- data/examples/camping/tepee.rb +168 -0
- data/examples/simpletest.rb +16 -0
- data/examples/webrick_compare.rb +20 -0
- data/ext/http11/MANIFEST +0 -0
- data/ext/http11/ext_help.h +14 -0
- data/ext/http11/extconf.rb +6 -0
- data/ext/http11/http11.c +436 -0
- data/ext/http11/http11_parser.c +918 -0
- data/ext/http11/http11_parser.h +37 -0
- data/ext/http11/tst.h +40 -0
- data/ext/http11/tst_cleanup.c +24 -0
- data/ext/http11/tst_delete.c +146 -0
- data/ext/http11/tst_grow_node_free_list.c +38 -0
- data/ext/http11/tst_init.c +41 -0
- data/ext/http11/tst_insert.c +192 -0
- data/ext/http11/tst_search.c +54 -0
- data/lib/mongrel.rb +298 -0
- data/setup.rb +1360 -0
- data/test/test_http11.rb +38 -0
- data/test/test_response.rb +44 -0
- data/test/test_uriclassifier.rb +104 -0
- data/test/test_ws.rb +33 -0
- data/tools/rakehelp.rb +99 -0
- metadata +132 -0
@@ -0,0 +1,21 @@
|
|
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::HttpResponse)</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 108</span>
|
14
|
+
108: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">initialize</span>(<span class="ruby-identifier">socket</span>)
|
15
|
+
109: <span class="ruby-ivar">@socket</span> = <span class="ruby-identifier">socket</span>
|
16
|
+
110: <span class="ruby-ivar">@body</span> = <span class="ruby-constant">StringIO</span>.<span class="ruby-identifier">new</span>
|
17
|
+
111: <span class="ruby-ivar">@status</span> = <span class="ruby-value">404</span>
|
18
|
+
112: <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
|
+
113: <span class="ruby-keyword kw">end</span></pre>
|
20
|
+
</body>
|
21
|
+
</html>
|
@@ -0,0 +1,20 @@
|
|
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>start (Mongrel::HttpResponse)</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 115</span>
|
14
|
+
115: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">start</span>(<span class="ruby-identifier">status</span>=<span class="ruby-value">200</span>)
|
15
|
+
116: <span class="ruby-ivar">@status</span> = <span class="ruby-identifier">status</span>
|
16
|
+
117: <span class="ruby-keyword kw">yield</span> <span class="ruby-ivar">@header</span>, <span class="ruby-ivar">@body</span>
|
17
|
+
118: <span class="ruby-identifier">finished</span>
|
18
|
+
119: <span class="ruby-keyword kw">end</span></pre>
|
19
|
+
</body>
|
20
|
+
</html>
|
@@ -0,0 +1,25 @@
|
|
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>finished (Mongrel::HttpResponse)</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 121</span>
|
14
|
+
121: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">finished</span>
|
15
|
+
122: <span class="ruby-ivar">@header</span>.<span class="ruby-identifier">out</span>.<span class="ruby-identifier">rewind</span>
|
16
|
+
123: <span class="ruby-ivar">@body</span>.<span class="ruby-identifier">rewind</span>
|
17
|
+
124:
|
18
|
+
125: <span class="ruby-comment cmt"># connection: close is also added to ensure that the client does not pipeline.</span>
|
19
|
+
126: <span class="ruby-ivar">@socket</span>.<span class="ruby-identifier">write</span>(<span class="ruby-node">"HTTP/1.1 #{@status} #{HTTP_STATUS_CODES[@status]}\r\nContent-Length: #{@body.length}\r\nConnection: close\r\n"</span>)
|
20
|
+
127: <span class="ruby-ivar">@socket</span>.<span class="ruby-identifier">write</span>(<span class="ruby-ivar">@header</span>.<span class="ruby-identifier">out</span>.<span class="ruby-identifier">read</span>)
|
21
|
+
128: <span class="ruby-ivar">@socket</span>.<span class="ruby-identifier">write</span>(<span class="ruby-value str">"\r\n"</span>)
|
22
|
+
129: <span class="ruby-ivar">@socket</span>.<span class="ruby-identifier">write</span>(<span class="ruby-ivar">@body</span>.<span class="ruby-identifier">read</span>)
|
23
|
+
130: <span class="ruby-keyword kw">end</span></pre>
|
24
|
+
</body>
|
25
|
+
</html>
|
@@ -0,0 +1,336 @@
|
|
1
|
+
<?xml version="1.0" encoding="iso-8859-1"?>
|
2
|
+
<!DOCTYPE html
|
3
|
+
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
4
|
+
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
5
|
+
|
6
|
+
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
7
|
+
<head>
|
8
|
+
<title>Class: Mongrel::HttpServer</title>
|
9
|
+
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
|
10
|
+
<meta http-equiv="Content-Script-Type" content="text/javascript" />
|
11
|
+
<link rel="stylesheet" href="../.././rdoc-style.css" type="text/css" media="screen" />
|
12
|
+
<script type="text/javascript">
|
13
|
+
// <![CDATA[
|
14
|
+
|
15
|
+
function popupCode( url ) {
|
16
|
+
window.open(url, "Code", "resizable=yes,scrollbars=yes,toolbar=no,status=no,height=150,width=400")
|
17
|
+
}
|
18
|
+
|
19
|
+
function toggleCode( id ) {
|
20
|
+
if ( document.getElementById )
|
21
|
+
elem = document.getElementById( id );
|
22
|
+
else if ( document.all )
|
23
|
+
elem = eval( "document.all." + id );
|
24
|
+
else
|
25
|
+
return false;
|
26
|
+
|
27
|
+
elemStyle = elem.style;
|
28
|
+
|
29
|
+
if ( elemStyle.display != "block" ) {
|
30
|
+
elemStyle.display = "block"
|
31
|
+
} else {
|
32
|
+
elemStyle.display = "none"
|
33
|
+
}
|
34
|
+
|
35
|
+
return true;
|
36
|
+
}
|
37
|
+
|
38
|
+
// Make codeblocks hidden by default
|
39
|
+
document.writeln( "<style type=\"text/css\">div.method-source-code { display: none }</style>" )
|
40
|
+
|
41
|
+
// ]]>
|
42
|
+
</script>
|
43
|
+
|
44
|
+
</head>
|
45
|
+
<body>
|
46
|
+
|
47
|
+
|
48
|
+
|
49
|
+
<div id="classHeader">
|
50
|
+
<table class="header-table">
|
51
|
+
<tr class="top-aligned-row">
|
52
|
+
<td><strong>Class</strong></td>
|
53
|
+
<td class="class-name-in-header">Mongrel::HttpServer</td>
|
54
|
+
</tr>
|
55
|
+
<tr class="top-aligned-row">
|
56
|
+
<td><strong>In:</strong></td>
|
57
|
+
<td>
|
58
|
+
<a href="../../files/lib/mongrel_rb.html">
|
59
|
+
lib/mongrel.rb
|
60
|
+
</a>
|
61
|
+
<br />
|
62
|
+
</td>
|
63
|
+
</tr>
|
64
|
+
|
65
|
+
<tr class="top-aligned-row">
|
66
|
+
<td><strong>Parent:</strong></td>
|
67
|
+
<td>
|
68
|
+
Object
|
69
|
+
</td>
|
70
|
+
</tr>
|
71
|
+
</table>
|
72
|
+
</div>
|
73
|
+
<!-- banner header -->
|
74
|
+
|
75
|
+
<div id="bodyContent">
|
76
|
+
|
77
|
+
|
78
|
+
|
79
|
+
<div id="contextContent">
|
80
|
+
|
81
|
+
<div id="description">
|
82
|
+
<p>
|
83
|
+
This is the main driver of <a href="../Mongrel.html">Mongrel</a>, while the
|
84
|
+
Mognrel::HttpParser and <a
|
85
|
+
href="URIClassifier.html">Mongrel::URIClassifier</a> make up the majority
|
86
|
+
of how the server functions. It’s a very simple class that just has a
|
87
|
+
thread accepting connections and a simple <a
|
88
|
+
href="HttpServer.html#M000009">HttpServer.process_client</a> function to do
|
89
|
+
the heavy lifting with the IO and Ruby.
|
90
|
+
</p>
|
91
|
+
<p>
|
92
|
+
You use it by doing the following:
|
93
|
+
</p>
|
94
|
+
<pre>
|
95
|
+
server = HttpServer.new("0.0.0.0", 3000)
|
96
|
+
server.register("/stuff", MyNifterHandler.new)
|
97
|
+
server.run.join
|
98
|
+
</pre>
|
99
|
+
<p>
|
100
|
+
The last line can be just server.run if you don’t want to join the
|
101
|
+
thread used. If you don’t though Ruby will mysteriously just exit on
|
102
|
+
you.
|
103
|
+
</p>
|
104
|
+
<p>
|
105
|
+
Ruby’s thread implementation is "interesting" to say the
|
106
|
+
least. Experiments with <b>many</b> different types of IO processing simply
|
107
|
+
cannot make a dent in it. Future releases of <a
|
108
|
+
href="../Mongrel.html">Mongrel</a> will find other creative ways to make
|
109
|
+
threads faster, but don’t hold your breath until Ruby 1.9 is actually
|
110
|
+
finally useful.
|
111
|
+
</p>
|
112
|
+
|
113
|
+
</div>
|
114
|
+
|
115
|
+
|
116
|
+
</div>
|
117
|
+
|
118
|
+
<div id="method-list">
|
119
|
+
<h3 class="section-bar">Methods</h3>
|
120
|
+
|
121
|
+
<div class="name-list">
|
122
|
+
<a href="#M000008">new</a>
|
123
|
+
<a href="#M000009">process_client</a>
|
124
|
+
<a href="#M000011">register</a>
|
125
|
+
<a href="#M000010">run</a>
|
126
|
+
<a href="#M000012">unregister</a>
|
127
|
+
</div>
|
128
|
+
</div>
|
129
|
+
|
130
|
+
</div>
|
131
|
+
|
132
|
+
|
133
|
+
<!-- if includes -->
|
134
|
+
|
135
|
+
<div id="section">
|
136
|
+
|
137
|
+
|
138
|
+
<div id="constants-list">
|
139
|
+
<h3 class="section-bar">Constants</h3>
|
140
|
+
|
141
|
+
<div class="name-list">
|
142
|
+
<table summary="Constants">
|
143
|
+
<tr class="top-aligned-row context-row">
|
144
|
+
<td class="context-item-name">ERROR_404_RESPONSE</td>
|
145
|
+
<td>=</td>
|
146
|
+
<td class="context-item-value">"HTTP/1.1 404 Not Found\r\nConnection: close\r\nServer: Mongrel/0.2\r\n\r\nNOT FOUND"</td>
|
147
|
+
<td width="3em"> </td>
|
148
|
+
<td class="context-item-desc">
|
149
|
+
The standard empty 404 response for bad requests. Use Error4040Handler for
|
150
|
+
custom stuff.
|
151
|
+
|
152
|
+
</td>
|
153
|
+
</tr>
|
154
|
+
<tr class="top-aligned-row context-row">
|
155
|
+
<td class="context-item-name">ERROR_503_RESPONSE</td>
|
156
|
+
<td>=</td>
|
157
|
+
<td class="context-item-value">"HTTP/1.1 503 Service Unavailable\r\n\r\nBUSY"</td>
|
158
|
+
</tr>
|
159
|
+
<tr class="top-aligned-row context-row">
|
160
|
+
<td class="context-item-name">CHUNK_SIZE</td>
|
161
|
+
<td>=</td>
|
162
|
+
<td class="context-item-value">(16 * 1024)</td>
|
163
|
+
<td width="3em"> </td>
|
164
|
+
<td class="context-item-desc">
|
165
|
+
The basic max request size we’ll try to read.
|
166
|
+
|
167
|
+
</td>
|
168
|
+
</tr>
|
169
|
+
<tr class="top-aligned-row context-row">
|
170
|
+
<td class="context-item-name">PATH_INFO</td>
|
171
|
+
<td>=</td>
|
172
|
+
<td class="context-item-value">"PATH_INFO"</td>
|
173
|
+
</tr>
|
174
|
+
<tr class="top-aligned-row context-row">
|
175
|
+
<td class="context-item-name">SCRIPT_NAME</td>
|
176
|
+
<td>=</td>
|
177
|
+
<td class="context-item-value">"SCRIPT_NAME"</td>
|
178
|
+
</tr>
|
179
|
+
</table>
|
180
|
+
</div>
|
181
|
+
</div>
|
182
|
+
|
183
|
+
|
184
|
+
|
185
|
+
<div id="attribute-list">
|
186
|
+
<h3 class="section-bar">Attributes</h3>
|
187
|
+
|
188
|
+
<div class="name-list">
|
189
|
+
<table>
|
190
|
+
<tr class="top-aligned-row context-row">
|
191
|
+
<td class="context-item-name">acceptor</td>
|
192
|
+
<td class="context-item-value"> [R] </td>
|
193
|
+
<td class="context-item-desc"></td>
|
194
|
+
</tr>
|
195
|
+
</table>
|
196
|
+
</div>
|
197
|
+
</div>
|
198
|
+
|
199
|
+
|
200
|
+
|
201
|
+
<!-- if method_list -->
|
202
|
+
<div id="methods">
|
203
|
+
<h3 class="section-bar">Public Class methods</h3>
|
204
|
+
|
205
|
+
<div id="method-M000008" class="method-detail">
|
206
|
+
<a name="M000008"></a>
|
207
|
+
|
208
|
+
<div class="method-heading">
|
209
|
+
<a href="HttpServer.src/M000008.html" target="Code" class="method-signature"
|
210
|
+
onclick="popupCode('HttpServer.src/M000008.html');return false;">
|
211
|
+
<span class="method-name">new</span><span class="method-args">(host, port, num_processors=20)</span>
|
212
|
+
</a>
|
213
|
+
</div>
|
214
|
+
|
215
|
+
<div class="method-description">
|
216
|
+
<p>
|
217
|
+
Creates a working server on host:port (strange things happen if port
|
218
|
+
isn’t a Number). Use HttpServer::run to start the server.
|
219
|
+
</p>
|
220
|
+
<p>
|
221
|
+
The num_processors variable has varying affects on how requests are
|
222
|
+
processed. You‘d think adding more processing threads (processors)
|
223
|
+
would make the server faster, but that’s just not true. There’s
|
224
|
+
actually an effect of how Ruby does threads such that the more processors
|
225
|
+
waiting on the request queue, the slower the system is to handle each
|
226
|
+
request. But, the lower the number of processors the fewer concurrent
|
227
|
+
responses the server can make.
|
228
|
+
</p>
|
229
|
+
<p>
|
230
|
+
20 is the default number of processors and is based on experimentation on a
|
231
|
+
few systems. If you find that you overload <a
|
232
|
+
href="../Mongrel.html">Mongrel</a> too much try changing it higher. If you
|
233
|
+
find that responses are way too slow try lowering it (after you’ve
|
234
|
+
tuned your stuff of course). Future versions of <a
|
235
|
+
href="../Mongrel.html">Mongrel</a> will make this more dynamic (hopefully).
|
236
|
+
</p>
|
237
|
+
</div>
|
238
|
+
</div>
|
239
|
+
|
240
|
+
<h3 class="section-bar">Public Instance methods</h3>
|
241
|
+
|
242
|
+
<div id="method-M000009" class="method-detail">
|
243
|
+
<a name="M000009"></a>
|
244
|
+
|
245
|
+
<div class="method-heading">
|
246
|
+
<a href="HttpServer.src/M000009.html" target="Code" class="method-signature"
|
247
|
+
onclick="popupCode('HttpServer.src/M000009.html');return false;">
|
248
|
+
<span class="method-name">process_client</span><span class="method-args">(client)</span>
|
249
|
+
</a>
|
250
|
+
</div>
|
251
|
+
|
252
|
+
<div class="method-description">
|
253
|
+
<p>
|
254
|
+
Does the majority of the IO processing. It has been written in Ruby using
|
255
|
+
about 7 different IO processing strategies and no matter how it’s
|
256
|
+
done the performance just does not improve. Ruby’s use of select to
|
257
|
+
implement threads means that it will most likely never improve, so the only
|
258
|
+
remaining approach is to write all or some of this function in C. That will
|
259
|
+
be the focus of future releases.
|
260
|
+
</p>
|
261
|
+
</div>
|
262
|
+
</div>
|
263
|
+
|
264
|
+
<div id="method-M000011" class="method-detail">
|
265
|
+
<a name="M000011"></a>
|
266
|
+
|
267
|
+
<div class="method-heading">
|
268
|
+
<a href="HttpServer.src/M000011.html" target="Code" class="method-signature"
|
269
|
+
onclick="popupCode('HttpServer.src/M000011.html');return false;">
|
270
|
+
<span class="method-name">register</span><span class="method-args">(uri, handler)</span>
|
271
|
+
</a>
|
272
|
+
</div>
|
273
|
+
|
274
|
+
<div class="method-description">
|
275
|
+
<p>
|
276
|
+
Simply registers a handler with the internal <a
|
277
|
+
href="URIClassifier.html">URIClassifier</a>. When the URI is found in the
|
278
|
+
prefix of a request then your handler’s HttpHandler::process method
|
279
|
+
is called. See <a
|
280
|
+
href="URIClassifier.html#M000016">Mongrel::URIClassifier#register</a> for
|
281
|
+
more information.
|
282
|
+
</p>
|
283
|
+
</div>
|
284
|
+
</div>
|
285
|
+
|
286
|
+
<div id="method-M000010" class="method-detail">
|
287
|
+
<a name="M000010"></a>
|
288
|
+
|
289
|
+
<div class="method-heading">
|
290
|
+
<a href="HttpServer.src/M000010.html" target="Code" class="method-signature"
|
291
|
+
onclick="popupCode('HttpServer.src/M000010.html');return false;">
|
292
|
+
<span class="method-name">run</span><span class="method-args">()</span>
|
293
|
+
</a>
|
294
|
+
</div>
|
295
|
+
|
296
|
+
<div class="method-description">
|
297
|
+
<p>
|
298
|
+
Runs the thing. It returns the thread used so you can "join" it.
|
299
|
+
You can also access the HttpServer::acceptor attribute to get the thread
|
300
|
+
later.
|
301
|
+
</p>
|
302
|
+
</div>
|
303
|
+
</div>
|
304
|
+
|
305
|
+
<div id="method-M000012" class="method-detail">
|
306
|
+
<a name="M000012"></a>
|
307
|
+
|
308
|
+
<div class="method-heading">
|
309
|
+
<a href="HttpServer.src/M000012.html" target="Code" class="method-signature"
|
310
|
+
onclick="popupCode('HttpServer.src/M000012.html');return false;">
|
311
|
+
<span class="method-name">unregister</span><span class="method-args">(uri)</span>
|
312
|
+
</a>
|
313
|
+
</div>
|
314
|
+
|
315
|
+
<div class="method-description">
|
316
|
+
<p>
|
317
|
+
Removes any handler registered at the given URI. See <a
|
318
|
+
href="URIClassifier.html#M000017">Mongrel::URIClassifier#unregister</a> for
|
319
|
+
more information.
|
320
|
+
</p>
|
321
|
+
</div>
|
322
|
+
</div>
|
323
|
+
|
324
|
+
|
325
|
+
</div>
|
326
|
+
|
327
|
+
|
328
|
+
</div>
|
329
|
+
|
330
|
+
|
331
|
+
<div id="validator-badges">
|
332
|
+
<p><small><a href="http://validator.w3.org/check/referer">[Validate]</a></small></p>
|
333
|
+
</div>
|
334
|
+
|
335
|
+
</body>
|
336
|
+
</html>
|
@@ -0,0 +1,26 @@
|
|
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 211</span>
|
14
|
+
211: <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>)
|
15
|
+
212: <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
|
+
213: <span class="ruby-ivar">@classifier</span> = <span class="ruby-constant">URIClassifier</span>.<span class="ruby-identifier">new</span>
|
17
|
+
214: <span class="ruby-ivar">@req_queue</span> = <span class="ruby-constant">Queue</span>.<span class="ruby-identifier">new</span>
|
18
|
+
215: <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> <span class="ruby-constant">Thread</span>.<span class="ruby-identifier">new</span> <span class="ruby-keyword kw">do</span>
|
19
|
+
216: <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>
|
20
|
+
217: <span class="ruby-identifier">process_client</span>(<span class="ruby-identifier">client</span>)
|
21
|
+
218: <span class="ruby-keyword kw">end</span>
|
22
|
+
219: <span class="ruby-keyword kw">end</span>
|
23
|
+
220: }
|
24
|
+
221: <span class="ruby-keyword kw">end</span></pre>
|
25
|
+
</body>
|
26
|
+
</html>
|
@@ -0,0 +1,58 @@
|
|
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 230</span>
|
14
|
+
230: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">process_client</span>(<span class="ruby-identifier">client</span>)
|
15
|
+
231: <span class="ruby-keyword kw">begin</span>
|
16
|
+
232: <span class="ruby-identifier">parser</span> = <span class="ruby-constant">HttpParser</span>.<span class="ruby-identifier">new</span>
|
17
|
+
233: <span class="ruby-identifier">params</span> = {}
|
18
|
+
234: <span class="ruby-identifier">data</span> = <span class="ruby-identifier">client</span>.<span class="ruby-identifier">readpartial</span>(<span class="ruby-constant">CHUNK_SIZE</span>)
|
19
|
+
235:
|
20
|
+
236: <span class="ruby-keyword kw">while</span> <span class="ruby-keyword kw">true</span>
|
21
|
+
237: <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
|
+
238: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">parser</span>.<span class="ruby-identifier">finished?</span>
|
23
|
+
239: <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">PATH_INFO</span>])
|
24
|
+
240:
|
25
|
+
241: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">handler</span>
|
26
|
+
242: <span class="ruby-identifier">params</span>[<span class="ruby-constant">PATH_INFO</span>] = <span class="ruby-identifier">path_info</span>
|
27
|
+
243: <span class="ruby-identifier">params</span>[<span class="ruby-constant">SCRIPT_NAME</span>] = <span class="ruby-identifier">script_name</span>
|
28
|
+
244:
|
29
|
+
245: <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>)
|
30
|
+
246: <span class="ruby-identifier">response</span> = <span class="ruby-constant">HttpResponse</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">client</span>)
|
31
|
+
247: <span class="ruby-identifier">handler</span>.<span class="ruby-identifier">process</span>(<span class="ruby-identifier">request</span>, <span class="ruby-identifier">response</span>)
|
32
|
+
248: <span class="ruby-keyword kw">else</span>
|
33
|
+
249: <span class="ruby-identifier">client</span>.<span class="ruby-identifier">write</span>(<span class="ruby-constant">ERROR_404_RESPONSE</span>)
|
34
|
+
250: <span class="ruby-keyword kw">end</span>
|
35
|
+
251:
|
36
|
+
252: <span class="ruby-keyword kw">break</span>
|
37
|
+
253: <span class="ruby-keyword kw">else</span>
|
38
|
+
254: <span class="ruby-comment cmt"># gotta stream and read again until we can get the parser to be character safe</span>
|
39
|
+
255: <span class="ruby-comment cmt"># TODO: make this more efficient since this means we're parsing a lot repeatedly</span>
|
40
|
+
256: <span class="ruby-identifier">parser</span>.<span class="ruby-identifier">reset</span>
|
41
|
+
257: <span class="ruby-identifier">data</span> <span class="ruby-operator"><<</span> <span class="ruby-identifier">client</span>.<span class="ruby-identifier">readpartial</span>(<span class="ruby-constant">CHUNK_SIZE</span>)
|
42
|
+
258: <span class="ruby-keyword kw">end</span>
|
43
|
+
259: <span class="ruby-keyword kw">end</span>
|
44
|
+
260: <span class="ruby-keyword kw">rescue</span> <span class="ruby-constant">EOFError</span>
|
45
|
+
261: <span class="ruby-comment cmt"># ignored</span>
|
46
|
+
262: <span class="ruby-keyword kw">rescue</span> <span class="ruby-constant">Errno</span><span class="ruby-operator">::</span><span class="ruby-constant">ECONNRESET</span>
|
47
|
+
263: <span class="ruby-comment cmt"># ignored</span>
|
48
|
+
264: <span class="ruby-keyword kw">rescue</span> <span class="ruby-constant">Errno</span><span class="ruby-operator">::</span><span class="ruby-constant">EPIPE</span>
|
49
|
+
265: <span class="ruby-comment cmt"># ignored</span>
|
50
|
+
266: <span class="ruby-keyword kw">rescue</span> =<span class="ruby-operator">></span> <span class="ruby-identifier">details</span>
|
51
|
+
267: <span class="ruby-constant">STDERR</span>.<span class="ruby-identifier">puts</span> <span class="ruby-node">"ERROR(#{details.class}): #{details}"</span>
|
52
|
+
268: <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">"\n"</span>)
|
53
|
+
269: <span class="ruby-keyword kw">ensure</span>
|
54
|
+
270: <span class="ruby-identifier">client</span>.<span class="ruby-identifier">close</span>
|
55
|
+
271: <span class="ruby-keyword kw">end</span>
|
56
|
+
272: <span class="ruby-keyword kw">end</span></pre>
|
57
|
+
</body>
|
58
|
+
</html>
|