serverside 0.3.1 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/spec/http_spec.rb ADDED
@@ -0,0 +1,259 @@
1
+ require File.join(File.dirname(__FILE__), '../lib/serverside')
2
+
3
+ include ServerSide::HTTP
4
+
5
+ class SpecHTTPServer
6
+ include Server
7
+
8
+ attr_accessor :in, :state, :request_headers, :request_header_count,
9
+ :request_cookies, :response_headers
10
+
11
+ attr_accessor :method, :uri, :query, :http_version
12
+ attr_accessor :params, :persistent, :content_length
13
+
14
+ def initialize
15
+ reset
16
+ end
17
+
18
+ def reset
19
+ post_init
20
+ @response = ''
21
+ @closed = false
22
+ end
23
+
24
+ attr_reader :response, :closed
25
+
26
+ def send_data(data)
27
+ @response << data
28
+ end
29
+
30
+ def close_connection_after_writing
31
+ @closed = true
32
+ end
33
+
34
+ def send_error_response(e)
35
+ raise e
36
+ end
37
+ end
38
+
39
+ context "An HTTP Request should be considered malformed" do
40
+ setup do
41
+ @server = SpecHTTPServer.new
42
+ end
43
+
44
+ specify "if the request-line size is too big" do
45
+ l = "GET /#{'x' * (MAX_REQUEST_LINE_SIZE - 12)}"
46
+ proc {@server.receive_data(l)}.should_not raise_error(MalformedRequestError)
47
+
48
+ @server.reset
49
+ l = "GET /#{'x' * MAX_REQUEST_LINE_SIZE}"
50
+ proc {@server.receive_data(l)}.should raise_error(MalformedRequestError)
51
+ end
52
+
53
+ specify "if the request-line is malformed" do
54
+ l = "abcde\r\n"
55
+ proc {@server.receive_data(l)}.should raise_error(MalformedRequestError)
56
+
57
+ @server.reset
58
+ l = "GET /\r\n"
59
+ proc {@server.receive_data(l)}.should raise_error(MalformedRequestError)
60
+
61
+ @server.reset
62
+ l = "GET HTTP/\r\n"
63
+ proc {@server.receive_data(l)}.should raise_error(MalformedRequestError)
64
+ end
65
+
66
+ specify "if the header count is too big" do
67
+ l = "GET / HTTP/1.1\r\n" + "Accept: *\r\n" * (MAX_HEADER_COUNT - 1)
68
+ proc {@server.receive_data(l)}.should_not raise_error(MalformedRequestError)
69
+
70
+ @server.reset
71
+ l = "GET / HTTP/1.1\r\n" + "Accept: *\r\n" * (MAX_HEADER_COUNT + 10)
72
+ proc {@server.receive_data(l)}.should raise_error(MalformedRequestError)
73
+ end
74
+
75
+ specify "if a header is too big" do
76
+ l = "GET / HTTP/1.1\r\n#{'x' * MAX_HEADER_SIZE}: 1\r\n"
77
+ proc {@server.receive_data(l)}.should raise_error(MalformedRequestError)
78
+ end
79
+
80
+ specify "if a header is malformed" do
81
+ l = %[GET / HTTP/1.1\r\ntest: 231\r\n]
82
+ proc {@server.receive_data(l)}.should_not raise_error(MalformedRequestError)
83
+
84
+ @server.reset
85
+ l = %[GET / HTTP/1.1\r\nmitchesunu no haha\r\n]
86
+ proc {@server.receive_data(l)}.should raise_error(MalformedRequestError)
87
+ end
88
+
89
+ specify "if it contains a malformed cookie header" do
90
+ l = %[GET / HTTP/1.1\r\nCookie: a=b\r\n]
91
+ proc {@server.receive_data(l)}.should_not raise_error(MalformedRequestError)
92
+
93
+ @server.reset
94
+ l = %[GET / HTTP/1.1\r\nCookie: zzxxcc\r\n]
95
+ proc {@server.receive_data(l)}.should raise_error(MalformedRequestError)
96
+ end
97
+ end
98
+
99
+ context "A server in the initial state" do
100
+ setup do
101
+ @server = SpecHTTPServer.new
102
+ end
103
+
104
+ specify "should initialize all header-related variables" do
105
+ @server.request_headers = {1 => 2}
106
+ @server.request_header_count = 20
107
+ @server.request_cookies = {:z => :y}
108
+ @server.response_headers = [1, 2, 3]
109
+
110
+ @server.set_state(:state_initial)
111
+ @server.request_headers.should == {}
112
+ @server.request_header_count.should == 0
113
+ @server.request_cookies.should == {}
114
+ @server.response_headers.should == []
115
+ end
116
+
117
+ specify "should transition to state_request_line" do
118
+ @server.set_state(:state_initial)
119
+ @server.state.should == :state_request_line
120
+ end
121
+ end
122
+
123
+ context "A server in the request_line state" do
124
+ setup do
125
+ @server = SpecHTTPServer.new
126
+ end
127
+
128
+ specify "should wait for a CRLF before parsing the request line" do
129
+ @server.receive_data("GET ")
130
+ @server.state.should == :state_request_line
131
+ @server.receive_data("/ ")
132
+ @server.state.should == :state_request_line
133
+ @server.receive_data("HTTP/1.1")
134
+ @server.state.should == :state_request_line
135
+
136
+ @server.receive_data("\r\n")
137
+ @server.state.should_not == :state_request_line
138
+ end
139
+
140
+ specify "should extract method, uri, query and http version from the request line" do
141
+ @server.receive_data("GET /abc?q=z HTTP/1.1\r\n")
142
+ @server.method.should == :get
143
+ @server.uri.should == '/abc'
144
+ @server.query.should == 'q=z'
145
+ @server.http_version.should == '1.1'
146
+ end
147
+
148
+ specify "should set persistent to true if the http version is 1.1" do
149
+ @server.receive_data("GET / HTTP/1.1\r\n")
150
+ @server.persistent.should be_true
151
+
152
+ @server.reset
153
+ @server.receive_data("GET / HTTP/1.0\r\n")
154
+ @server.persistent.should be_false
155
+ end
156
+
157
+ specify "should parse the query into params and unescape the values" do
158
+ @server.receive_data("GET /?x=1&y=2%203 HTTP/1.1\r\n")
159
+ @server.params.should == {:x => '1', :y => '2 3'}
160
+ end
161
+
162
+ specify "should transition to state_request_headers" do
163
+ @server.state.should == :state_request_line
164
+ @server.receive_data("GET / HTTP/1.1\r\n")
165
+ @server.state.should == :state_request_headers
166
+ end
167
+
168
+ specify "should raise MalformedRequestError on invalid request line size" do
169
+ proc {@server.receive_data("abc" * MAX_REQUEST_LINE_SIZE)}.should \
170
+ raise_error(MalformedRequestError)
171
+ end
172
+
173
+ specify "should raise MalformedRequestError if the request line is invalid" do
174
+ proc {@server.receive_data("GET\r\n")}.should raise_error(MalformedRequestError)
175
+
176
+ @server.reset
177
+ proc {@server.receive_data("GET /\r\n")}.should raise_error(MalformedRequestError)
178
+
179
+ @server.reset
180
+ proc {@server.receive_data("GET / 1.1\r\n")}.should raise_error(MalformedRequestError)
181
+
182
+ @server.reset
183
+ proc {@server.receive_data("GET ?q=1 HTTP/1.1\r\n")}.should raise_error(MalformedRequestError)
184
+
185
+ @server.reset
186
+ proc {@server.receive_data("GET / HTTP 1.1\r\n")}.should raise_error(MalformedRequestError)
187
+ end
188
+ end
189
+
190
+ context "A server in the request_headers state" do
191
+ setup do
192
+ @server = SpecHTTPServer.new
193
+
194
+ m = Module.new do
195
+ define_method(:state_response) {}
196
+ end
197
+ @server.extend(m)
198
+ @server.receive_data("GET / HTTP/1.1\r\n")
199
+ end
200
+
201
+ specify "should parse each header as it arrives" do
202
+ @server.receive_data("Accept: text/xml\r\n")
203
+ @server.request_headers.should == {'Accept' => 'text/xml'}
204
+ @server.request_header_count.should == 1
205
+
206
+ @server.receive_data("Cookie: x=1\r\n")
207
+ @server.request_headers.should == {'Accept' => 'text/xml', 'Cookie' => 'x=1'}
208
+ @server.request_header_count.should == 2
209
+ end
210
+
211
+ specify "should parse the Content-Length header into content_length" do
212
+ @server.receive_data("Content-Length: 1234\r\n")
213
+ @server.content_length.should == 1234
214
+ end
215
+
216
+ specify "should set persistent if a Connection header is received" do
217
+ # HTTP 1.0 mode
218
+ @server.persistent = false
219
+ @server.receive_data("Connection: keep-alive\r\n")
220
+ @server.persistent.should be_true
221
+
222
+ @server.reset
223
+ @server.receive_data("GET / HTTP/1.1\r\n")
224
+ @server.receive_data("Connection: close\r\n")
225
+ @server.persistent.should be_false
226
+
227
+ @server.reset
228
+ @server.receive_data("GET / HTTP/1.1\r\n")
229
+ @server.receive_data("Connection: xxxxzzzz\r\n")
230
+ @server.persistent.should be_false
231
+ end
232
+
233
+ specify "Should parse the Cookie header" do
234
+ @server.receive_data("Cookie: x=1; y=2%203\r\n")
235
+ @server.request_cookies.should == {:x => '1', :y => '2 3'}
236
+ end
237
+
238
+ specify "should transition to stat_response once an empty line is received" do
239
+ @server.receive_data("Connection: close\r\n")
240
+ @server.state.should == :state_request_headers
241
+
242
+ @server.receive_data("\r\n")
243
+ @server.state.should == :state_response
244
+ end
245
+
246
+ specify "should transition to state_request_body if content-length was given" do
247
+ @server.receive_data("Content-Length: 13\r\n\r\n")
248
+ @server.state.should == :state_request_body
249
+ end
250
+
251
+ specify "should raise MalformedRequestError on invalid header size" do
252
+ proc {@server.receive_data("#{'x' * MAX_HEADER_SIZE}: 13\r\n\r\n")}.should \
253
+ raise_error(MalformedRequestError)
254
+ end
255
+
256
+ specify "should raise MalformedRequestError on malformed header" do
257
+ proc {@server.receive_data("abc\r\n")}.should raise_error(MalformedRequestError)
258
+ end
259
+ end
@@ -1,3 +1,5 @@
1
+ __END__
2
+
1
3
  require File.join(File.dirname(__FILE__), '../lib/serverside')
