rack 1.0.1 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of rack might be problematic. Click here for more details.

Files changed (82) hide show
  1. data/COPYING +1 -1
  2. data/KNOWN-ISSUES +3 -0
  3. data/RDOX +0 -428
  4. data/README +61 -26
  5. data/SPEC +8 -1
  6. data/bin/rackup +2 -174
  7. data/lib/rack.rb +10 -8
  8. data/lib/rack/builder.rb +17 -0
  9. data/lib/rack/cascade.rb +17 -12
  10. data/lib/rack/chunked.rb +2 -2
  11. data/lib/rack/commonlogger.rb +31 -43
  12. data/lib/rack/config.rb +15 -0
  13. data/lib/rack/content_type.rb +1 -1
  14. data/lib/rack/directory.rb +6 -2
  15. data/lib/rack/etag.rb +23 -0
  16. data/lib/rack/file.rb +4 -2
  17. data/lib/rack/handler.rb +19 -0
  18. data/lib/rack/handler/cgi.rb +1 -1
  19. data/lib/rack/handler/fastcgi.rb +2 -3
  20. data/lib/rack/handler/lsws.rb +4 -1
  21. data/lib/rack/handler/mongrel.rb +8 -5
  22. data/lib/rack/handler/scgi.rb +4 -4
  23. data/lib/rack/handler/webrick.rb +2 -4
  24. data/lib/rack/lint.rb +44 -15
  25. data/lib/rack/logger.rb +20 -0
  26. data/lib/rack/mime.rb +3 -1
  27. data/lib/rack/mock.rb +30 -4
  28. data/lib/rack/nulllogger.rb +18 -0
  29. data/lib/rack/reloader.rb +4 -1
  30. data/lib/rack/request.rb +40 -15
  31. data/lib/rack/response.rb +5 -39
  32. data/lib/rack/runtime.rb +27 -0
  33. data/lib/rack/sendfile.rb +142 -0
  34. data/lib/rack/server.rb +212 -0
  35. data/lib/rack/session/abstract/id.rb +3 -5
  36. data/lib/rack/session/cookie.rb +3 -4
  37. data/lib/rack/session/memcache.rb +53 -43
  38. data/lib/rack/session/pool.rb +1 -1
  39. data/lib/rack/urlmap.rb +9 -8
  40. data/lib/rack/utils.rb +230 -11
  41. data/rack.gemspec +33 -49
  42. data/test/spec_rack_cascade.rb +3 -5
  43. data/test/spec_rack_cgi.rb +3 -3
  44. data/test/spec_rack_commonlogger.rb +39 -10
  45. data/test/spec_rack_config.rb +24 -0
  46. data/test/spec_rack_directory.rb +1 -1
  47. data/test/spec_rack_etag.rb +17 -0
  48. data/test/spec_rack_fastcgi.rb +2 -2
  49. data/test/spec_rack_file.rb +1 -1
  50. data/test/spec_rack_lint.rb +26 -19
  51. data/test/spec_rack_logger.rb +21 -0
  52. data/test/spec_rack_mock.rb +87 -1
  53. data/test/spec_rack_mongrel.rb +4 -4
  54. data/test/spec_rack_nulllogger.rb +13 -0
  55. data/test/spec_rack_request.rb +47 -6
  56. data/test/spec_rack_response.rb +3 -0
  57. data/test/spec_rack_runtime.rb +35 -0
  58. data/test/spec_rack_sendfile.rb +86 -0
  59. data/test/spec_rack_session_cookie.rb +1 -10
  60. data/test/spec_rack_session_memcache.rb +53 -20
  61. data/test/spec_rack_urlmap.rb +30 -0
  62. data/test/spec_rack_utils.rb +171 -6
  63. data/test/spec_rack_webrick.rb +4 -4
  64. data/test/spec_rackup.rb +154 -0
  65. metadata +37 -79
  66. data/Rakefile +0 -164
  67. data/lib/rack/auth/openid.rb +0 -480
  68. data/test/cgi/lighttpd.conf +0 -20
  69. data/test/cgi/test +0 -9
  70. data/test/cgi/test.fcgi +0 -8
  71. data/test/cgi/test.ru +0 -7
  72. data/test/multipart/binary +0 -0
  73. data/test/multipart/empty +0 -10
  74. data/test/multipart/ie +0 -6
  75. data/test/multipart/nested +0 -10
  76. data/test/multipart/none +0 -9
  77. data/test/multipart/semicolon +0 -6
  78. data/test/multipart/text +0 -10
  79. data/test/spec_rack_auth_openid.rb +0 -84
  80. data/test/testrequest.rb +0 -57
  81. data/test/unregistered_handler/rack/handler/unregistered.rb +0 -7
  82. data/test/unregistered_handler/rack/handler/unregistered_long_one.rb +0 -7
