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/README +15 -11
- data/Rakefile +18 -18
- data/bin/serverside +20 -16
- data/lib/serverside/cluster.rb +4 -33
- data/lib/serverside/core_ext.rb +56 -7
- data/lib/serverside/daemon.rb +10 -17
- data/lib/serverside/http/caching.rb +79 -0
- data/lib/serverside/http/const.rb +69 -0
- data/lib/serverside/http/error.rb +24 -0
- data/lib/serverside/http/parsing.rb +175 -0
- data/lib/serverside/http/response.rb +91 -0
- data/lib/serverside/http/server.rb +194 -0
- data/lib/serverside/http/static.rb +72 -0
- data/lib/serverside/http.rb +14 -0
- data/lib/serverside/js.rb +173 -0
- data/lib/serverside/log.rb +79 -0
- data/lib/serverside/template.rb +5 -4
- data/lib/serverside/xml.rb +84 -0
- data/lib/serverside.rb +11 -2
- data/spec/core_ext_spec.rb +13 -58
- data/spec/daemon_spec.rb +61 -28
- data/spec/http_spec.rb +259 -0
- data/spec/template_spec.rb +9 -7
- metadata +42 -28
- data/CHANGELOG +0 -261
- data/lib/serverside/application.rb +0 -26
- data/lib/serverside/caching.rb +0 -91
- data/lib/serverside/connection.rb +0 -34
- data/lib/serverside/controllers.rb +0 -91
- data/lib/serverside/request.rb +0 -210
- data/lib/serverside/routing.rb +0 -133
- data/lib/serverside/server.rb +0 -27
- data/lib/serverside/static.rb +0 -82
- data/spec/caching_spec.rb +0 -318
- data/spec/cluster_spec.rb +0 -140
- data/spec/connection_spec.rb +0 -59
- data/spec/controllers_spec.rb +0 -142
- data/spec/request_spec.rb +0 -288
- data/spec/routing_spec.rb +0 -240
- data/spec/server_spec.rb +0 -40
- data/spec/static_spec.rb +0 -279
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
|
data/spec/template_spec.rb
CHANGED
@@ -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
|
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
|
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
|
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
|
65
|
+
t.last.should_be_a_kind_of Erubis::Eruby
|
64
66
|
end
|
65
67
|
|
66
|
-
specify "should return the
|
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
|
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
|
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.
|
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.
|
7
|
-
date:
|
8
|
-
summary:
|
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:
|
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.
|
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/
|
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/
|
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/
|
59
|
-
- lib/serverside
|
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
|
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.
|