serverside 0.2.6 → 0.2.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (43) hide show
  1. data/CHANGELOG +22 -16
  2. data/Rakefile +11 -4
  3. data/bin/serverside +1 -1
  4. data/doc/rdoc/classes/Daemon.html +4 -4
  5. data/doc/rdoc/classes/ServerSide.html +10 -10
  6. data/doc/rdoc/classes/ServerSide/HTTP.html +5 -6
  7. data/doc/rdoc/classes/ServerSide/HTTP/Connection.html +24 -22
  8. data/doc/rdoc/classes/ServerSide/HTTP/Request.html +367 -121
  9. data/doc/rdoc/classes/ServerSide/Router.html +58 -58
  10. data/doc/rdoc/classes/ServerSide/StaticFiles.html +60 -49
  11. data/doc/rdoc/classes/ServerSide/StaticFiles/Const.html +12 -2
  12. data/doc/rdoc/classes/ServerSide/Template.html +12 -12
  13. data/doc/rdoc/created.rid +1 -1
  14. data/doc/rdoc/files/CHANGELOG.html +36 -31
  15. data/doc/rdoc/files/COPYING.html +1 -1
  16. data/doc/rdoc/files/README.html +1 -1
  17. data/doc/rdoc/files/lib/serverside/application_rb.html +1 -1
  18. data/doc/rdoc/files/lib/serverside/cluster_rb.html +1 -1
  19. data/doc/rdoc/files/lib/serverside/connection_rb.html +1 -1
  20. data/doc/rdoc/files/lib/serverside/core_ext_rb.html +1 -1
  21. data/doc/rdoc/files/lib/serverside/daemon_rb.html +1 -1
  22. data/doc/rdoc/files/lib/serverside/request_rb.html +8 -1
  23. data/doc/rdoc/files/lib/serverside/routing_rb.html +1 -1
  24. data/doc/rdoc/files/lib/serverside/server_rb.html +1 -1
  25. data/doc/rdoc/files/lib/serverside/static_rb.html +8 -1
  26. data/doc/rdoc/files/lib/serverside/template_rb.html +1 -1
  27. data/doc/rdoc/files/lib/serverside_rb.html +1 -1
  28. data/doc/rdoc/fr_class_index.html +0 -1
  29. data/doc/rdoc/fr_method_index.html +21 -20
  30. data/lib/serverside/connection.rb +6 -4
  31. data/lib/serverside/request.rb +101 -61
  32. data/lib/serverside/static.rb +22 -7
  33. data/test/functional/request_body_test.rb +93 -0
  34. data/test/functional/routing_server.rb +5 -5
  35. data/test/functional/routing_server_test.rb +3 -3
  36. data/test/spec/connection_spec.rb +61 -0
  37. data/test/spec/core_ext_spec.rb +20 -1
  38. data/test/unit/connection_test.rb +9 -9
  39. data/test/unit/request_test.rb +55 -55
  40. data/test/unit/server_test.rb +1 -1
  41. data/test/unit/static_test.rb +24 -25
  42. metadata +60 -60
  43. data/doc/rdoc/classes/ServerSide/HTTP/Const.html +0 -257
data/CHANGELOG CHANGED
@@ -1,4 +1,22 @@
1
- *SVN*
1
+ ==0.2.7
2
+
3
+ * Wrote spec for HTTP::Connection.
4
+
5
+ * Added spec files to rake stats reporting.
6
+
7
+ * Changed @conn to @socket in both HTTP::Connection and HTTP::Request for better readability.
8
+
9
+ * Wrote functional test for request body (but at least some of the testing should be in a unit test.)
10
+
11
+ * Added request body parsing (both URL-encoded and multipart.)
12
+
13
+ * Moved all HTTP::Const constants into HTTP::Request.
14
+
15
+ * Added Date to response headers. This is needed for caching to work correctly.
16
+
17
+ * Fixed bug in serverside script that caused an exception when specifying port number.
18
+
19
+ ==0.2.6
2
20
 
3
21
  * Refactored HTTP-related code into a new HTTP::Request class and a simplified HTTP::Connection.
4
22
 
@@ -8,7 +26,7 @@
8
26
 
9
27
  * Fixed minor documentation error.
10
28
 
11
- *0.2.5*
29
+ ==0.2.5
12
30
 
13
31
  * Added template serving to static file module.
14
32
 
@@ -30,7 +48,7 @@
30
48
 
31
49
  * Added /test/spec directory.
32
50
 
33
- *0.2.0*
51
+ ==0.2.0
34
52
 
35
53
  * Updated RFuzz script to work, but it doesn't still do anything interesting.
36
54
 
@@ -96,25 +114,15 @@
96
114
 
97
115
  * Added HTTP parsing code with unit tests.
98
116
 
99
- * Started adding request code.
100
-
101
117
  * More unit tests for application code.
102
118
 
103
119
  * Basic server code works with unit tests.
104
120
 
105
- * Started work on application code.
106
-
107
121
  * Added option parsing to serverside script.
108
122
 
109
123
  * Added daemon code and unit tests.
110
124
 
111
- * Created serverside script.
112
-
113
- * Created Gem spec.
114
-
115
- * Created directory structure.
116
-
117
- *Mongrel-based branch*
125
+ ==0.1
118
126
 
119
127
  * Added host attribute to Controller::Request.
120
128
 
@@ -149,5 +157,3 @@
149
157
  * Imported extensions from Reality project.
150
158
 
151
159
  * Implemented daemon and server cluster.
152
-
153
- * Basic configuration infrastructure is ready.
data/Rakefile CHANGED
@@ -7,7 +7,7 @@ require 'fileutils'
7
7
  include FileUtils
8
8
 
9
9
  NAME = "serverside"
10
- VERS = "0.2.6"
10
+ VERS = "0.2.7"
11
11
  CLEAN.include ['**/.*.sw?', '*.gem', '.config']