data/COPYING CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2007, 2008, 2009 Christian Neukirchen <purl.org/net/chneukirchen>
1
+ Copyright (c) 2007, 2008, 2009, 2010 Christian Neukirchen <purl.org/net/chneukirchen>
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining a copy
4
4
  of this software and associated documentation files (the "Software"), to
@@ -16,3 +16,6 @@
16
16
  end
17
17
 
18
18
  Of course, use this only when your app runs at "/".
19
+
20
+ Since lighttpd 1.4.23, you also can use the "fix-root-scriptname" flag
21
+ in fastcgi.server.
data/RDOX CHANGED
@@ -1,428 +0,0 @@
1
-
2
- == Rack::Auth::Basic
3
- * should challenge correctly when no credentials are specified
4
- * should rechallenge if incorrect credentials are specified
5
- * should return application output if correct credentials are specified
6
- * should return 400 Bad Request if different auth scheme used
7
- * realm as optional constructor arg
8
-
9
- == Rack::Auth::Digest::MD5
10
- * should challenge when no credentials are specified
11
- * should return application output if correct credentials given
12
- * should return application output if correct credentials given (hashed passwords)
13
- * should rechallenge if incorrect username given
14
- * should rechallenge if incorrect password given
15
- * should rechallenge with stale parameter if nonce is stale
16
- * should return 400 Bad Request if incorrect qop given
17
- * should return 400 Bad Request if incorrect uri given
18
- * should return 400 Bad Request if different auth scheme used
19
- * should not require credentials for unprotected path
20
- * should challenge when no credentials are specified for protected path
21
- * should return application output if correct credentials given for protected path
22
- * should return application output if correct credentials given for POST
23
- * should return application output if correct credentials given for PUT (using method override of POST)
24
- * realm as optional constructor arg
25
-
26
- == Rack::Auth::OpenID
27
- * realm uri should be valid
28
- * should be able to check if a uri is within the realm (empty)
29
- * return_to should be valid
30
- * extensions should have required constants defined
31
- * extensions should have Request and Response defined and inherit from OpenID::Extension
32
-
33
- == Rack::Builder
34
- * chains apps by default
35
- * has implicit #to_app
36
- * supports blocks on use
37
- * has explicit #to_app
38
- * apps are initialized once
39
-
40
- == Rack::Adapter::Camping
41
- * works with GET
42
- * works with POST
43
-
44
- == Rack::Cascade
45
- * should dispatch onward on 404 by default
46
- * should dispatch onward on whatever is passed
47
- * should fail if empty
48
- * should append new app
49
-
50
- == Rack::Handler::CGI
51
- * startup (empty)
52
- * should respond
53
- * should be a lighttpd
54
- * should have rack headers
55
- * should have CGI headers on GET
56
- * should have CGI headers on POST
57
- * should support HTTP auth
58
- * should set status
59
- * shutdown
60
-
61
- == Rack::Chunked
62
- * chunks responses with no Content-Length
63
- * chunks empty bodies properly
64
- * does not modify response when Content-Length header present
65
- * does not modify response when client is HTTP/1.0
66
- * does not modify response when Transfer-Encoding header already present
67
- * does not modify response when status code is 100
68
- * does not modify response when status code is 204
69
- * does not modify response when status code is 304
70
-
71
- == Rack::CommonLogger
72
- * should log to rack.errors by default
73
- * should log to anything with <<
74
-
75
- == Rack::ConditionalGet
76
- * should set a 304 status and truncate body when If-Modified-Since hits
77
- * should set a 304 status and truncate body when If-None-Match hits
78
- * should not affect non-GET/HEAD requests
79
-
80
- == Rack::ContentLength
81
- * sets Content-Length on String bodies if none is set
82
- * sets Content-Length on Array bodies if none is set
83
- * does not set Content-Length on variable length bodies
84
- * does not change Content-Length if it is already set
85
- * does not set Content-Length on 304 responses
86
- * does not set Content-Length when Transfer-Encoding is chunked
87
-
88
- == Rack::ContentType
89
- * sets Content-Type to default text/html if none is set
90
- * sets Content-Type to chosen default if none is set
91
- * does not change Content-Type if it is already set
92
- * case insensitive detection of Content-Type
93
-
94
- == Rack::Deflater
95
- * should be able to deflate bodies that respond to each
96
- * should be able to deflate String bodies
97
- * should be able to gzip bodies that respond to each
98
- * should be able to fallback to no deflation
99
- * should be able to skip when there is no response entity body
100
- * should handle the lack of an acceptable encoding
101
- * should handle gzip response with Last-Modified header
102
- * should do nothing when no-transform Cache-Control directive present
103
-
104
- == Rack::Directory
105
- * serves directory indices
106
- * passes to app if file found
107
- * serves uri with URL encoded filenames
108
- * does not allow directory traversal
109
- * 404s if it can't find the file
110
-
111
- == Rack::Handler::FastCGI
112
- * startup (empty)
113
- * should respond
114
- * should be a lighttpd
115
- * should have rack headers
116
- * should have CGI headers on GET
117
- * should have CGI headers on POST
118
- * should support HTTP auth
119
- * should set status
120
- * shutdown
121
-
122
- == Rack::File
123
- * serves files
124
- * sets Last-Modified header
125
- * serves files with URL encoded filenames
126
- * does not allow directory traversal
127
- * does not allow directory traversal with encoded periods
128
- * 404s if it can't find the file
129
- * detects SystemCallErrors
130
- * returns bodies that respond to #to_path
131
-
132
- == Rack::Handler
133
- * has registered default handlers
134
- * handler that doesn't exist should raise a NameError
135
- * should get unregistered, but already required, handler by name
136
- * should register custom handler
137
- * should not need registration for properly coded handlers even if not already required
138
-
139
- == Rack::Head
140
- * response (empty)
141
- * passes GET, POST, PUT, DELETE, OPTIONS, TRACE requests
142
- * removes body from HEAD requests
143
-
144
- == Rack::Lint
145
- * passes valid request
146
- * notices fatal errors
147
- * notices environment errors
148
- * notices input errors
149
- * notices error errors
150
- * notices status errors
151
- * notices header errors
152
- * notices content-type errors
153
- * notices content-length errors
154
- * notices body errors
155
- * notices input handling errors
156
- * notices error handling errors
157
- * notices HEAD errors
158
- * passes valid read calls
159
-
160
- == Rack::Lint::InputWrapper
161
- * delegates :size to underlying IO object
162
- * delegates :rewind to underlying IO object
163
-
164
- == Rack::Lobster::LambdaLobster
165
- * should be a single lambda
166
- * should look like a lobster
167
- * should be flippable
168
-
169
- == Rack::Lobster
170
- * should look like a lobster
171
- * should be flippable
172
- * should provide crashing for testing purposes
173
-
174
- == Rack::Lock
175
- * should call synchronize on lock
176
- * should set multithread flag to false
177
- * should reset original multithread flag when exiting lock
178
-
179
- == Rack::MethodOverride
180
- * should not affect GET requests
181
- * _method parameter should modify REQUEST_METHOD for POST requests
182
- * X-HTTP-Method-Override header should modify REQUEST_METHOD for POST requests
183
- * should not modify REQUEST_METHOD if the method is unknown
184
- * should not modify REQUEST_METHOD when _method is nil
185
- * should store the original REQUEST_METHOD prior to overriding
186
-
187
- == Rack::MockRequest
188
- * should return a MockResponse
189
- * should be able to only return the environment
190
- * should provide sensible defaults
191
- * should allow GET/POST/PUT/DELETE
192
- * should set content length
193
- * should allow posting
194
- * should use all parts of an URL
195
- * should behave valid according to the Rack spec
196
-
197
- == Rack::MockResponse
198
- * should provide access to the HTTP status
199
- * should provide access to the HTTP headers
200
- * should provide access to the HTTP body
201
- * should provide access to the Rack errors
202
- * should optionally make Rack errors fatal
203
-
204
- == Rack::Handler::Mongrel
205
- * should respond
206
- * should be a Mongrel
207
- * should have rack headers
208
- * should have CGI headers on GET
209
- * should have CGI headers on POST
210
- * should support HTTP auth
211
- * should set status
212
- * should provide a .run
213
- * should provide a .run that maps a hash
214
- * should provide a .run that maps a urlmap
215
- * should provide a .run that maps a urlmap restricting by host
216
- * should stream #each part of the response
217
-
218
- == Rack::Recursive
219
- * should allow for subrequests
220
- * should raise error on requests not below the app
221
- * should support forwarding
222
-
223
- == Rack::Request
224
- * wraps the rack variables
225
- * can figure out the correct host
226
- * can parse the query string
227
- * can parse POST data
228
- * can parse POST data with explicit content type
229
- * does not parse POST data when media type is not form-data
230
- * rewinds input after parsing POST data
231
- * cleans up Safari's ajax POST body
232
- * can get value by key from params with #[]
233
- * can set value to key on params with #[]=
234
- * values_at answers values by keys in order given
235
- * referrer should be extracted correct
236
- * can cache, but invalidates the cache
237
- * can figure out if called via XHR
238
- * can parse cookies
239
- * parses cookies according to RFC 2109
240
- * provides setters
241
- * provides the original env
242
- * can restore the URL
243
- * can restore the full path
244
- * can handle multiple media type parameters
245
- * can parse multipart form data
246
- * can parse big multipart form data
247
- * can detect invalid multipart form data
248
- * shouldn't try to interpret binary as utf8
249
- * should work around buggy 1.8.* Tempfile equality
250
- * does conform to the Rack spec
251
- * should parse Accept-Encoding correctly
252
- * should provide ip information
253
- * should allow subclass request to be instantiated after parent request
254
- * should allow parent request to be instantiated after subclass request
255
-
256
- == Rack::Response
257
- * has sensible default values
258
- * can be written to
259
- * can set and read headers
260
- * can set cookies
261
- * formats the Cookie expiration date accordingly to RFC 2109
262
- * can set secure cookies
263
- * can set http only cookies
264
- * can delete cookies
265
- * can do redirects
266
- * has a useful constructor
267
- * has a constructor that can take a block
268
- * doesn't return invalid responses
269
- * knows if it's empty
270
- * should provide access to the HTTP status
271
- * should provide access to the HTTP headers
272
- * does not add or change Content-Length when #finish()ing
273
- * updates Content-Length when body appended to using #write
274
-
275
- == Rack::RewindableInput
276
- === given an IO object that is already rewindable
277
- * should be able to handle to read()
278
- * should be able to handle to read(nil)
279
- * should be able to handle to read(length)
280
- * should be able to handle to read(length, buffer)
281
- * should be able to handle to read(nil, buffer)
282
- * should rewind to the beginning when #rewind is called
283
- * should be able to handle gets
284
- * should be able to handle each
285
- * should not buffer into a Tempfile if no data has been read yet
286
- * should buffer into a Tempfile when data has been consumed for the first time
287
- * should close the underlying tempfile upon calling #close
288
- * should be possibel to call #close when no data has been buffered yet (empty)
289
- * should be possible to call #close multiple times (empty)
290
- === given an IO object that is not rewindable
291
- * should be able to handle to read()
292
- * should be able to handle to read(nil)
293
- * should be able to handle to read(length)
294
- * should be able to handle to read(length, buffer)
295
- * should be able to handle to read(nil, buffer)
296
- * should rewind to the beginning when #rewind is called
297
- * should be able to handle gets
298
- * should be able to handle each
299
- * should not buffer into a Tempfile if no data has been read yet
300
- * should buffer into a Tempfile when data has been consumed for the first time
301
- * should close the underlying tempfile upon calling #close
302
- * should be possibel to call #close when no data has been buffered yet (empty)
303
- * should be possible to call #close multiple times (empty)
304
- === given an IO object whose rewind method raises Errno::ESPIPE
305
- * should be able to handle to read()
306
- * should be able to handle to read(nil)
307
- * should be able to handle to read(length)
308
- * should be able to handle to read(length, buffer)
309
- * should be able to handle to read(nil, buffer)
310
- * should rewind to the beginning when #rewind is called
311
- * should be able to handle gets
312
- * should be able to handle each
313
- * should not buffer into a Tempfile if no data has been read yet
314
- * should buffer into a Tempfile when data has been consumed for the first time
315
- * should close the underlying tempfile upon calling #close
316
- * should be possibel to call #close when no data has been buffered yet (empty)
317
- * should be possible to call #close multiple times (empty)
318
-
319
- == Rack::Session::Cookie
320
- * creates a new cookie
321
- * loads from a cookie
322
- * survives broken cookies
323
- * barks on too big cookies
324
- * creates a new cookie with integrity hash
325
- * loads from a cookie wih integrity hash
326
- * ignores tampered with session cookies
327
-
328
- == Rack::Session::Memcache
329
- * MemCache can connect to existing server (empty)
330
- * faults on no connection
331
- * creates a new cookie
332
- * determines session from a cookie
333
- * survives nonexistant cookies
334
- * maintains freshness
335
- * deletes cookies with :drop option
336
- * provides new session id with :renew option
337
- * omits cookie with :defer option
338
- * multithread: should cleanly merge sessions (empty)
339
-
340
- == Rack::Session::Pool
341
- * creates a new cookie
342
- * determines session from a cookie
343
- * survives nonexistant cookies
344
- * deletes cookies with :drop option
345
- * provides new session id with :renew option
346
- * omits cookie with :defer option
347
- * multithread: should merge sessions (empty)
348
-
349
- == Rack::ShowExceptions
350
- * catches exceptions
351
-
352
- == Rack::ShowStatus
353
- * should provide a default status message
354
- * should let the app provide additional information
355
- * should not replace existing messages
356
- * should pass on original headers
357
- * should replace existing messages if there is detail
358
-
359
- == Rack::Static
360
- * serves files
361
- * 404s if url root is known but it can't find the file
362
- * calls down the chain if url root is not known
363
-
364
- == Rack::Handler::Thin
365
- * should respond
366
- * should be a Thin
367
- * should have rack headers
368
- * should have CGI headers on GET
369
- * should have CGI headers on POST
370
- * should support HTTP auth
371
- * should set status
372
-
373
- == Rack::URLMap
374
- * dispatches paths correctly
375
- * dispatches hosts correctly
376
- * should be nestable
377
- * should route root apps correctly
378
-
379
- == Rack::Utils
380
- * should escape correctly
381
- * should escape correctly for multibyte characters
382
- * should unescape correctly
383
- * should parse query strings correctly
384
- * should parse nested query strings correctly
385
- * should build query strings correctly
386
- * should figure out which encodings are acceptable
387
- * should return the bytesize of String
388
-
389
- == Rack::Utils::HeaderHash
390
- * should retain header case
391
- * should check existence of keys case insensitively
392
- * should merge case-insensitively
393
- * should overwrite case insensitively and assume the new key's case
394
- * should be converted to real Hash
395
- * should convert Array values to Strings when converting to Hash
396
- * should be able to delete the given key case-sensitively
397
- * should be able to delete the given key case-insensitively
398
- * should return the deleted value when #delete is called on an existing key
399
- * should return nil when #delete is called on a non-existant key
400
-
401
- == Rack::Utils::Context
402
- * should set context correctly
403
- * should alter app on recontexting
404
- * should run different apps
405
-
406
- == Rack::Utils::Multipart
407
- * should return nil if content type is not multipart
408
- * should parse multipart upload with text file
409
- * should parse multipart upload with nested parameters
410
- * should parse multipart upload with binary file
411
- * should parse multipart upload with empty file
412
- * should parse multipart upload with filename with semicolons
413
- * should not include file params if no file was selected
414
- * should parse IE multipart upload and clean up filename
415
- * rewinds input after parsing upload
416
-
417
- == Rack::Handler::WEBrick
418
- * should respond
419
- * should be a WEBrick
420
- * should have rack headers
421
- * should have CGI headers on GET
422
- * should have CGI headers on POST
423
- * should support HTTP auth
424
- * should set status
425
- * should correctly set cookies
426
- * should provide a .run
427
-
428
- 335 specifications, 13 empty (1196 requirements), 0 failures
data/README CHANGED
@@ -11,21 +11,13 @@ which all Rack applications should conform to.
11
11
 