2
4
  require 'stringio'
3
5
  require 'fileutils'
@@ -31,7 +33,7 @@ context "ServerSide::Template.set" do
31
33
  a.should_be_a_kind_of Array
32
34
  a.size.should == 2
33
35
  a.first.should_be t
34
- a.last.should_be_a_kind_of ERB
36
+ a.last.should_be_a_kind_of Erubis::Eruby
35
37
  end
36
38
 
37
39
  specify "should set stamp to nil by default" do
@@ -39,7 +41,7 @@ context "ServerSide::Template.set" do
39
41
  Template.templates['test'].first.should_be_nil
40
42
  end
41
43
 
42
- specify "should construct a new ERB instance with the body" do
44
+ specify "should construct a new Erubis::Eruby instance with the body" do
43
45
  Template.set('test', 'yo')
44
46
  Template.templates['test'].last.result(binding).should == 'yo'
45
47
  end
@@ -55,18 +57,18 @@ context "ServerSide::Template.validate" do
55
57
  specify "should load a file as template if the name references a file" do
56
58
  Template.reset
57
59
  t = Template.validate(__FILE__)
58
- t.should_be_a_kind_of ERB
60
+ t.should_be_a_kind_of Erubis::Eruby
59
61
  t.result(binding).should == IO.read(__FILE__)