12
12
  RDOC_OPTS = ['--quiet', '--title', "ServerSide Documentation",
13
13
  "--opname", "index.html",
@@ -109,14 +109,21 @@ task :aok do
109
109
  sh %{rake spec}
110
110
  end
111
111
 
112
+ desc 'Update docs and upload to rubyforge.org'
113
+ task :doc_rforge do
114
+ sh %{rake doc}
115
+ sh "scp -C -r * ciconia@rubyforge.org:/var/www/gforge-projects/serverside/"
116
+ end
117
+
112
118
  ##############################################################################
113
119
  # Statistics
114
120
  ##############################################################################
115
121
 
116
122
  STATS_DIRECTORIES = [
117
- %w(Code lib/),
118
- %w(Unit\ tests test/unit),
119
- %w(Functional\ tests test/functional)
123
+ %w(Code lib/),
124
+ %w(Unit\ tests test/unit),
125
+ %w(Functional\ tests test/functional),
126
+ %w(Specification\ tests test/spec)
120
127
  ].collect { |name, dir| [ name, "./#{dir}" ] }.select { |name, dir| File.directory?(dir) }
121
128
 
122
129
  desc "Report code statistics (KLOCs, etc) from the application"
data/bin/serverside CHANGED
@@ -26,7 +26,7 @@ that directory. If no path is given, the current working directory is assumed."
26
26
  $cmd_config[:host] = v
27
27
  end
28
28
  opts.on("-p", "--port NUM", "Port or port range (default is 8000)") do |v|
29
- $cmd_config[:ports] = (v =~ /\.\./) ? eval(v) : v.to_i..v_to_i
29
+ $cmd_config[:ports] = (v =~ /\.\./) ? eval(v) : v.to_i..v.to_i
30
30
  end
31
31
 
32
32
  # No argument, shows at tail. This will print an options summary.
@@ -55,13 +55,13 @@
55
55
  <tr class="top-aligned-row">
56
56
  <td><strong>In:</strong></td>
57
57
  <td>
58
- <a href="../files/lib/serverside/cluster_rb.html">
59
- lib/serverside/cluster.rb
60
- </a>
61
- <br />
62
58
  <a href="../files/lib/serverside/daemon_rb.html">
63
59
  lib/serverside/daemon.rb
64
60
  </a>
61
+ <br />
62
+ <a href="../files/lib/serverside/cluster_rb.html">
63
+ lib/serverside/cluster.rb
64
+ </a>
65
65
  <br />
66
66
  </td>
67
67
  </tr>
@@ -58,6 +58,10 @@
58
58
  <a href="../files/lib/serverside_rb.html">
59
59
  lib/serverside.rb
60
60
  </a>
61
+ <br />
62
+ <a href="../files/lib/serverside/server_rb.html">
63
+ lib/serverside/server.rb
64
+ </a>
61
65
  <br />
62
66
  <a href="../files/lib/serverside/application_rb.html">
63
67
  lib/serverside/application.rb
@@ -67,25 +71,21 @@
67
71
  lib/serverside/connection.rb
68
72
  </a>
69
73
  <br />
70
- <a href="../files/lib/serverside/request_rb.html">
71
- lib/serverside/request.rb
74
+ <a href="../files/lib/serverside/static_rb.html">
75
+ lib/serverside/static.rb
72
76
  </a>
73
77
  <br />
74
78
  <a href="../files/lib/serverside/routing_rb.html">
75
79
  lib/serverside/routing.rb
76
80
  </a>
77
- <br />
78
- <a href="../files/lib/serverside/server_rb.html">
79
- lib/serverside/server.rb
80
- </a>
81
- <br />
82
- <a href="../files/lib/serverside/static_rb.html">
83
- lib/serverside/static.rb
84
- </a>
85
81
  <br />
86
82
  <a href="../files/lib/serverside/template_rb.html">
87
83
  lib/serverside/template.rb
88
84
  </a>
85
+ <br />
86
+ <a href="../files/lib/serverside/request_rb.html">
87
+ lib/serverside/request.rb
88
+ </a>
89
89
  <br />
90
90
  </td>
91
91
  </tr>
@@ -55,6 +55,10 @@
55
55
  <tr class="top-aligned-row">
56
56
  <td><strong>In:</strong></td>
57
57
  <td>
58
+ <a href="../../files/lib/serverside/server_rb.html">
59
+ lib/serverside/server.rb
60
+ </a>
61
+ <br />
58
62
  <a href="../../files/lib/serverside/connection_rb.html">
59
63
  lib/serverside/connection.rb
60
64
  </a>
@@ -62,10 +66,6 @@
62
66
  <a href="../../files/lib/serverside/request_rb.html">
63
67
  lib/serverside/request.rb
64
68
  </a>
65
- <br />
66
- <a href="../../files/lib/serverside/server_rb.html">
67
- lib/serverside/server.rb
68
- </a>
69
69
  <br />
70
70
  </td>
71
71
  </tr>
@@ -95,8 +95,7 @@
95
95
  <div id="class-list">
96
96
  <h3 class="section-bar">Classes and Modules</h3>
97
97
 
98
- Module <a href="HTTP/Const.html" class="link">ServerSide::HTTP::Const</a><br />
99
- Class <a href="HTTP/Connection.html" class="link">ServerSide::HTTP::Connection</a><br />
98
+ Class <a href="HTTP/Connection.html" class="link">ServerSide::HTTP::Connection</a><br />
100
99
  Class <a href="HTTP/Request.html" class="link">ServerSide::HTTP::Request</a><br />
101
100
  Class <a href="HTTP/Server.html" class="link">ServerSide::HTTP::Server</a><br />
102
101
 
@@ -98,8 +98,8 @@ implementing <a href="../HTTP.html">HTTP</a> 1.1 persistent connections.
98
98
  <h3 class="section-bar">Methods</h3>
99
99
 
100
100
  <div class="name-list">
101
- <a href="#M000039">new</a>&nbsp;&nbsp;
102
- <a href="#M000040">process</a>&nbsp;&nbsp;
101
+ <a href="#M000040">new</a>&nbsp;&nbsp;
102
+ <a href="#M000041">process</a>&nbsp;&nbsp;
103
103
  </div>
104
104
  </div>
105
105
 
@@ -121,12 +121,12 @@ implementing <a href="../HTTP.html">HTTP</a> 1.1 persistent connections.
121
121
  <div id="methods">
122
122
  <h3 class="section-bar">Public Class methods</h3>
123
123
 
124
- <div id="method-M000039" class="method-detail">
125
- <a name="M000039"></a>
124
+ <div id="method-M000040" class="method-detail">
125
+ <a name="M000040"></a>
126
126
 
127
127
  <div class="method-heading">
128
- <a href="#M000039" class="method-signature">
129
- <span class="method-name">new</span><span class="method-args">(conn, request_class)</span>
128
+ <a href="#M000040" class="method-signature">
129
+ <span class="method-name">new</span><span class="method-args">(socket, request_class)</span>
130
130
  </a>
131
131
  </div>
132
132
 
@@ -136,12 +136,12 @@ Initializes the request instance. A new thread is created for processing
136
136
  requests.
137
137
  </p>
138
138
  <p><a class="source-toggle" href="#"
139
- onclick="toggleCode('M000039-source');return false;">[Source]</a></p>
140
- <div class="method-source-code" id="M000039-source">
139
+ onclick="toggleCode('M000040-source');return false;">[Source]</a></p>
140
+ <div class="method-source-code" id="M000040-source">
141
141
  <pre>
142
142
  <span class="ruby-comment cmt"># File lib/serverside/connection.rb, line 13</span>
143
- 13: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">initialize</span>(<span class="ruby-identifier">conn</span>, <span class="ruby-identifier">request_class</span>)
144
- 14: <span class="ruby-ivar">@conn</span>, <span class="ruby-ivar">@request_class</span> = <span class="ruby-identifier">conn</span>, <span class="ruby-identifier">request_class</span>
143
+ 13: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">initialize</span>(<span class="ruby-identifier">socket</span>, <span class="ruby-identifier">request_class</span>)
144
+ 14: <span class="ruby-ivar">@socket</span>, <span class="ruby-ivar">@request_class</span> = <span class="ruby-identifier">socket</span>, <span class="ruby-identifier">request_class</span>
145
145
  15: <span class="ruby-ivar">@thread</span> = <span class="ruby-constant">Thread</span>.<span class="ruby-identifier">new</span> {<span class="ruby-identifier">process</span>}
146
146
  16: <span class="ruby-keyword kw">end</span>
147
147
  </pre>
@@ -151,11 +151,11 @@ requests.
151
151
 
152
152
  <h3 class="section-bar">Public Instance methods</h3>
153
153
 
154
- <div id="method-M000040" class="method-detail">
155
- <a name="M000040"></a>
154
+ <div id="method-M000041" class="method-detail">
155
+ <a name="M000041"></a>
156
156
 
157
157
  <div class="method-heading">
158
- <a href="#M000040" class="method-signature">
158
+ <a href="#M000041" class="method-signature">
159
159
  <span class="method-name">process</span><span class="method-args">()</span>
160
160
  </a>
161
161
  </div>
@@ -167,19 +167,21 @@ error occurs, or the connection is not persistent, the connection is
167
167
  closed.
168
168
  </p>
169
169
  <p><a class="source-toggle" href="#"
170
- onclick="toggleCode('M000040-source');return false;">[Source]</a></p>
171
- <div class="method-source-code" id="M000040-source">
170
+ onclick="toggleCode('M000041-source');return false;">[Source]</a></p>
171
+ <div class="method-source-code" id="M000041-source">
172
172
  <pre>
173
173
  <span class="ruby-comment cmt"># File lib/serverside/connection.rb, line 21</span>
174
174
  21: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">process</span>
175
175
  22: <span class="ruby-keyword kw">while</span> <span class="ruby-keyword kw">true</span>
176
- 23: <span class="ruby-keyword kw">break</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-ivar">@request_class</span>.<span class="ruby-identifier">new</span>(<span class="ruby-ivar">@conn</span>).<span class="ruby-identifier">process</span>
177
- 24: <span class="ruby-keyword kw">end</span>
178
- 25: <span class="ruby-keyword kw">rescue</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">e</span>
179
- 26: <span class="ruby-comment cmt"># We don't care. Just close the connection.</span>
180
- 27: <span class="ruby-keyword kw">ensure</span>
181
- 28: <span class="ruby-ivar">@conn</span>.<span class="ruby-identifier">close</span>
182
- 29: <span class="ruby-keyword kw">end</span>
176
+ 23: <span class="ruby-comment cmt"># the process function is expected to return true or a non-nil value</span>
177
+ 24: <span class="ruby-comment cmt"># if the connection is to persist.</span>
178
+ 25: <span class="ruby-keyword kw">break</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-ivar">@request_class</span>.<span class="ruby-identifier">new</span>(<span class="ruby-ivar">@socket</span>).<span class="ruby-identifier">process</span>
179
+ 26: <span class="ruby-keyword kw">end</span>
180
+ 27: <span class="ruby-keyword kw">rescue</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">e</span>
181
+ 28: <span class="ruby-comment cmt"># We don't care. Just close the connection.</span>
182
+ 29: <span class="ruby-keyword kw">ensure</span>
183
+ 30: <span class="ruby-ivar">@socket</span>.<span class="ruby-identifier">close</span>
184
+ 31: <span class="ruby-keyword kw">end</span>
183
185
  </pre>
184
186
  </div>
185
187
  </div>
@@ -82,12 +82,12 @@
82
82
 
83
83
  <div id="description">
84
84
  <p>
85
- The HTTPRequest class encapsulates <a href="../HTTP.html">HTTP</a>
86
- requests. The request class contains methods for parsing the request and
87
- rendering a response. <a href="../HTTP.html">HTTP</a> requests are created
88
- by the connection. Descendants of HTTPRequest can be created When a
89
- connection is created, it creates new requests in a loop until the
90
- connection is closed.
85
+ The <a href="Request.html">Request</a> class encapsulates <a
86
+ href="../HTTP.html">HTTP</a> requests. The request class contains methods
87
+ for parsing the request and rendering a response. <a
88
+ href="../HTTP.html">HTTP</a> requests are created by the connection.
89
+ Descendants of HTTPRequest can be created When a connection is created, it
90
+ creates new requests in a loop until the connection is closed.
91
91
  </p>
92
92
 
93
93
  </div>
@@ -99,16 +99,17 @@ connection is closed.
99
99
  <h3 class="section-bar">Methods</h3>
100
100
 
101
101
  <div class="name-list">
102
- <a href="#M000038">delete_cookie</a>&nbsp;&nbsp;
102
+ <a href="#M000039">delete_cookie</a>&nbsp;&nbsp;
103
103
  <a href="#M000029">new</a>&nbsp;&nbsp;
104
104
  <a href="#M000031">parse</a>&nbsp;&nbsp;
105
+ <a href="#M000034">parse_body</a>&nbsp;&nbsp;
105
106
  <a href="#M000033">parse_cookies</a>&nbsp;&nbsp;
106
107
  <a href="#M000032">parse_parameters</a>&nbsp;&nbsp;
107
108
  <a href="#M000030">process</a>&nbsp;&nbsp;
108
- <a href="#M000035">redirect</a>&nbsp;&nbsp;
109
- <a href="#M000034">send_response</a>&nbsp;&nbsp;
110
- <a href="#M000037">set_cookie</a>&nbsp;&nbsp;
111
- <a href="#M000036">stream</a>&nbsp;&nbsp;
109
+ <a href="#M000036">redirect</a>&nbsp;&nbsp;
110
+ <a href="#M000035">send_response</a>&nbsp;&nbsp;
111
+ <a href="#M000038">set_cookie</a>&nbsp;&nbsp;
112
+ <a href="#M000037">stream</a>&nbsp;&nbsp;
112
113
  </div>
113
114
  </div>
114
115
 
@@ -127,6 +128,181 @@ connection is closed.
127
128
  <div id="section">
128
129
 
129
130
 
131
+ <div id="constants-list">
132
+ <h3 class="section-bar">Constants</h3>
133
+
134
+ <div class="name-list">
135
+ <table summary="Constants">
136
+ <tr class="top-aligned-row context-row">
137
+ <td class="context-item-name">LINE_BREAK</td>
138
+ <td>=</td>
139
+ <td class="context-item-value">&quot;\r\n&quot;.freeze</td>
140
+ </tr>
141
+ <tr class="top-aligned-row context-row">
142
+ <td class="context-item-name">REQUEST_REGEXP</td>
143
+ <td>=</td>
144
+ <td class="context-item-value">/([A-Za-z0-9]+)\s(\/[^\/\?]*(?:\/[^\/\?]+)*)\/?(?:\?(.*))?\sHTTP\/(.+)\r/.freeze</td>
145
+ <td width="3em">&nbsp;</td>
146
+ <td class="context-item-desc">
147
+ Here&#8217;s a nice one - parses the first line of a request. The expected
148
+ format is as follows: &lt;method&gt; &lt;/path&gt;[/][?&lt;query&gt;] <a
149
+ href="../HTTP.html">HTTP</a>/&lt;version&gt;
150
+
151
+ </td>
152
+ </tr>
153
+ <tr class="top-aligned-row context-row">
154
+ <td class="context-item-name">HEADER_REGEXP</td>
155
+ <td>=</td>
156
+ <td class="context-item-value">/([^:]+):\s?(.*)\r\n/.freeze</td>
157
+ <td width="3em">&nbsp;</td>
158
+ <td class="context-item-desc">
159
+ Regexp for parsing headers.
160
+
161
+ </td>
162
+ </tr>
163
+ <tr class="top-aligned-row context-row">
164
+ <td class="context-item-name">CONTENT_LENGTH</td>
165
+ <td>=</td>
166
+ <td class="context-item-value">'Content-Length'.freeze</td>
167
+ </tr>
168
+ <tr class="top-aligned-row context-row">
169
+ <td class="context-item-name">VERSION_1_1</td>
170
+ <td>=</td>
171
+ <td class="context-item-value">'1.1'.freeze</td>
172
+ </tr>
173
+ <tr class="top-aligned-row context-row">
174
+ <td class="context-item-name">CONNECTION</td>
175
+ <td>=</td>
176
+ <td class="context-item-value">'Connection'.freeze</td>
177
+ </tr>
178
+ <tr class="top-aligned-row context-row">
179
+ <td class="context-item-name">CLOSE</td>
180
+ <td>=</td>
181
+ <td class="context-item-value">'close'.freeze</td>
182
+ </tr>
183
+ <tr class="top-aligned-row context-row">
184
+ <td class="context-item-name">AMPERSAND</td>
185
+ <td>=</td>
186
+ <td class="context-item-value">'&amp;'.freeze</td>
187
+ </tr>
188
+ <tr class="top-aligned-row context-row">
189
+ <td class="context-item-name">PARAMETER_REGEXP</td>
190
+ <td>=</td>
191
+ <td class="context-item-value">/(.+)=(.*)/.freeze</td>
192
+ <td width="3em">&nbsp;</td>
193
+ <td class="context-item-desc">
194
+ Regexp for parsing URI parameters.
195
+
196
+ </td>
197
+ </tr>
198
+ <tr class="top-aligned-row context-row">
199
+ <td class="context-item-name">EQUAL_SIGN</td>
200
+ <td>=</td>
201
+ <td class="context-item-value">'='.freeze</td>
202
+ </tr>
203
+ <tr class="top-aligned-row context-row">
204
+ <td class="context-item-name">STATUS_CLOSE</td>
205
+ <td>=</td>
206
+ <td class="context-item-value">&quot;HTTP/1.1 %d\r\nDate: %s\r\nConnection: close\r\nContent-Type: %s\r\n%s%sContent-Length: %d\r\n\r\n&quot;.freeze</td>
207
+ </tr>
208
+ <tr class="top-aligned-row context-row">
209
+ <td class="context-item-name">STATUS_STREAM</td>
210
+ <td>=</td>
211
+ <td class="context-item-value">&quot;HTTP/1.1 %d\r\nDate: %s\r\nConnection: close\r\nContent-Type: %s\r\n%s%s\r\n&quot;.freeze</td>
212
+ </tr>
213
+ <tr class="top-aligned-row context-row">
214
+ <td class="context-item-name">STATUS_PERSIST</td>
215
+ <td>=</td>
216
+ <td class="context-item-value">&quot;HTTP/1.1 %d\r\nDate: %s\r\nContent-Type: %s\r\n%s%sContent-Length: %d\r\n\r\n&quot;.freeze</td>
217
+ </tr>
218
+ <tr class="top-aligned-row context-row">
219
+ <td class="context-item-name">STATUS_REDIRECT</td>
220
+ <td>=</td>
221
+ <td class="context-item-value">&quot;HTTP/1.1 %d\r\nDate: %s\r\nConnection: close\r\nLocation: %s\r\n\r\n&quot;.freeze</td>
222
+ </tr>
223
+ <tr class="top-aligned-row context-row">
224
+ <td class="context-item-name">HEADER</td>
225
+ <td>=</td>
226
+ <td class="context-item-value">&quot;%s: %s\r\n&quot;.freeze</td>
227
+ </tr>
228
+ <tr class="top-aligned-row context-row">
229
+ <td class="context-item-name">EMPTY_STRING</td>
230
+ <td>=</td>
231
+ <td class="context-item-value">''.freeze</td>
232
+ </tr>
233
+ <tr class="top-aligned-row context-row">
234
+ <td class="context-item-name">EMPTY_HASH</td>
235
+ <td>=</td>
236
+ <td class="context-item-value">{}.freeze</td>
237
+ </tr>
238
+ <tr class="top-aligned-row context-row">
239
+ <td class="context-item-name">SLASH</td>
240
+ <td>=</td>
241
+ <td class="context-item-value">'/'.freeze</td>
242
+ </tr>
243
+ <tr class="top-aligned-row context-row">
244
+ <td class="context-item-name">LOCATION</td>
245
+ <td>=</td>
246
+ <td class="context-item-value">'Location'.freeze</td>
247
+ </tr>
248
+ <tr class="top-aligned-row context-row">
249
+ <td class="context-item-name">COOKIE</td>
250
+ <td>=</td>
251
+ <td class="context-item-value">'Cookie'</td>
252
+ </tr>
253
+ <tr class="top-aligned-row context-row">
254
+ <td class="context-item-name">SET_COOKIE</td>
255
+ <td>=</td>
256
+ <td class="context-item-value">&quot;Set-Cookie: %s=%s; path=/; expires=%s\r\n&quot;.freeze</td>
257
+ </tr>
258
+ <tr class="top-aligned-row context-row">
259
+ <td class="context-item-name">COOKIE_SPLIT</td>
260
+ <td>=</td>
261
+ <td class="context-item-value">/[;,] */n.freeze</td>
262
+ </tr>
263
+ <tr class="top-aligned-row context-row">
264
+ <td class="context-item-name">COOKIE_REGEXP</td>
265
+ <td>=</td>
266
+ <td class="context-item-value">/\s*(.+)=(.*)\s*/.freeze</td>
267
+ </tr>
268
+ <tr class="top-aligned-row context-row">
269
+ <td class="context-item-name">COOKIE_EXPIRED_TIME</td>
270
+ <td>=</td>
271
+ <td class="context-item-value">Time.at(0).freeze</td>
272
+ </tr>
273
+ <tr class="top-aligned-row context-row">
274
+ <td class="context-item-name">CONTENT_TYPE</td>
275
+ <td>=</td>
276
+ <td class="context-item-value">&quot;Content-Type&quot;.freeze</td>
277
+ </tr>
278
+ <tr class="top-aligned-row context-row">
279
+ <td class="context-item-name">CONTENT_TYPE_URL_ENCODED</td>
280
+ <td>=</td>
281
+ <td class="context-item-value">'application/x-www-form-urlencoded'.freeze</td>
282
+ </tr>
283
+ <tr class="top-aligned-row context-row">
284
+ <td class="context-item-name">MULTIPART_REGEXP</td>
285
+ <td>=</td>
286
+ <td class="context-item-value">/multipart\/form-data.*boundary=\&quot;?([^\&quot;;,]+)/n.freeze</td>
287
+ </tr>
288
+ <tr class="top-aligned-row context-row">
289
+ <td class="context-item-name">CONTENT_DISPOSITION_REGEXP</td>
290
+ <td>=</td>
291
+ <td class="context-item-value">/^Content-Disposition: form-data;([^\r]*)/m.freeze</td>
292
+ </tr>
293
+ <tr class="top-aligned-row context-row">
294
+ <td class="context-item-name">FIELD_ATTRIBUTE_REGEXP</td>
295
+ <td>=</td>
296
+ <td class="context-item-value">/\s*(\w+)=\&quot;([^\&quot;]*)/.freeze</td>
297
+ </tr>
298
+ <tr class="top-aligned-row context-row">
299
+ <td class="context-item-name">CONTENT_TYPE_REGEXP</td>
300
+ <td>=</td>
301
+ <td class="context-item-value">/^Content-Type: ([^\r]*)/m.freeze</td>
302
+ </tr>
303
+ </table>
304
+ </div>
305
+ </div>
130
306
 
131
307
 
132
308
 
@@ -136,7 +312,17 @@ connection is closed.
136
312
  <div class="name-list">
137
313
  <table>
138
314
  <tr class="top-aligned-row context-row">
139
- <td class="context-item-name">conn</td>
315
+ <td class="context-item-name">body</td>
316
+ <td class="context-item-value">&nbsp;[R]&nbsp;</td>
317
+ <td class="context-item-desc"></td>
318
+ </tr>
319
+ <tr class="top-aligned-row context-row">
320
+ <td class="context-item-name">content_length</td>
321
+ <td class="context-item-value">&nbsp;[R]&nbsp;</td>
322
+ <td class="context-item-desc"></td>
323
+ </tr>
324
+ <tr class="top-aligned-row context-row">
325
+ <td class="context-item-name">content_type</td>
140
326
  <td class="context-item-value">&nbsp;[R]&nbsp;</td>
141
327
  <td class="context-item-desc"></td>
142
328
  </tr>
@@ -180,6 +366,11 @@ connection is closed.
180
366
  <td class="context-item-value">&nbsp;[R]&nbsp;</td>
181
367
  <td class="context-item-desc"></td>
182
368
  </tr>
369
+ <tr class="top-aligned-row context-row">
370
+ <td class="context-item-name">socket</td>
371
+ <td class="context-item-value">&nbsp;[R]&nbsp;</td>
372
+ <td class="context-item-desc"></td>
373
+ </tr>
183
374
  <tr class="top-aligned-row context-row">
184
375
  <td class="context-item-name">version</td>
185
376
  <td class="context-item-value">&nbsp;[R]&nbsp;</td>
@@ -200,7 +391,7 @@ connection is closed.
200
391
 
201
392
  <div class="method-heading">
202
393
  <a href="#M000029" class="method-signature">
203
- <span class="method-name">new</span><span class="method-args">(conn)</span>
394
+ <span class="method-name">new</span><span class="method-args">(socket)</span>
204
395
  </a>
205
396
  </div>
206
397
 
@@ -208,16 +399,16 @@ connection is closed.
208
399
  <p>
209
400
  Initializes the request instance. Any descendants of <a
210
401
  href="Request.html">HTTP::Request</a> which override the initialize method
211
- must receive conn as the single argument, and copy it to @conn.
402
+ must receive socket as the single argument, and copy it to @socket.
212
403
  </p>
213
404
  <p><a class="source-toggle" href="#"
214
405
  onclick="toggleCode('M000029-source');return false;">[Source]</a></p>
215
406
  <div class="method-source-code" id="M000029-source">
216
407
  <pre>
217
- <span class="ruby-comment cmt"># File lib/serverside/request.rb, line 54</span>
218
- 54: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">initialize</span>(<span class="ruby-identifier">conn</span>)
219
- 55: <span class="ruby-ivar">@conn</span> = <span class="ruby-identifier">conn</span>
220
- 56: <span class="ruby-keyword kw">end</span>
408
+ <span class="ruby-comment cmt"># File lib/serverside/request.rb, line 55</span>
409
+ 55: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">initialize</span>(<span class="ruby-identifier">socket</span>)
410
+ 56: <span class="ruby-ivar">@socket</span> = <span class="ruby-identifier">socket</span>
411
+ 57: <span class="ruby-keyword kw">end</span>
221
412
  </pre>
222
413
  </div>
223
414
  </div>
@@ -225,11 +416,11 @@ must receive conn as the single argument, and copy it to @conn.
225
416
 
226
417
  <h3 class="section-bar">Public Instance methods</h3>
227
418
 
228
- <div id="method-M000038" class="method-detail">
229
- <a name="M000038"></a>
419
+ <div id="method-M000039" class="method-detail">
420
+ <a name="M000039"></a>
230
421
 
231
422
  <div class="method-heading">
232
- <a href="#M000038" class="method-signature">
423
+ <a href="#M000039" class="method-signature">
233
424
  <span class="method-name">delete_cookie</span><span class="method-args">(name)</span>
234
425
  </a>
235
426
  </div>
@@ -240,13 +431,13 @@ Marks a cookie as deleted. The cookie is given an expires stamp in the
240
431
  past.
241
432
  </p>
242
433
  <p><a class="source-toggle" href="#"
243
- onclick="toggleCode('M000038-source');return false;">[Source]</a></p>
244
- <div class="method-source-code" id="M000038-source">
434
+ onclick="toggleCode('M000039-source');return false;">[Source]</a></p>
435
+ <div class="method-source-code" id="M000039-source">
245
436
  <pre>
246
- <span class="ruby-comment cmt"># File lib/serverside/request.rb, line 145</span>
247
- 145: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">delete_cookie</span>(<span class="ruby-identifier">name</span>)
248
- 146: <span class="ruby-identifier">set_cookie</span>(<span class="ruby-identifier">name</span>, <span class="ruby-keyword kw">nil</span>, <span class="ruby-constant">Const</span><span class="ruby-operator">::</span><span class="ruby-constant">CookieExpiredTime</span>)
249
- 147: <span class="ruby-keyword kw">end</span>
437
+ <span class="ruby-comment cmt"># File lib/serverside/request.rb, line 185</span>
438
+ 185: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">delete_cookie</span>(<span class="ruby-identifier">name</span>)
439
+ 186: <span class="ruby-identifier">set_cookie</span>(<span class="ruby-identifier">name</span>, <span class="ruby-keyword kw">nil</span>, <span class="ruby-constant">COOKIE_EXPIRED_TIME</span>)
440
+ 187: <span class="ruby-keyword kw">end</span>
250
441
  </pre>
251
442
  </div>
252
443
  </div>
@@ -273,25 +464,79 @@ href="Connection.html">Connection</a>&#8217; header).
273
464
  onclick="toggleCode('M000031-source');return false;">[Source]</a></p>
274
465
  <div class="method-source-code" id="M000031-source">
275
466
  <pre>
276
- <span class="ruby-comment cmt"># File lib/serverside/request.rb, line 67</span>
277
- 67: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">parse</span>
278
- 68: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">nil</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-ivar">@conn</span>.<span class="ruby-identifier">gets</span> <span class="ruby-operator">=~</span> <span class="ruby-constant">Const</span><span class="ruby-operator">::</span><span class="ruby-constant">RequestRegexp</span>
279
- 69: <span class="ruby-ivar">@method</span>, <span class="ruby-ivar">@path</span>, <span class="ruby-ivar">@query</span>, <span class="ruby-ivar">@version</span> = <span class="ruby-identifier">$1</span>.<span class="ruby-identifier">downcase</span>.<span class="ruby-identifier">to_sym</span>, <span class="ruby-identifier">$2</span>, <span class="ruby-identifier">$3</span>, <span class="ruby-identifier">$4</span>
280
- 70: <span class="ruby-ivar">@parameters</span> = <span class="ruby-ivar">@query</span> <span class="ruby-operator">?</span> <span class="ruby-identifier">parse_parameters</span>(<span class="ruby-ivar">@query</span>) <span class="ruby-operator">:</span> {}
281
- 71: <span class="ruby-ivar">@headers</span> = {}
282
- 72: <span class="ruby-keyword kw">while</span> (<span class="ruby-identifier">line</span> = <span class="ruby-ivar">@conn</span>.<span class="ruby-identifier">gets</span>)
283
- 73: <span class="ruby-keyword kw">break</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">line</span>.<span class="ruby-identifier">nil?</span> <span class="ruby-operator">||</span> (<span class="ruby-identifier">line</span> <span class="ruby-operator">==</span> <span class="ruby-constant">Const</span><span class="ruby-operator">::</span><span class="ruby-constant">LineBreak</span>)
284
- 74: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">line</span> <span class="ruby-operator">=~</span> <span class="ruby-constant">Const</span><span class="ruby-operator">::</span><span class="ruby-constant">HeaderRegexp</span>
285
- 75: <span class="ruby-ivar">@headers</span>[<span class="ruby-identifier">$1</span>.<span class="ruby-identifier">freeze</span>] = <span class="ruby-identifier">$2</span>.<span class="ruby-identifier">freeze</span>
286
- 76: <span class="ruby-keyword kw">end</span>
287
- 77: <span class="ruby-keyword kw">end</span>
288
- 78: <span class="ruby-ivar">@persistent</span> = (<span class="ruby-ivar">@version</span> <span class="ruby-operator">==</span> <span class="ruby-constant">Const</span><span class="ruby-operator">::</span><span class="ruby-constant">Version_1_1</span>) <span class="ruby-operator">&amp;&amp;</span>
289
- 79: (<span class="ruby-ivar">@headers</span>[<span class="ruby-constant">Const</span><span class="ruby-operator">::</span><span class="ruby-constant">Connection</span>] <span class="ruby-operator">!=</span> <span class="ruby-constant">Const</span><span class="ruby-operator">::</span><span class="ruby-constant">Close</span>)
290
- 80: <span class="ruby-ivar">@cookies</span> = <span class="ruby-ivar">@headers</span>[<span class="ruby-constant">Const</span><span class="ruby-operator">::</span><span class="ruby-constant">Cookie</span>] <span class="ruby-operator">?</span> <span class="ruby-identifier">parse_cookies</span> <span class="ruby-operator">:</span> <span class="ruby-constant">Const</span><span class="ruby-operator">::</span><span class="ruby-constant">EmptyHash</span>
291
- 81: <span class="ruby-ivar">@response_cookies</span> = <span class="ruby-keyword kw">nil</span>
292
- 82:
293
- 83: <span class="ruby-ivar">@headers</span>
294
- 84: <span class="ruby-keyword kw">end</span>
467
+ <span class="ruby-comment cmt"># File lib/serverside/request.rb, line 68</span>
468
+ 68: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">parse</span>
469
+ 69: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">nil</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-ivar">@socket</span>.<span class="ruby-identifier">gets</span> <span class="ruby-operator">=~</span> <span class="ruby-constant">REQUEST_REGEXP</span>
470
+ 70: <span class="ruby-ivar">@method</span>, <span class="ruby-ivar">@path</span>, <span class="ruby-ivar">@query</span>, <span class="ruby-ivar">@version</span> = <span class="ruby-identifier">$1</span>.<span class="ruby-identifier">downcase</span>.<span class="ruby-identifier">to_sym</span>, <span class="ruby-identifier">$2</span>, <span class="ruby-identifier">$3</span>, <span class="ruby-identifier">$4</span>
471
+ 71: <span class="ruby-ivar">@parameters</span> = <span class="ruby-ivar">@query</span> <span class="ruby-operator">?</span> <span class="ruby-identifier">parse_parameters</span>(<span class="ruby-ivar">@query</span>) <span class="ruby-operator">:</span> {}
472
+ 72: <span class="ruby-ivar">@headers</span> = {}
473
+ 73: <span class="ruby-keyword kw">while</span> (<span class="ruby-identifier">line</span> = <span class="ruby-ivar">@socket</span>.<span class="ruby-identifier">gets</span>)
474
+ 74: <span class="ruby-keyword kw">break</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">line</span>.<span class="ruby-identifier">nil?</span> <span class="ruby-operator">||</span> (<span class="ruby-identifier">line</span> <span class="ruby-operator">==</span> <span class="ruby-constant">LINE_BREAK</span>)
475
+ 75: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">line</span> <span class="ruby-operator">=~</span> <span class="ruby-constant">HEADER_REGEXP</span>
476
+ 76: <span class="ruby-ivar">@headers</span>[<span class="ruby-identifier">$1</span>.<span class="ruby-identifier">freeze</span>] = <span class="ruby-identifier">$2</span>.<span class="ruby-identifier">freeze</span>
477
+ 77: <span class="ruby-keyword kw">end</span>
478
+ 78: <span class="ruby-keyword kw">end</span>
479
+ 79: <span class="ruby-ivar">@persistent</span> = (<span class="ruby-ivar">@version</span> <span class="ruby-operator">==</span> <span class="ruby-constant">VERSION_1_1</span>) <span class="ruby-operator">&amp;&amp;</span>
480
+ 80: (<span class="ruby-ivar">@headers</span>[<span class="ruby-constant">CONNECTION</span>] <span class="ruby-operator">!=</span> <span class="ruby-constant">CLOSE</span>)
481
+ 81: <span class="ruby-ivar">@cookies</span> = <span class="ruby-ivar">@headers</span>[<span class="ruby-constant">COOKIE</span>] <span class="ruby-operator">?</span> <span class="ruby-identifier">parse_cookies</span> <span class="ruby-operator">:</span> <span class="ruby-constant">EMPTY_HASH</span>
482
+ 82: <span class="ruby-ivar">@response_cookies</span> = <span class="ruby-keyword kw">nil</span>
483
+ 83:
484
+ 84: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@content_length</span> = <span class="ruby-ivar">@headers</span>[<span class="ruby-constant">CONTENT_LENGTH</span>].<span class="ruby-identifier">to_i</span>
485
+ 85: <span class="ruby-ivar">@content_type</span> = <span class="ruby-ivar">@headers</span>[<span class="ruby-constant">CONTENT_TYPE</span>] <span class="ruby-operator">||</span> <span class="ruby-constant">CONTENT_TYPE_URL_ENCODED</span>
486
+ 86: <span class="ruby-ivar">@body</span> = <span class="ruby-ivar">@socket</span>.<span class="ruby-identifier">read</span>(<span class="ruby-ivar">@content_length</span>) <span class="ruby-keyword kw">rescue</span> <span class="ruby-keyword kw">nil</span>
487
+ 87: <span class="ruby-identifier">parse_body</span>
488
+ 88: <span class="ruby-keyword kw">end</span>
489
+ 89:
490
+ 90: <span class="ruby-ivar">@headers</span>
491
+ 91: <span class="ruby-keyword kw">end</span>
492
+ </pre>
493
+ </div>
494
+ </div>
495
+ </div>
496
+
497
+ <div id="method-M000034" class="method-detail">
498
+ <a name="M000034"></a>
499
+
500
+ <div class="method-heading">
501
+ <a href="#M000034" class="method-signature">
502
+ <span class="method-name">parse_body</span><span class="method-args">()</span>
503
+ </a>
504
+ </div>
505
+
506
+ <div class="method-description">
507
+ <p>
508
+ parses the body, either by using
509
+ </p>
510
+ <p><a class="source-toggle" href="#"
511
+ onclick="toggleCode('M000034-source');return false;">[Source]</a></p>
512
+ <div class="method-source-code" id="M000034-source">
513
+ <pre>
514
+ <span class="ruby-comment cmt"># File lib/serverside/request.rb, line 120</span>
515
+ 120: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">parse_body</span>
516
+ 121: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@content_type</span> <span class="ruby-operator">==</span> <span class="ruby-constant">CONTENT_TYPE_URL_ENCODED</span>
517
+ 122: <span class="ruby-ivar">@parameters</span>.<span class="ruby-identifier">merge!</span> <span class="ruby-identifier">parse_parameters</span>(<span class="ruby-ivar">@body</span>)
518
+ 123: <span class="ruby-keyword kw">elsif</span> <span class="ruby-ivar">@content_type</span> <span class="ruby-operator">=~</span> <span class="ruby-constant">MULTIPART_REGEXP</span>
519
+ 124: <span class="ruby-identifier">boundary</span> = <span class="ruby-value str">&quot;--#$1&quot;</span>
520
+ 125: <span class="ruby-ivar">@body</span>.<span class="ruby-identifier">split</span>(<span class="ruby-node">/(?:\r?\n|\A)#{Regexp::quote(boundary)}(?:--)?\r\n/</span><span class="ruby-identifier">m</span>).<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">pt</span><span class="ruby-operator">|</span>
521
+ 126: <span class="ruby-identifier">headers</span>, <span class="ruby-identifier">payload</span> = <span class="ruby-identifier">pt</span>.<span class="ruby-identifier">split</span>(<span class="ruby-value str">&quot;\r\n\r\n&quot;</span>, <span class="ruby-value">2</span>)
522
+ 127: <span class="ruby-identifier">atts</span> = {}
523
+ 128: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">headers</span> <span class="ruby-operator">=~</span> <span class="ruby-constant">CONTENT_DISPOSITION_REGEXP</span>
524
+ 129: <span class="ruby-identifier">$1</span>.<span class="ruby-identifier">split</span>(<span class="ruby-value str">';'</span>).<span class="ruby-identifier">map</span> {<span class="ruby-operator">|</span><span class="ruby-identifier">part</span><span class="ruby-operator">|</span>
525
+ 130: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">part</span> <span class="ruby-operator">=~</span> <span class="ruby-constant">FIELD_ATTRIBUTE_REGEXP</span>
526
+ 131: <span class="ruby-identifier">atts</span>[<span class="ruby-identifier">$1</span>.<span class="ruby-identifier">to_sym</span>] = <span class="ruby-identifier">$2</span>
527
+ 132: <span class="ruby-keyword kw">end</span>
528
+ 133: }
529
+ 134: <span class="ruby-keyword kw">end</span>
530
+ 135: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">headers</span> <span class="ruby-operator">=~</span> <span class="ruby-constant">CONTENT_TYPE_REGEXP</span>
531
+ 136: <span class="ruby-identifier">atts</span>[<span class="ruby-identifier">:type</span>] = <span class="ruby-identifier">$1</span>
532
+ 137: <span class="ruby-keyword kw">end</span>
533
+ 138: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">name</span> = <span class="ruby-identifier">atts</span>[<span class="ruby-identifier">:name</span>]
534
+ 139: <span class="ruby-identifier">atts</span>[<span class="ruby-identifier">:content</span>] = <span class="ruby-identifier">payload</span>
535
+ 140: <span class="ruby-ivar">@parameters</span>[<span class="ruby-identifier">name</span>.<span class="ruby-identifier">to_sym</span>] = <span class="ruby-identifier">atts</span>[<span class="ruby-identifier">:filename</span>] <span class="ruby-operator">?</span> <span class="ruby-identifier">atts</span> <span class="ruby-operator">:</span> <span class="ruby-identifier">atts</span>[<span class="ruby-identifier">:content</span>]
536
+ 141: <span class="ruby-keyword kw">end</span>
537
+ 142: <span class="ruby-keyword kw">end</span>
538
+ 143: <span class="ruby-keyword kw">end</span>
539
+ 144: <span class="ruby-keyword kw">end</span>
295
540
  </pre>
296
541
  </div>
297
542
  </div>
@@ -314,15 +559,15 @@ Parses cookie values passed in the request
314
559
  onclick="toggleCode('M000033-source');return false;">[Source]</a></p>
315
560
  <div class="method-source-code" id="M000033-source">
316
561
  <pre>
317
- <span class="ruby-comment cmt"># File lib/serverside/request.rb, line 98</span>
318
- 98: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">parse_cookies</span>
319
- 99: <span class="ruby-ivar">@headers</span>[<span class="ruby-constant">Const</span><span class="ruby-operator">::</span><span class="ruby-constant">Cookie</span>].<span class="ruby-identifier">split</span>(<span class="ruby-constant">Const</span><span class="ruby-operator">::</span><span class="ruby-constant">CookieSplit</span>).<span class="ruby-identifier">inject</span>({}) <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">m</span>, <span class="ruby-identifier">i</span><span class="ruby-operator">|</span>
320
- 100: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">i</span> <span class="ruby-operator">=~</span> <span class="ruby-constant">Const</span><span class="ruby-operator">::</span><span class="ruby-constant">CookieRegexp</span>
321
- 101: <span class="ruby-identifier">m</span>[<span class="ruby-identifier">$1</span>.<span class="ruby-identifier">to_sym</span>] = <span class="ruby-identifier">$2</span>.<span class="ruby-identifier">uri_unescape</span>
322
- 102: <span class="ruby-keyword kw">end</span>
323
- 103: <span class="ruby-identifier">m</span>
324
- 104: <span class="ruby-keyword kw">end</span>
325
- 105: <span class="ruby-keyword kw">end</span>
562
+ <span class="ruby-comment cmt"># File lib/serverside/request.rb, line 105</span>
563
+ 105: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">parse_cookies</span>
564
+ 106: <span class="ruby-ivar">@headers</span>[<span class="ruby-constant">COOKIE</span>].<span class="ruby-identifier">split</span>(<span class="ruby-constant">COOKIE_SPLIT</span>).<span class="ruby-identifier">inject</span>({}) <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">m</span>, <span class="ruby-identifier">i</span><span class="ruby-operator">|</span>
565
+ 107: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">i</span> <span class="ruby-operator">=~</span> <span class="ruby-constant">COOKIE_REGEXP</span>
566
+ 108: <span class="ruby-identifier">m</span>[<span class="ruby-identifier">$1</span>.<span class="ruby-identifier">to_sym</span>] = <span class="ruby-identifier">$2</span>.<span class="ruby-identifier">uri_unescape</span>
567
+ 109: <span class="ruby-keyword kw">end</span>
568
+ 110: <span class="ruby-identifier">m</span>
569
+ 111: <span class="ruby-keyword kw">end</span>
570
+ 112: <span class="ruby-keyword kw">end</span>
326
571
  </pre>
327
572
  </div>
328
573
  </div>
@@ -346,15 +591,15 @@ parameter values.
346
591
  onclick="toggleCode('M000032-source');return false;">[Source]</a></p>
347
592
  <div class="method-source-code" id="M000032-source">
348
593
  <pre>
349
- <span class="ruby-comment cmt"># File lib/serverside/request.rb, line 88</span>
350
- 88: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">parse_parameters</span>(<span class="ruby-identifier">query</span>)
351
- 89: <span class="ruby-identifier">query</span>.<span class="ruby-identifier">split</span>(<span class="ruby-constant">Const</span><span class="ruby-operator">::</span><span class="ruby-constant">Ampersand</span>).<span class="ruby-identifier">inject</span>({}) <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">m</span>, <span class="ruby-identifier">i</span><span class="ruby-operator">|</span>
352
- 90: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">i</span> <span class="ruby-operator">=~</span> <span class="ruby-constant">Const</span><span class="ruby-operator">::</span><span class="ruby-constant">ParameterRegexp</span>
353
- 91: <span class="ruby-identifier">m</span>[<span class="ruby-identifier">$1</span>.<span class="ruby-identifier">to_sym</span>] = <span class="ruby-identifier">$2</span>.<span class="ruby-identifier">uri_unescape</span>
354
- 92: <span class="ruby-keyword kw">end</span>
355
- 93: <span class="ruby-identifier">m</span>
356
- 94: <span class="ruby-keyword kw">end</span>
357
- 95: <span class="ruby-keyword kw">end</span>
594
+ <span class="ruby-comment cmt"># File lib/serverside/request.rb, line 95</span>
595
+ 95: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">parse_parameters</span>(<span class="ruby-identifier">query</span>)
596
+ 96: <span class="ruby-identifier">query</span>.<span class="ruby-identifier">split</span>(<span class="ruby-constant">AMPERSAND</span>).<span class="ruby-identifier">inject</span>({}) <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">m</span>, <span class="ruby-identifier">i</span><span class="ruby-operator">|</span>
597
+ 97: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">i</span> <span class="ruby-operator">=~</span> <span class="ruby-constant">PARAMETER_REGEXP</span>
598
+ 98: <span class="ruby-identifier">m</span>[<span class="ruby-identifier">$1</span>.<span class="ruby-identifier">to_sym</span>] = <span class="ruby-identifier">$2</span>.<span class="ruby-identifier">uri_unescape</span>
599
+ 99: <span class="ruby-keyword kw">end</span>
600
+ 100: <span class="ruby-identifier">m</span>
601
+ 101: <span class="ruby-keyword kw">end</span>
602
+ 102: <span class="ruby-keyword kw">end</span>
358
603
  </pre>
359
604
  </div>
360
605
  </div>
@@ -377,20 +622,20 @@ Processes the request by parsing it and then responding.
377
622
  onclick="toggleCode('M000030-source');return false;">[Source]</a></p>
378
623
  <div class="method-source-code" id="M000030-source">
379
624
  <pre>
380
- <span class="ruby-comment cmt"># File lib/serverside/request.rb, line 59</span>
381
- 59: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">process</span>
382
- 60: <span class="ruby-identifier">parse</span> <span class="ruby-operator">&amp;&amp;</span> ((<span class="ruby-identifier">respond</span> <span class="ruby-operator">||</span> <span class="ruby-keyword kw">true</span>) <span class="ruby-operator">&amp;&amp;</span> <span class="ruby-ivar">@persistent</span>)
383
- 61: <span class="ruby-keyword kw">end</span>
625
+ <span class="ruby-comment cmt"># File lib/serverside/request.rb, line 60</span>
626
+ 60: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">process</span>
627
+ 61: <span class="ruby-identifier">parse</span> <span class="ruby-operator">&amp;&amp;</span> ((<span class="ruby-identifier">respond</span> <span class="ruby-operator">||</span> <span class="ruby-keyword kw">true</span>) <span class="ruby-operator">&amp;&amp;</span> <span class="ruby-ivar">@persistent</span>)
628
+ 62: <span class="ruby-keyword kw">end</span>
384
629
  </pre>
385
630
  </div>
386
631
  </div>
387
632
  </div>
388
633
 
389
- <div id="method-M000035" class="method-detail">
390
- <a name="M000035"></a>
634
+ <div id="method-M000036" class="method-detail">
635
+ <a name="M000036"></a>
391
636
 
392
637
  <div class="method-heading">
393
- <a href="#M000035" class="method-signature">
638
+ <a href="#M000036" class="method-signature">
394
639
  <span class="method-name">redirect</span><span class="method-args">(location, permanent = false)</span>
395
640
  </a>
396
641
  </div>
@@ -400,26 +645,27 @@ Processes the request by parsing it and then responding.
400
645
  Send a redirect response.
401
646
  </p>
402
647
  <p><a class="source-toggle" href="#"
403
- onclick="toggleCode('M000035-source');return false;">[Source]</a></p>
404
- <div class="method-source-code" id="M000035-source">
648
+ onclick="toggleCode('M000036-source');return false;">[Source]</a></p>
649
+ <div class="method-source-code" id="M000036-source">
405
650
  <pre>
406
- <span class="ruby-comment cmt"># File lib/serverside/request.rb, line 126</span>
407
- 126: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">redirect</span>(<span class="ruby-identifier">location</span>, <span class="ruby-identifier">permanent</span> = <span class="ruby-keyword kw">false</span>)
408
- 127: <span class="ruby-ivar">@conn</span> <span class="ruby-operator">&lt;&lt;</span> (<span class="ruby-constant">Const</span><span class="ruby-operator">::</span><span class="ruby-constant">StatusRedirect</span> <span class="ruby-operator">%</span> [<span class="ruby-identifier">permanent</span> <span class="ruby-value">? </span><span class="ruby-value">301</span> <span class="ruby-operator">:</span> <span class="ruby-value">302</span>, <span class="ruby-identifier">location</span>])
409
- 128: <span class="ruby-keyword kw">rescue</span>
410
- 129: <span class="ruby-keyword kw">ensure</span>
411
- 130: <span class="ruby-ivar">@persistent</span> = <span class="ruby-keyword kw">false</span>
412
- 131: <span class="ruby-keyword kw">end</span>
651
+ <span class="ruby-comment cmt"># File lib/serverside/request.rb, line 165</span>
652
+ 165: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">redirect</span>(<span class="ruby-identifier">location</span>, <span class="ruby-identifier">permanent</span> = <span class="ruby-keyword kw">false</span>)
653
+ 166: <span class="ruby-ivar">@socket</span> <span class="ruby-operator">&lt;&lt;</span> (<span class="ruby-constant">STATUS_REDIRECT</span> <span class="ruby-operator">%</span>
654
+ 167: [<span class="ruby-identifier">permanent</span> <span class="ruby-value">? </span><span class="ruby-value">301</span> <span class="ruby-operator">:</span> <span class="ruby-value">302</span>, <span class="ruby-constant">Time</span>.<span class="ruby-identifier">now</span>.<span class="ruby-identifier">httpdate</span>, <span class="ruby-identifier">location</span>])
655
+ 168: <span class="ruby-keyword kw">rescue</span>
656
+ 169: <span class="ruby-keyword kw">ensure</span>
657
+ 170: <span class="ruby-ivar">@persistent</span> = <span class="ruby-keyword kw">false</span>
658
+ 171: <span class="ruby-keyword kw">end</span>
413
659
  </pre>
414
660
  </div>
415
661
  </div>
416
662
  </div>
417
663
 
418
- <div id="method-M000034" class="method-detail">
419
- <a name="M000034"></a>
664
+ <div id="method-M000035" class="method-detail">
665
+ <a name="M000035"></a>
420
666
 
421
667
  <div class="method-heading">
422
- <a href="#M000034" class="method-signature">
668
+ <a href="#M000035" class="method-signature">
423
669
  <span class="method-name">send_response</span><span class="method-args">(status, content_type, body = nil, content_length = nil, headers = nil)</span>
424
670
  </a>
425
671
  </div>
@@ -429,36 +675,36 @@ Send a redirect response.
429
675
  Sends an <a href="../HTTP.html">HTTP</a> response.
430
676
  </p>
431
677
  <p><a class="source-toggle" href="#"
432
- onclick="toggleCode('M000034-source');return false;">[Source]</a></p>
433
- <div class="method-source-code" id="M000034-source">
678
+ onclick="toggleCode('M000035-source');return false;">[Source]</a></p>
679
+ <div class="method-source-code" id="M000035-source">
434
680
  <pre>
435
- <span class="ruby-comment cmt"># File lib/serverside/request.rb, line 108</span>
436
- 108: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">send_response</span>(<span class="ruby-identifier">status</span>, <span class="ruby-identifier">content_type</span>, <span class="ruby-identifier">body</span> = <span class="ruby-keyword kw">nil</span>, <span class="ruby-identifier">content_length</span> = <span class="ruby-keyword kw">nil</span>,
437
- 109: <span class="ruby-identifier">headers</span> = <span class="ruby-keyword kw">nil</span>)
438
- 110: <span class="ruby-identifier">h</span> = <span class="ruby-identifier">headers</span> <span class="ruby-value">? </span>
439
- 111: <span class="ruby-identifier">headers</span>.<span class="ruby-identifier">inject</span>(<span class="ruby-value str">''</span>) {<span class="ruby-operator">|</span><span class="ruby-identifier">m</span>, <span class="ruby-identifier">kv</span><span class="ruby-operator">|</span> <span class="ruby-identifier">m</span> <span class="ruby-operator">&lt;&lt;</span> (<span class="ruby-constant">Const</span><span class="ruby-operator">::</span><span class="ruby-constant">Header</span> <span class="ruby-operator">%</span> <span class="ruby-identifier">kv</span>)} <span class="ruby-operator">:</span> <span class="ruby-value str">''</span>
440
- 112:
441
- 113: <span class="ruby-identifier">content_length</span> = <span class="ruby-identifier">body</span>.<span class="ruby-identifier">length</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">content_length</span>.<span class="ruby-identifier">nil?</span> <span class="ruby-operator">&amp;&amp;</span> <span class="ruby-identifier">body</span>
442
- 114: <span class="ruby-ivar">@persistent</span> = <span class="ruby-keyword kw">false</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">content_length</span>.<span class="ruby-identifier">nil?</span>
443
- 115:
444
- 116: <span class="ruby-comment cmt"># Select the right format to use according to circumstances.</span>
445
- 117: <span class="ruby-ivar">@conn</span> <span class="ruby-operator">&lt;&lt;</span> ((<span class="ruby-ivar">@persistent</span> <span class="ruby-operator">?</span> <span class="ruby-constant">Const</span><span class="ruby-operator">::</span><span class="ruby-constant">StatusPersist</span> <span class="ruby-operator">:</span>
446
- 118: (<span class="ruby-identifier">body</span> <span class="ruby-value">? </span><span class="ruby-constant">Const</span><span class="ruby-operator">::</span><span class="ruby-constant">StatusClose</span> <span class="ruby-operator">:</span> <span class="ruby-constant">Const</span><span class="ruby-operator">::</span><span class="ruby-constant">StatusStream</span>)) <span class="ruby-operator">%</span>
447
- 119: [<span class="ruby-identifier">status</span>, <span class="ruby-identifier">content_type</span>, <span class="ruby-identifier">h</span>, <span class="ruby-ivar">@response_cookies</span>, <span class="ruby-identifier">content_length</span>])
448
- 120: <span class="ruby-ivar">@conn</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">body</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">body</span>
449
- 121: <span class="ruby-keyword kw">rescue</span>
450
- 122: <span class="ruby-ivar">@persistent</span> = <span class="ruby-keyword kw">false</span>
451
- 123: <span class="ruby-keyword kw">end</span>
681
+ <span class="ruby-comment cmt"># File lib/serverside/request.rb, line 147</span>
682
+ 147: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">send_response</span>(<span class="ruby-identifier">status</span>, <span class="ruby-identifier">content_type</span>, <span class="ruby-identifier">body</span> = <span class="ruby-keyword kw">nil</span>, <span class="ruby-identifier">content_length</span> = <span class="ruby-keyword kw">nil</span>,
683
+ 148: <span class="ruby-identifier">headers</span> = <span class="ruby-keyword kw">nil</span>)
684
+ 149: <span class="ruby-identifier">h</span> = <span class="ruby-identifier">headers</span> <span class="ruby-value">? </span>
685
+ 150: <span class="ruby-identifier">headers</span>.<span class="ruby-identifier">inject</span>(<span class="ruby-value str">''</span>) {<span class="ruby-operator">|</span><span class="ruby-identifier">m</span>, <span class="ruby-identifier">kv</span><span class="ruby-operator">|</span> <span class="ruby-identifier">m</span> <span class="ruby-operator">&lt;&lt;</span> (<span class="ruby-constant">HEADER</span> <span class="ruby-operator">%</span> <span class="ruby-identifier">kv</span>)} <span class="ruby-operator">:</span> <span class="ruby-value str">''</span>
686
+ 151:
687
+ 152: <span class="ruby-identifier">content_length</span> = <span class="ruby-identifier">body</span>.<span class="ruby-identifier">length</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">content_length</span>.<span class="ruby-identifier">nil?</span> <span class="ruby-operator">&amp;&amp;</span> <span class="ruby-identifier">body</span>
688
+ 153: <span class="ruby-ivar">@persistent</span> = <span class="ruby-keyword kw">false</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">content_length</span>.<span class="ruby-identifier">nil?</span>
689
+ 154:
690
+ 155: <span class="ruby-comment cmt"># Select the right format to use according to circumstances.</span>
691
+ 156: <span class="ruby-ivar">@socket</span> <span class="ruby-operator">&lt;&lt;</span> ((<span class="ruby-ivar">@persistent</span> <span class="ruby-operator">?</span> <span class="ruby-constant">STATUS_PERSIST</span> <span class="ruby-operator">:</span>
692
+ 157: (<span class="ruby-identifier">body</span> <span class="ruby-value">? </span><span class="ruby-constant">STATUS_CLOSE</span> <span class="ruby-operator">:</span> <span class="ruby-constant">STATUS_STREAM</span>)) <span class="ruby-operator">%</span>
693
+ 158: [<span class="ruby-identifier">status</span>, <span class="ruby-constant">Time</span>.<span class="ruby-identifier">now</span>.<span class="ruby-identifier">httpdate</span>, <span class="ruby-identifier">content_type</span>, <span class="ruby-identifier">h</span>, <span class="ruby-ivar">@response_cookies</span>, <span class="ruby-identifier">content_length</span>])
694
+ 159: <span class="ruby-ivar">@socket</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">body</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">body</span>
695
+ 160: <span class="ruby-keyword kw">rescue</span>
696
+ 161: <span class="ruby-ivar">@persistent</span> = <span class="ruby-keyword kw">false</span>
697
+ 162: <span class="ruby-keyword kw">end</span>
452
698
  </pre>