12
12
  == Specification changes in this release
13
13
 
14
- With Rack 1.0, the Rack specification (found in SPEC) changed in the
15
- following backward-incompatible ways. This was done to properly
16
- support Ruby 1.9 and to deprecate some problematic techniques:
17
-
18
- * Rack::VERSION has been pushed to [1,0].
19
- * Header values must be Strings now, split on "\n".
20
- * rack.input must be rewindable and support reading into a buffer,
21
- wrap with Rack::RewindableInput if it isn't.
22
- * Content-Length can be missing, in this case chunked transfer
23
- encoding is used.
24
- * Bodies can now additionally respond to #to_path with a filename to
25
- be served.
26
- * String bodies are deprecated and will not work with Ruby 1.9, use an
27
- Array with a single String instead.
28
- * rack.session is now specified.
14
+ With Rack 1.1, the Rack specification (found in SPEC) changed in the
15
+ following backward-incompatible ways.
16
+
17
+ * Rack::VERSION has been pushed to [1,1].
18
+ * rack.logger is now specified.
19
+ * The SPEC now allows subclasses of the required types.
20
+ * rack.input has to be opened in binary mode.
29
21
 
30
22
  == Supported web servers
31
23
 
@@ -43,8 +35,11 @@ The included *handlers* connect all kinds of web servers to Rack:
43
35
  These web servers include Rack handlers in their distributions:
44
36
  * Ebb
45
37
  * Fuzed
38
+ * Glassfish v3
46
39
  * Phusion Passenger (which is mod_rack for Apache and for nginx)
40
+ * Rainbows!
47
41
  * Unicorn
42
+ * Zbatery
48
43
 
49
44
  Any valid Rack app will run the same on all these handlers, without
50
45
  changing anything.
@@ -70,6 +65,7 @@ These frameworks include Rack adapters in their distributions:
70
65
  * Vintage
71
66
  * Waves
72
67
  * Wee
68
+ * ... and many others.
73
69
 
74
70
  Current links to these projects can be found at
75
71
  http://wiki.ramaze.net/Home#other-frameworks
@@ -130,13 +126,13 @@ Either with the embedded WEBrick starter:
130
126
 
131
127
  Or with rackup:
132
128
 
133
- bin/rackup -Ilib example/lobster.ru
129
+ bin/rackup -Ilib example/lobster.ru
134
130
 
135
131
  By default, the lobster is found at http://localhost:9292.
136
132
 
137
133
  == Installing with RubyGems
138
134
 
139
- A Gem of Rack is available. You can install it with:
135
+ A Gem of Rack is available at gemcutter.org. You can install it with:
140
136
 
141
137
  gem install rack
142
138
 