60
62
  Template.templates.size.should == 1
61
63
  t = Template.templates[__FILE__]
62
64
  t.first.should == File.mtime(__FILE__)
63
- t.last.should_be_a_kind_of ERB
65
+ t.last.should_be_a_kind_of Erubis::Eruby
64
66
  end
65
67
 
66
- specify "should return the ERB instance for an existing template" do
68
+ specify "should return the Erubis::Eruby instance for an existing template" do
67
69
  Template.reset
68
70
  t = Template.validate(__FILE__)
69
- t.should_be_a_kind_of ERB
71
+ t.should_be_a_kind_of Erubis::Eruby
70
72
  t.result(binding).should == IO.read(__FILE__)
71
73
  end
72
74
 
@@ -120,7 +122,7 @@ context "ServerSide::Template.render" do
120
122
  FileUtils.rm('tmp')
121
123
  end
122
124
 
123
- specify "should pass the binding to the ERB instance for processing" do
125
+ specify "should pass the binding to the Erubis::Eruby instance for processing" do
124
126
  @x = 23
125
127
  Template.reset
126
128
  Template.set('test', '<' + '%= @x %' + '>')
metadata CHANGED
@@ -1,17 +1,17 @@
1
1
  --- !ruby/object:Gem::Specification
2
- rubygems_version: 0.9.0
2
+ rubygems_version: 0.9.2
3
3
  specification_version: 1