453
699
  </div>
454
700
  </div>
455
701
  </div>
456
702
 
457
- <div id="method-M000037" class="method-detail">
458
- <a name="M000037"></a>
703
+ <div id="method-M000038" class="method-detail">
704
+ <a name="M000038"></a>
459
705
 
460
706
  <div class="method-heading">
461
- <a href="#M000037" class="method-signature">
707
+ <a href="#M000038" class="method-signature">
462
708
  <span class="method-name">set_cookie</span><span class="method-args">(name, value, expires)</span>
463
709
  </a>
464
710
  </div>
@@ -468,24 +714,24 @@ Sends an <a href="../HTTP.html">HTTP</a> response.
468
714
  Sets a cookie to be included in the response.
469
715
  </p>
470
716
  <p><a class="source-toggle" href="#"
471
- onclick="toggleCode('M000037-source');return false;">[Source]</a></p>
472
- <div class="method-source-code" id="M000037-source">
717
+ onclick="toggleCode('M000038-source');return false;">[Source]</a></p>
718
+ <div class="method-source-code" id="M000038-source">
473
719
  <pre>
474
- <span class="ruby-comment cmt"># File lib/serverside/request.rb, line 139</span>
475
- 139: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">set_cookie</span>(<span class="ruby-identifier">name</span>, <span class="ruby-identifier">value</span>, <span class="ruby-identifier">expires</span>)
476
- 140: <span class="ruby-ivar">@response_cookies</span> <span class="ruby-operator">||=</span> <span class="ruby-value str">&quot;&quot;</span>
477
- 141: <span class="ruby-ivar">@response_cookies</span> <span class="ruby-operator">&lt;&lt;</span> (<span class="ruby-constant">Const</span><span class="ruby-operator">::</span><span class="ruby-constant">SetCookie</span> <span class="ruby-operator">%</span> [<span class="ruby-identifier">name</span>, <span class="ruby-identifier">value</span>.<span class="ruby-identifier">to_s</span>.<span class="ruby-identifier">uri_escape</span>, <span class="ruby-identifier">expires</span>.<span class="ruby-identifier">rfc2822</span>])
478
- 142: <span class="ruby-keyword kw">end</span>
720
+ <span class="ruby-comment cmt"># File lib/serverside/request.rb, line 179</span>
721
+ 179: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">set_cookie</span>(<span class="ruby-identifier">name</span>, <span class="ruby-identifier">value</span>, <span class="ruby-identifier">expires</span>)
722
+ 180: <span class="ruby-ivar">@response_cookies</span> <span class="ruby-operator">||=</span> <span class="ruby-value str">&quot;&quot;</span>
723
+ 181: <span class="ruby-ivar">@response_cookies</span> <span class="ruby-operator">&lt;&lt;</span> (<span class="ruby-constant">SET_COOKIE</span> <span class="ruby-operator">%</span> [<span class="ruby-identifier">name</span>, <span class="ruby-identifier">value</span>.<span class="ruby-identifier">to_s</span>.<span class="ruby-identifier">uri_escape</span>, <span class="ruby-identifier">expires</span>.<span class="ruby-identifier">rfc2822</span>])
724
+ 182: <span class="ruby-keyword kw">end</span>
479
725
  </pre>