@@ -165,7 +161,6 @@ To run the test suite completely, you need:
165
161
  * fcgi
166
162
  * memcache-client
167
163
  * mongrel
168
- * ruby-openid
169
164
  * thin
170
165
 
171
166
  The full set of tests test FCGI access with lighttpd (on port
@@ -283,16 +278,49 @@ run on port 11211) and memcache-client installed.
283
278
  * Make sure WEBrick respects the :Host option
284
279
  * Many Ruby 1.9 fixes.
285
280
 
281
+ * January 3rd, 2009: Ninth public release 1.1.0.
282
+ * Moved Auth::OpenID to rack-contrib.
283
+ * SPEC change that relaxes Lint slightly to allow subclasses of the
284
+ required types
285
+ * SPEC change to document rack.input binary mode in greator detail
286
+ * SPEC define optional rack.logger specification
287
+ * File servers support X-Cascade header
288
+ * Imported Config middleware
289
+ * Imported ETag middleware
290
+ * Imported Runtime middleware
291
+ * Imported Sendfile middleware
292
+ * New Logger and NullLogger middlewares
293
+ * Added mime type for .ogv and .manifest.
294
+ * Don't squeeze PATH_INFO slashes
295
+ * Use Content-Type to determine POST params parsing
296
+ * Update Rack::Utils::HTTP_STATUS_CODES hash
297
+ * Add status code lookup utility
298
+ * Response should call #to_i on the status
299
+ * Add Request#user_agent
300
+ * Request#host knows about forwared host
301
+ * Return an empty string for Request#host if HTTP_HOST and
302
+ SERVER_NAME are both missing
303
+ * Allow MockRequest to accept hash params
304
+ * Optimizations to HeaderHash
305
+ * Refactored rackup into Rack::Server
306
+ * Added Utils.build_nested_query to complement Utils.parse_nested_query
307
+ * Added Utils::Multipart.build_multipart to complement
308
+ Utils::Multipart.parse_multipart
309
+ * Extracted set and delete cookie helpers into Utils so they can be
310
+ used outside Response
311
+ * Extract parse_query and parse_multipart in Request so subclasses
312
+ can change their behavior
313
+ * Enforce binary encoding in RewindableInput
314
+ * Set correct external_encoding for handlers that don't use RewindableInput
315
+
286
316
  == Contact