4
4
  name: serverside
5
5
  version: !ruby/object:Gem::Version
6
- version: 0.3.1
7
- date: 2006-11-27 00:00:00 +02:00
8
- summary: Performance-oriented web framework.
6
+ version: 0.4.1
7
+ date: 2007-08-09 00:00:00 +03:00
8
+ summary: Fast Ruby HTTP Server.
9
9
  require_paths:
10
10
  - lib
11
11
  email: ciconia@gmail.com
12
12
  homepage: http://code.google.com/p/serverside/
13
13
  rubyforge_project:
14
- description: Performance-oriented web framework.
14
+ description: Fast Ruby HTTP Server.
15
15
  autorequire:
16
16
  default_executable:
17
17
  bindir: bin
@@ -20,7 +20,7 @@ required_ruby_version: !ruby/object:Gem::Version::Requirement
20
20
  requirements:
21
21
  - - ">="
22
22
  - !ruby/object:Gem::Version
23
- version: 1.8.2
23
+ version: 1.8.5
24
24
  version:
25
25
  platform: ruby
26
26
  signing_key:
@@ -33,38 +33,35 @@ files:
33
33
  - README
34
34
  - Rakefile
35
35
  - bin/serverside
36
+ - doc/rdoc
37
+ - spec/daemon_spec.rb
36
38
  - spec/core_ext_spec.rb
37
- - spec/connection_spec.rb
38
- - spec/caching_spec.rb
39
- - spec/request_spec.rb
40
39
  - spec/template_spec.rb
41
- - spec/static_spec.rb
42
- - spec/server_spec.rb
43
- - spec/routing_spec.rb
44
- - spec/controllers_spec.rb
45
- - spec/daemon_spec.rb
46
- - spec/cluster_spec.rb
47
- - lib/serverside.rb
40
+ - spec/http_spec.rb
48
41
  - lib/serverside
49
- - lib/serverside/server.rb
42
+ - lib/serverside/http
43
+ - lib/serverside/http/caching.rb
44
+ - lib/serverside/http/const.rb
45
+ - lib/serverside/http/error.rb
46
+ - lib/serverside/http/parsing.rb
47
+ - lib/serverside/http/response.rb
48
+ - lib/serverside/http/server.rb
49
+ - lib/serverside/http/static.rb
50
+ - lib/serverside/http.rb
51
+ - lib/serverside/xml.rb
52
+ - lib/serverside/cluster.rb
53
+ - lib/serverside/log.rb
50
54
  - lib/serverside/daemon.rb
51
- - lib/serverside/application.rb
52
55
  - lib/serverside/core_ext.rb
53
- - lib/serverside/connection.rb
54
- - lib/serverside/cluster.rb
55
- - lib/serverside/static.rb
56
- - lib/serverside/routing.rb
57
56
  - lib/serverside/template.rb
58
- - lib/serverside/request.rb
59
- - lib/serverside/caching.rb
60
- - lib/serverside/controllers.rb
61
- - CHANGELOG
57
+ - lib/serverside/js.rb
58
+ - lib/serverside.rb
62
59
  test_files: []
63
60
 
64
61
  rdoc_options:
65
62
  - --quiet
66
63
  - --title
67
- - ServerSide Documentation
64
+ - "ServerSide: a Fast Ruby Web Framework"
68
65
  - --opname
69
66
  - index.html
70
67
  - --line-numbers
@@ -77,7 +74,6 @@ rdoc_options:
77
74
  - lib/serverside.rb
78
75
  extra_rdoc_files:
79
76
  - README
80
- - CHANGELOG
81
77
  - COPYING
82
78
  executables:
83
79
  - serverside
@@ -86,6 +82,24 @@ extensions: []
86
82
  requirements: []
87
83
 
88
84
  dependencies:
85
+ - !ruby/object:Gem::Dependency
86
+ name: eventmachine
87
+ version_requirement:
88
+ version_requirements: !ruby/object:Gem::Version::Requirement
89
+ requirements:
90
+ - - ">"
91
+ - !ruby/object:Gem::Version
92
+ version: 0.0.0
93
+ version:
94
+ - !ruby/object:Gem::Dependency
95
+ name: erubis
96
+ version_requirement:
97
+ version_requirements: !ruby/object:Gem::Version::Requirement
98
+ requirements:
99
+ - - ">"
100
+ - !ruby/object:Gem::Version
101
+ version: 0.0.0
102
+ version:
89
103
  - !ruby/object:Gem::Dependency
