serverside 0.2.6 → 0.2.7

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