287
317
 
288
- Please mail bugs, suggestions and patches to
289
- <mailto:rack-devel@googlegroups.com>.
318
+ Please post bugs, suggestions and patches to
319
+ the bug tracker at <http://rack.lighthouseapp.com/>.
290
320
 
291
321
  Mailing list archives are available at
292
322
  <http://groups.google.com/group/rack-devel>.
293
323
 
294
- There is a bug tracker at <http://rack.lighthouseapp.com/>.
295
-
296
324
  Git repository (send Git patches to the mailing list):
297
325
  * http://github.com/rack/rack
298
326
  * http://git.vuxu.org/cgi-bin/gitweb.cgi?p=rack.git
@@ -318,8 +346,14 @@ would like to thank:
318
346
  * Luc Heinrich for the Cookie sessions, the static file handler and bugfixes.
319
347
  * Armin Ronacher, for the logo and racktools.
320
348
  * Aredridel, Ben Alpert, Dan Kubb, Daniel Roethlisberger, Matt Todd,
321
- Tom Robinson, Phil Hagelberg, and S. Brent Faulkner for bug fixing
322
- and other improvements.
349
+ Tom Robinson, Phil Hagelberg, S. Brent Faulkner, Bosko Milekic,
350
+ Daniel Rodríguez Troitiño, Genki Takiuchi, Geoffrey Grosenbach,
351
+ Julien Sanchez, Kamal Fariz Mahyuddin, Masayoshi Takahashi, Patrick
352
+ Aljordm, Mig, and Kazuhiro Nishiyama for bug fixing and other
353
+ improvements.
354
+ * Eric Wong, Hongli Lai, Jeremy Kemper for their continuous support
355
+ and API improvements.
356
+ * Yehuda Katz and Carl Lerche for refactoring rackup.
323
357
  * Brian Candler, for Rack::ContentType.