90
104
  name: metaid
91
105
  version_requirement:
data/CHANGELOG DELETED
@@ -1,261 +0,0 @@
1
- *0.3.1*
2
-
3
- * Removed application.rb file and fixed serverside script.
4
-
5
- * Fixed bug in Caching.validate_stamp where the expiry stamp would be the file stamp + max_age - leading to stale resources.
6
-
7
- *0.3.0*
8
-
9
- * Disabled cluster_spec and parts of daemon_spec for now due to strange forking behavior.
10
-
11
- * Removed static file cache from Static.
12
-
13
- * Fixed daemon_spec to work correctly.
14
-
15
- * Removed all tests, moved specs to /spec, and fixed rakefile.
16
-
17
- * Converted cluster_test to cluster_spec.
18
-
19
- * Converted daemon_test to daemon_spec.
20
-
21
- * Updated specs to work with RSpec 0.7.
22
-
23
- * Changed rake spec task to do coverage as well.
24
-
25
- * Renamed controller.rb to controllers.rb.
26
-
27
- * Added String.underscore method.
28
-
29
- * Renamed ServerSide::Controller.process to response.
30
-
31
- * Improved HTTP caching code to better conform to the HTTP spec. Also improved the validate_cache method to work without a block as well.
32
-
33
- * Removed unit tests that were converted to specs.
34
-
35
- * Router now expects handlers to return non-nil if the request was handled. Otherwise, the request goes to the next handler with an appropriate rule.
36
-
37
- * Improved spec coverage for caching.
38
-
39
- * Wrote Server spec.
40
-
41
- * Wrote Router spec.
42
-
43
- * Refactored HTTP::Server to allow creating instances without starting them.
44
-
45
- * Fixed Router.routes_defined? to return non-nil if default route is defined.
46
-
47
- * Renamed Router.has_routes? to routes_defined?.
48
-
49
- * Fixed Static.serve_template and Static.serve_static to work correctly (render templates.)
50
-
51
- * Removed deprecated code in Template.render.
52
-
53
- * Wrote Static spec.
54
-
55
- * Fixed bug in serverside script - wrong call to route_default instead of default_route.
56
-
57
- * Refactored ServerSide::Template and wrote template spec.
58
-
59
- * Added documentation to Controller.
60
-
61
- * Fixed Controller.mount to build a self.inherited method, and do the routing there.
62
-
63
- ==0.2.9
64
-
65
- * Improved rake clean task.
66
-
67
- * Added HTTP::Request.send_file method.
68
-
69
- * Added basic rendering capabilities to ServerSide::Controller.
70
-
71
- * Added support for lambda rules in ServerSide::Controller.mount.
72
-
73
- * Start work on controller class.
74
-
75
- * Renamed Router.route_default to default_route.
76
-
77
- * Fixed small errors in documentation.
78
-
79
- * Changed ServerSide::Static.serve_static to look for index.html inside directory before serving the directory.
80
-
81
- * Added HTTP::Caching.cache_etags and cache_stamp methods.
82
-
83
- * Fixed bug in doc_rforge rake task.
84
-
85
- * Rewrote request unit test into request spec.
86
-
87
- ==0.2.8
88
-
89
- * Refactored ServerSide::Static to use HTTP::Caching code.
90
-
91
- * Added spec coverage rake task.
92
-
93
- * Added HTTP::Caching module.
94
-
95
- * Added response_headers attribute to HTTP::Request.
96
-
97
- * Refactored ServerSide::Static constants.
98
-
99
- * Renamed ServerSide::StaticFiles to ServerSide::Static.
100
-
101
- * Added static_server.rb script.
102
-
103
- ==0.2.7
104
-
105
- * Wrote spec for HTTP::Connection.
106
-
107
- * Added spec files to rake stats reporting.
108
-
109
- * Changed @conn to @socket in both HTTP::Connection and HTTP::Request for better readability.
110
-
111
- * Wrote functional test for request body (but at least some of the testing should be in a unit test.)
112
-
113
- * Added request body parsing (both URL-encoded and multipart.)
114
-
115
- * Moved all HTTP::Const constants into HTTP::Request.
116
-
117
- * Added Date to response headers. This is needed for caching to work correctly.
118
-
119
- * Fixed bug in serverside script that caused an exception when specifying port number.
120
-
121
- ==0.2.6
122
-
123
- * Refactored HTTP-related code into a new HTTP::Request class and a simplified HTTP::Connection.
124
-
125
- * Another small change to docs.
126
-
127
- * Fixed small error in Rakefile that prevented doc_rforge task from updating the docs.
128
-
129
- * Fixed minor documentation error.
130
-
131
- ==0.2.5
132
-
133
- * Added template serving to static file module.
134
-
135
- * Wrote a simple ERB template system.
136
-
137
- * More documentation tweaks.
138
-
139
- * Changed how response cookies are formatted for somewhat better performance.
140
-
141
- * Updated documentation.
142
-
143
- * Removed deprecated code in lib/serverside/application.rb.
144
-
145
- * Added HTTP cookie functionality (parse, set and delete.)
146
-
147
- * Updated rakefile to include a spec task, as well as an rcov task. Updated test task to include spec and rcov tasks.
148
-
149
- * Started writing RSpec tests. This looks like a very interesting concept.
150
-
151
- * Added /test/spec directory.
152
-
153
- ==0.2.0
154
-
155
- * Updated RFuzz script to work, but it doesn't still do anything interesting.
156
-
157
- * Added a serve command to serverside script.
158
-
159
- * Changed substition of embedded parameters from (.*) to (.+).
160
-
161
- * Added rule compilation after setting the default handler.
162
-
163
- * Added doc_rforge rake task (for updating the docs on rubyforge.org).
164
-
165
- * Added stats and svn_add rake tasks.
166
-
167
- * Fixed routing unit tests.
168
-
169
- * Added Router.has_routes? method.
170
-
171
- * Finished unit tests for routing.
172
-
173
- * Added Connection::Base.redirect.
174
-
175
- * Added routing code from /research/routing, implemented functional test.
176
-
177
- * Learned about the (?:) modifier and fixed the request parsing regexp.
178
-
179
- * Added a profiled version of a static server - /test/functional/static_profile.rb.
180
-
181
- * Added freezing of HTTP headers.
182
-
183
- * Small change to documentation.
184
-
185
- * Changed filename for cluster pid file to serverside_cluster.pid.
186
-
187
- * Added documentation.
188
-
189
- * Fixed require in serverside script to load the gem.
190
-
191
- * Fixed the Daemon pid file for static file server mode.
192
-
193
- * Added directory listing to static file server.
194
-
195
- * Fixed request header parsing Regexp so a trailing slash would be ignored.
196
-
197
- * Added static application. Using the binary script in static mode works.
198
-
199
- * Added cluster class with unit tests.
200
-
201
- * Added unit tests for static server.
202
-
203
- * Added static server functional test.
204
-
205
- * Added static file serving code.
206
-
207
- * Renamed ServerSide::Request to ServerSide::Connection. This is more appropriate.
208
-
209
- * Added functional static server test.
210
-
211
- * Added test/functional for functional tests. Updated Rakefile.
212
-
213
- * Added Request.send_response and stream.
214
-
215
- * Added faster Symbol.to_s to core_ext.
216
-
217
- * Added HTTP parsing code with unit tests.
218
-
219
- * More unit tests for application code.
220
-
221
- * Basic server code works with unit tests.
222
-
223
- * Added option parsing to serverside script.
224
-
225
- * Added daemon code and unit tests.
226
-
227
- ==0.1
228
-
229
- * Added host attribute to Controller::Request.
230
-
231
- * Added ability to create rules on any request attribute, not just path.
232
-
233
- * Added ability to mount controllers with a block for a rule.
234
-
235
- * Wrote object extensions to create frozen constants on the fly.
236
-
237
- * Changed DirHandler to use frozen strings for cache header.
238
-
239
- * Hooked Mongrel server to Controller::Router.
240
-
241
- * Imported request code with unit tests.
242
-
243
- * Wrote unit tests for daemon module.
244
-
245
- * Wrote unit tests for controller routing code.
246
-
247
- * Refactored controller routing code.
248
-
249
- * Imported unit tests for extensions.
250
-
251
- * Created Rakefile.
252
-
253
- * Prototypical routing code.
254
-
255
- * Fixed location of daemon pid files.
256
-
257
- * Imported Mongrel code from Reality project.
258
-
259
- * Imported extensions from Reality project.
260
-
261
- * Implemented daemon and server cluster.