480
726
  </div>
481
727
  </div>
482
728
  </div>
483
729
 
484
- <div id="method-M000036" class="method-detail">
485
- <a name="M000036"></a>
730
+ <div id="method-M000037" class="method-detail">
731
+ <a name="M000037"></a>
486
732
 
487
733
  <div class="method-heading">
488
- <a href="#M000036" class="method-signature">
734
+ <a href="#M000037" class="method-signature">
489
735
  <span class="method-name">stream</span><span class="method-args">(body)</span>
490
736
  </a>
491
737
  </div>
@@ -495,13 +741,13 @@ Sets a cookie to be included in the response.
495
741
  Streams additional data to the client.
496
742
  </p>
497
743
  <p><a class="source-toggle" href="#"
498
- onclick="toggleCode('M000036-source');return false;">[Source]</a></p>
499
- <div class="method-source-code" id="M000036-source">
744
+ onclick="toggleCode('M000037-source');return false;">[Source]</a></p>
745
+ <div class="method-source-code" id="M000037-source">
500
746
  <pre>
501
- <span class="ruby-comment cmt"># File lib/serverside/request.rb, line 134</span>
502
- 134: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">stream</span>(<span class="ruby-identifier">body</span>)
503
- 135: (<span class="ruby-ivar">@conn</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">body</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">body</span>) <span class="ruby-keyword kw">rescue</span> (<span class="ruby-ivar">@persistent</span> = <span class="ruby-keyword kw">false</span>)
504
- 136: <span class="ruby-keyword kw">end</span>
747
+ <span class="ruby-comment cmt"># File lib/serverside/request.rb, line 174</span>
748
+ 174: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">stream</span>(<span class="ruby-identifier">body</span>)
749
+ 175: (<span class="ruby-ivar">@socket</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">body</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">body</span>) <span class="ruby-keyword kw">rescue</span> (<span class="ruby-ivar">@persistent</span> = <span class="ruby-keyword kw">false</span>)
750
+ 176: <span class="ruby-keyword kw">end</span>
505
751
  </pre>
506
752
  </div>
507
753
  </div>