324
358
  * Graham Batty, for improved handler loading.
325
359
  * Stephen Bannasch, for bug reports and documentation.
@@ -334,7 +368,7 @@ would like to thank:
334
368
 
335
369
  == Copyright
336
370
 
337
- Copyright (C) 2007, 2008, 2009 Christian Neukirchen <http://purl.org/net/chneukirchen>
371
+ Copyright (C) 2007, 2008, 2009, 2010 Christian Neukirchen <http://purl.org/net/chneukirchen>
338
372
 
339
373
  Permission is hereby granted, free of charge, to any person obtaining a copy
340
374
  of this software and associated documentation files (the "Software"), to
@@ -349,7 +383,7 @@ all copies or substantial portions of the Software.
349
383
  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
350
384
  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
351
385
  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
352
- THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
386
+ THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
353
387
  IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
354
388
  CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
355
389
 
@@ -358,6 +392,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
358
392
  Rack:: <http://rack.rubyforge.org/>
359
393
  Rack's Rubyforge project:: <http://rubyforge.org/projects/rack>
360
394
  Official Rack repositories:: <http://github.com/rack>
395
+ Rack Lighthouse Bug Tracking:: <http://rack.lighthouseapp.com/>
361
396
  rack-devel mailing list:: <http://groups.google.com/group/rack-devel>
362
397
 
363
398
  Christian Neukirchen:: <http://chneukirchen.org/>