rack 2.2.8.1 → 3.1.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (86) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +301 -81
  3. data/CONTRIBUTING.md +63 -55
  4. data/MIT-LICENSE +1 -1
  5. data/README.md +328 -0
  6. data/SPEC.rdoc +204 -131
  7. data/lib/rack/auth/abstract/handler.rb +3 -1
  8. data/lib/rack/auth/abstract/request.rb +3 -1
  9. data/lib/rack/auth/basic.rb +1 -4
  10. data/lib/rack/bad_request.rb +8 -0
  11. data/lib/rack/body_proxy.rb +21 -3
  12. data/lib/rack/builder.rb +102 -69
  13. data/lib/rack/cascade.rb +2 -3
  14. data/lib/rack/common_logger.rb +23 -18
  15. data/lib/rack/conditional_get.rb +18 -15
  16. data/lib/rack/constants.rb +67 -0
  17. data/lib/rack/content_length.rb +12 -16
  18. data/lib/rack/content_type.rb +8 -5
  19. data/lib/rack/deflater.rb +40 -26
  20. data/lib/rack/directory.rb +9 -3
  21. data/lib/rack/etag.rb +14 -23
  22. data/lib/rack/events.rb +4 -0
  23. data/lib/rack/files.rb +15 -17
  24. data/lib/rack/head.rb +9 -8
  25. data/lib/rack/headers.rb +238 -0
  26. data/lib/rack/lint.rb +838 -644
  27. data/lib/rack/lock.rb +2 -5
  28. data/lib/rack/logger.rb +3 -0
  29. data/lib/rack/method_override.rb +5 -1
  30. data/lib/rack/mime.rb +14 -5
  31. data/lib/rack/mock.rb +1 -271
  32. data/lib/rack/mock_request.rb +171 -0
  33. data/lib/rack/mock_response.rb +124 -0
  34. data/lib/rack/multipart/generator.rb +7 -5
  35. data/lib/rack/multipart/parser.rb +215 -90
  36. data/lib/rack/multipart/uploaded_file.rb +4 -0
  37. data/lib/rack/multipart.rb +53 -40
  38. data/lib/rack/null_logger.rb +9 -0
  39. data/lib/rack/query_parser.rb +81 -102
  40. data/lib/rack/recursive.rb +2 -0
  41. data/lib/rack/reloader.rb +0 -2
  42. data/lib/rack/request.rb +250 -123
  43. data/lib/rack/response.rb +146 -66
  44. data/lib/rack/rewindable_input.rb +24 -5
  45. data/lib/rack/runtime.rb +7 -6
  46. data/lib/rack/sendfile.rb +30 -25
  47. data/lib/rack/show_exceptions.rb +21 -4
  48. data/lib/rack/show_status.rb +17 -7
  49. data/lib/rack/static.rb +8 -8
  50. data/lib/rack/tempfile_reaper.rb +15 -4
  51. data/lib/rack/urlmap.rb +3 -1
  52. data/lib/rack/utils.rb +232 -233
  53. data/lib/rack/version.rb +1 -9
  54. data/lib/rack.rb +13 -89
  55. metadata +15 -41
  56. data/README.rdoc +0 -320
  57. data/Rakefile +0 -130
  58. data/bin/rackup +0 -5
  59. data/contrib/rack.png +0 -0
  60. data/contrib/rack.svg +0 -150
  61. data/contrib/rack_logo.svg +0 -164
  62. data/contrib/rdoc.css +0 -412
  63. data/example/lobster.ru +0 -6
  64. data/example/protectedlobster.rb +0 -16
  65. data/example/protectedlobster.ru +0 -10
  66. data/lib/rack/auth/digest/md5.rb +0 -131
  67. data/lib/rack/auth/digest/nonce.rb +0 -54
  68. data/lib/rack/auth/digest/params.rb +0 -54
  69. data/lib/rack/auth/digest/request.rb +0 -43
  70. data/lib/rack/chunked.rb +0 -117
  71. data/lib/rack/core_ext/regexp.rb +0 -14
  72. data/lib/rack/file.rb +0 -7
  73. data/lib/rack/handler/cgi.rb +0 -59
  74. data/lib/rack/handler/fastcgi.rb +0 -100
  75. data/lib/rack/handler/lsws.rb +0 -61
  76. data/lib/rack/handler/scgi.rb +0 -71
  77. data/lib/rack/handler/thin.rb +0 -36
  78. data/lib/rack/handler/webrick.rb +0 -129
  79. data/lib/rack/handler.rb +0 -104
  80. data/lib/rack/lobster.rb +0 -70
  81. data/lib/rack/server.rb +0 -466
  82. data/lib/rack/session/abstract/id.rb +0 -523
  83. data/lib/rack/session/cookie.rb +0 -204
  84. data/lib/rack/session/memcache.rb +0 -10
  85. data/lib/rack/session/pool.rb +0 -85
  86. data/rack.gemspec +0 -46
data/CONTRIBUTING.md CHANGED
@@ -1,38 +1,42 @@
1
- Contributing to Rack
2
- =====================
1
+ # Contributing to Rack
3
2
 
4
- Rack is work of [hundreds of contributors](https://github.com/rack/rack/graphs/contributors). You're encouraged to submit [pull requests](https://github.com/rack/rack/pulls), [propose features and discuss issues](https://github.com/rack/rack/issues). When in doubt, post to the [rack-devel](http://groups.google.com/group/rack-devel) mailing list.
3
+ Rack is work of [hundreds of
4
+ contributors](https://github.com/rack/rack/graphs/contributors). You're
5
+ encouraged to submit [pull requests](https://github.com/rack/rack/pulls) and
6
+ [propose features and discuss issues](https://github.com/rack/rack/issues).
5
7
 
6
- #### Fork the Project
8
+ ## Backports
7
9
 
8
- Fork the [project on Github](https://github.com/rack/rack) and check out your copy.
10
+ Only security patches are ideal for backporting to non-main release versions. If
11
+ you're not sure if your bug fix is backportable, you should open a discussion to
12
+ discuss it first.
9
13
 
10
- ```
11
- git clone https://github.com/contributor/rack.git
12
- cd rack
13
- git remote add upstream https://github.com/rack/rack.git
14
- ```
14
+ The [Security Policy] documents which release versions will receive security
15
+ backports.
15
16
 
16
- #### Create a Topic Branch
17
+ ## Fork the Project
17
18
 
18
- Make sure your fork is up-to-date and create a topic branch for your feature or bug fix.
19
+ Fork the [project on GitHub](https://github.com/rack/rack) and check out your
20
+ copy.
19
21
 
20
22
  ```
21
- git checkout master
22
- git pull upstream master
23
- git checkout -b my-feature-branch
23
+ git clone https://github.com/(your-github-username)/rack.git
24
+ cd rack
25
+ git remote add upstream https://github.com/rack/rack.git
24
26
  ```
25
27
 
26
- #### Bundle Install and Quick Test
28
+ ## Create a Topic Branch
27
29
 
28
- Ensure that you can build the project and run quick tests.
30
+ Make sure your fork is up-to-date and create a topic branch for your feature or
31
+ bug fix.
29
32
 
30
33
  ```
31
- bundle install --without extra
32
- bundle exec rake test
34
+ git checkout main
35
+ git pull upstream main
36
+ git checkout -b my-feature-branch
33
37
  ```
34
38
 
35
- #### Running All Tests
39
+ ## Running All Tests
36
40
 
37
41
  Install all dependencies.
38
42
 
@@ -46,39 +50,33 @@ Run all tests.
46
50
  rake test
47
51
  ```
48
52
 
49
- The test suite has no dependencies outside of the core Ruby installation and bacon.
50
-
51
- Some tests will be skipped if a dependency is not found.
53
+ ## Write Tests
52
54
 
53
- To run the test suite completely, you need:
55
+ Try to write a test that reproduces the problem you're trying to fix or
56
+ describes a feature that you want to build.
54
57
 
55
- * fcgi
56
- * dalli
57
- * thin
58
+ We definitely appreciate pull requests that highlight or reproduce a problem,
59
+ even without a fix.
58
60
 
59
- To test Memcache sessions, you need memcached (will be run on port 11211) and dalli installed.
60
-
61
- #### Write Tests
62
-
63
- Try to write a test that reproduces the problem you're trying to fix or describes a feature that you want to build.
64
-
65
- We definitely appreciate pull requests that highlight or reproduce a problem, even without a fix.
66
-
67
- #### Write Code
61
+ ## Write Code
68
62
 
69
63
  Implement your feature or bug fix.
70
64
 
71
- Make sure that `bundle exec rake fulltest` completes without errors.
65
+ Make sure that all tests pass:
72
66
 
73
- #### Write Documentation
67
+ ```
68
+ bundle exec rake test
69
+ ```
74
70
 
75
- Document any external behavior in the [README](README.rdoc).
71
+ ## Write Documentation
76
72
 
77
- #### Update Changelog
73
+ Document any external behavior in the [README](README.md).
74
+
75
+ ## Update Changelog
78
76
 
79
77
  Add a line to [CHANGELOG](CHANGELOG.md).
80
78
 
81
- #### Commit Changes
79
+ ## Commit Changes
82
80
 
83
81
  Make sure git knows your name and email address:
84
82
 
@@ -87,34 +85,37 @@ git config --global user.name "Your Name"
87
85
  git config --global user.email "contributor@example.com"
88
86
  ```
89
87
 
90
- Writing good commit logs is important. A commit log should describe what changed and why.
88
+ Writing good commit logs is important. A commit log should describe what changed
89
+ and why.
91
90
 
92
91
  ```
93
92
  git add ...
94
93
  git commit
95
94
  ```
96
95
 
97
- #### Push
96
+ ## Push
98
97
 
99
98
  ```
100
99
  git push origin my-feature-branch
101
100
  ```
102
101
 
103
- #### Make a Pull Request
102
+ ## Make a Pull Request
104
103
 
105
- Go to https://github.com/contributor/rack and select your feature branch. Click the 'Pull Request' button and fill out the form. Pull requests are usually reviewed within a few days.
104
+ Go to your fork of rack on GitHub and select your feature branch. Click the
105
+ 'Pull Request' button and fill out the form. Pull requests are usually
106
+ reviewed within a few days.
106
107
 
107
- #### Rebase
108
+ ## Rebase
108
109
 
109
- If you've been working on a change for a while, rebase with upstream/master.
110
+ If you've been working on a change for a while, rebase with upstream/main.
110
111
 
111
112
  ```
112
113
  git fetch upstream
113
- git rebase upstream/master
114
+ git rebase upstream/main
114
115
  git push origin my-feature-branch -f
115
116
  ```
116
117
 
117
- #### Make Required Changes
118
+ ## Make Required Changes
118
119
 
119
120
  Amend your previous commit and force push the changes.
120
121
 
@@ -123,14 +124,21 @@ git commit --amend
123
124
  git push origin my-feature-branch -f
124
125
  ```
125
126
 
126
- #### Check on Your Pull Request
127
+ ## Check on Your Pull Request
128
+
129
+ Go back to your pull request after a few minutes and see whether it passed
130
+ tests with GitHub Actions. Everything should look green, otherwise fix issues and
131
+ amend your commit as described above.
127
132
 
128
- Go back to your pull request after a few minutes and see whether it passed muster with Travis-CI. Everything should look green, otherwise fix issues and amend your commit as described above.
133
+ ## Be Patient
129
134
 
130
- #### Be Patient
135
+ It's likely that your change will not be merged and that the nitpicky
136
+ maintainers will ask you to do more, or fix seemingly benign problems. Hang in
137
+ there!
131
138
 
132
- It's likely that your change will not be merged and that the nitpicky maintainers will ask you to do more, or fix seemingly benign problems. Hang on there!
139
+ ## Thank You
133
140
 
134
- #### Thank You
141
+ Please do know that we really appreciate and value your time and work. We love
142
+ you, really.
135
143
 
136
- Please do know that we really appreciate and value your time and work. We love you, really.
144
+ [Security Policy]: SECURITY.md
data/MIT-LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  The MIT License (MIT)
2
2
 
3
- Copyright (C) 2007-2019 Leah Neukirchen <http://leahneukirchen.org/infopage.html>
3
+ Copyright (C) 2007-2021 Leah Neukirchen <http://leahneukirchen.org/infopage.html>
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to
data/README.md ADDED
@@ -0,0 +1,328 @@
1
+ # ![Rack](contrib/logo.webp)
2
+
3
+ Rack provides a minimal, modular, and adaptable interface for developing web
4
+ applications in Ruby. By wrapping HTTP requests and responses in the simplest
5
+ way possible, it unifies and distills the bridge between web servers, web
6
+ frameworks, and web application into a single method call.
7
+
8
+ The exact details of this are described in the [Rack Specification], which all
9
+ Rack applications should conform to.
10
+
11
+ ## Version support
12
+
13
+ | Version | Support |
14
+ |----------|------------------------------------|
15
+ | 3.0.x | Bug fixes and security patches. |
16
+ | 2.2.x | Security patches only. |
17
+ | <= 2.1.x | End of support. |
18
+
19
+ Please see the [Security Policy] for more information.
20
+
21
+ ## Rack 3.0
22
+
23
+ This is the latest version of Rack. It contains API improvements but also some
24
+ breaking changes. Please check the [Upgrade Guide](UPGRADE-GUIDE.md) for more
25
+ details about migrating servers, middlewares and applications designed for Rack 2
26
+ to Rack 3. For detailed information on specific changes, check the [Change Log](CHANGELOG.md).
27
+
28
+ ## Rack 2.2
29
+
30
+ This version of Rack is receiving security patches only, and effort should be
31
+ made to move to Rack 3.
32
+
33
+ Starting in Ruby 3.4 the `base64` dependency will no longer be a default gem,
34
+ and may cause a warning or error about `base64` being missing. To correct this,
35
+ add `base64` as a dependency to your project.
36
+
37
+ ## Installation
38
+
39
+ Add the rack gem to your application bundle, or follow the instructions provided
40
+ by a [supported web framework](#supported-web-frameworks):
41
+
42
+ ```bash
43
+ # Install it generally:
44
+ $ gem install rack
45
+
46
+ # or, add it to your current application gemfile:
47
+ $ bundle add rack
48
+ ```
49
+
50
+ If you need features from `Rack::Session` or `bin/rackup` please add those gems separately.
51
+
52
+ ```bash
53
+ $ gem install rack-session rackup
54
+ ```
55
+
56
+ ## Usage
57
+
58
+ Create a file called `config.ru` with the following contents:
59
+
60
+ ```ruby
61
+ run do |env|
62
+ [200, {}, ["Hello World"]]
63
+ end
64
+ ```
65
+
66
+ Run this using the rackup gem or another [supported web
67
+ server](#supported-web-servers).
68
+
69
+ ```bash
70
+ $ gem install rackup
71
+ $ rackup
72
+ $ curl http://localhost:9292
73
+ Hello World
74
+ ```
75
+
76
+ ## Supported web servers
77
+
78
+ Rack is supported by a wide range of servers, including:
79
+
80
+ * [Agoo](https://github.com/ohler55/agoo)
81
+ * [Falcon](https://github.com/socketry/falcon)
82
+ * [Iodine](https://github.com/boazsegev/iodine)
83
+ * [NGINX Unit](https://unit.nginx.org/)
84
+ * [Phusion Passenger](https://www.phusionpassenger.com/) (which is mod_rack for
85
+ Apache and for nginx)
86
+ * [Puma](https://puma.io/)
87
+ * [Thin](https://github.com/macournoyer/thin)
88
+ * [Unicorn](https://yhbt.net/unicorn/)
89
+ * [uWSGI](https://uwsgi-docs.readthedocs.io/en/latest/)
90
+ * [Lamby](https://lamby.custominktech.com) (for AWS Lambda)
91
+
92
+ You will need to consult the server documentation to find out what features and
93
+ limitations they may have. In general, any valid Rack app will run the same on
94
+ all these servers, without changing anything.
95
+
96
+ ### Rackup
97
+
98
+ Rack provides a separate gem, [rackup](https://github.com/rack/rackup) which is
99
+ a generic interface for running a Rack application on supported servers, which
100
+ include `WEBRick`, `Puma`, `Falcon` and others.
101
+
102
+ ## Supported web frameworks
103
+
104
+ These frameworks and many others support the [Rack Specification]:
105
+
106
+ * [Camping](https://github.com/camping/camping)
107
+ * [Hanami](https://hanamirb.org/)
108
+ * [Ramaze](https://github.com/ramaze/ramaze)
109
+ * [Padrino](https://padrinorb.com/)
110
+ * [Roda](https://github.com/jeremyevans/roda)
111
+ * [Ruby on Rails](https://rubyonrails.org/)
112
+ * [Rum](https://github.com/leahneukirchen/rum)
113
+ * [Sinatra](https://sinatrarb.com/)
114
+ * [Utopia](https://github.com/socketry/utopia)
115
+ * [WABuR](https://github.com/ohler55/wabur)
116
+
117
+ ## Available middleware shipped with Rack
118
+
119
+ Between the server and the framework, Rack can be customized to your
120
+ applications needs using middleware. Rack itself ships with the following
121
+ middleware:
122
+
123
+ * `Rack::CommonLogger` for creating Apache-style logfiles.
124
+ * `Rack::ConditionalGet` for returning [Not
125
+ Modified](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/304)
126
+ responses when the response has not changed.
127
+ * `Rack::Config` for modifying the environment before processing the request.
128
+ * `Rack::ContentLength` for setting a `content-length` header based on body
129
+ size.
130
+ * `Rack::ContentType` for setting a default `content-type` header for responses.
131
+ * `Rack::Deflater` for compressing responses with gzip.
132
+ * `Rack::ETag` for setting `etag` header on bodies that can be buffered.
133
+ * `Rack::Events` for providing easy hooks when a request is received and when
134
+ the response is sent.
135
+ * `Rack::Files` for serving static files.
136
+ * `Rack::Head` for returning an empty body for HEAD requests.
137
+ * `Rack::Lint` for checking conformance to the [Rack Specification].
138
+ * `Rack::Lock` for serializing requests using a mutex.
139
+ * `Rack::Logger` for setting a logger to handle logging errors.
140
+ * `Rack::MethodOverride` for modifying the request method based on a submitted
141
+ parameter.
142
+ * `Rack::Recursive` for including data from other paths in the application, and
143
+ for performing internal redirects.
144
+ * `Rack::Reloader` for reloading files if they have been modified.
145
+ * `Rack::Runtime` for including a response header with the time taken to process
146
+ the request.
147
+ * `Rack::Sendfile` for working with web servers that can use optimized file
148
+ serving for file system paths.
149
+ * `Rack::ShowException` for catching unhandled exceptions and presenting them in
150
+ a nice and helpful way with clickable backtrace.
151
+ * `Rack::ShowStatus` for using nice error pages for empty client error
152
+ responses.
153
+ * `Rack::Static` for more configurable serving of static files.
154
+ * `Rack::TempfileReaper` for removing temporary files creating during a request.
155
+
156
+ All these components use the same interface, which is described in detail in the
157
+ [Rack Specification]. These optional components can be used in any way you wish.
158
+
159
+ ### Convenience interfaces
160
+
161
+ If you want to develop outside of existing frameworks, implement your own ones,
162
+ or develop middleware, Rack provides many helpers to create Rack applications
163
+ quickly and without doing the same web stuff all over:
164
+
165
+ * `Rack::Request` which also provides query string parsing and multipart
166
+ handling.
167
+ * `Rack::Response` for convenient generation of HTTP replies and cookie
168
+ handling.
169
+ * `Rack::MockRequest` and `Rack::MockResponse` for efficient and quick testing
170
+ of Rack application without real HTTP round-trips.
171
+ * `Rack::Cascade` for trying additional Rack applications if an application
172
+ returns a not found or method not supported response.
173
+ * `Rack::Directory` for serving files under a given directory, with directory
174
+ indexes.
175
+ * `Rack::MediaType` for parsing content-type headers.
176
+ * `Rack::Mime` for determining content-type based on file extension.
177
+ * `Rack::RewindableInput` for making any IO object rewindable, using a temporary
178
+ file buffer.
179
+ * `Rack::URLMap` to route to multiple applications inside the same process.
180
+
181
+ ## Configuration
182
+
183
+ Rack exposes several configuration parameters to control various features of the
184
+ implementation.
185
+
186
+ ### `param_depth_limit`
187
+
188
+ ```ruby
189
+ Rack::Utils.param_depth_limit = 32 # default
190
+ ```
191
+
192
+ The maximum amount of nesting allowed in parameters. For example, if set to 3,
193
+ this query string would be allowed:
194
+
195
+ ```
196
+ ?a[b][c]=d
197
+ ```
198
+
199
+ but this query string would not be allowed:
200
+
201
+ ```
202
+ ?a[b][c][d]=e
203
+ ```
204
+
205
+ Limiting the depth prevents a possible stack overflow when parsing parameters.
206
+
207
+ ### `multipart_file_limit`
208
+
209
+ ```ruby
210
+ Rack::Utils.multipart_file_limit = 128 # default
211
+ ```
212
+
213
+ The maximum number of parts with a filename a request can contain. Accepting
214
+ too many parts can lead to the server running out of file handles.
215
+
216
+ The default is 128, which means that a single request can't upload more than 128
217
+ files at once. Set to 0 for no limit.
218
+
219
+ Can also be set via the `RACK_MULTIPART_FILE_LIMIT` environment variable.
220
+
221
+ (This is also aliased as `multipart_part_limit` and `RACK_MULTIPART_PART_LIMIT` for compatibility)
222
+
223
+
224
+ ### `multipart_total_part_limit`
225
+
226
+ The maximum total number of parts a request can contain of any type, including
227
+ both file and non-file form fields.
228
+
229
+ The default is 4096, which means that a single request can't contain more than
230
+ 4096 parts.
231
+
232
+ Set to 0 for no limit.
233
+
234
+ Can also be set via the `RACK_MULTIPART_TOTAL_PART_LIMIT` environment variable.
235
+
236
+
237
+ ## Changelog
238
+
239
+ See [CHANGELOG.md](CHANGELOG.md).
240
+
241
+ ## Contributing
242
+
243
+ See [CONTRIBUTING.md](CONTRIBUTING.md) for specific details about how to make a
244
+ contribution to Rack.
245
+
246
+ Please post bugs, suggestions and patches to [GitHub
247
+ Issues](https://github.com/rack/rack/issues).
248
+
249
+ Please check our [Security Policy](https://github.com/rack/rack/security/policy)
250
+ for responsible disclosure and security bug reporting process. Due to wide usage
251
+ of the library, it is strongly preferred that we manage timing in order to
252
+ provide viable patches at the time of disclosure. Your assistance in this matter
253
+ is greatly appreciated.
254
+
255
+ ## See Also
256
+
257
+ ### `rack-contrib`
258
+
259
+ The plethora of useful middleware created the need for a project that collects
260
+ fresh Rack middleware. `rack-contrib` includes a variety of add-on components
261
+ for Rack and it is easy to contribute new modules.
262
+
263
+ * https://github.com/rack/rack-contrib
264
+
265
+ ### `rack-session`
266
+
267
+ Provides convenient session management for Rack.
268
+
269
+ * https://github.com/rack/rack-session
270
+
271
+ ## Thanks
272
+
273
+ The Rack Core Team, consisting of
274
+
275
+ * Aaron Patterson [tenderlove](https://github.com/tenderlove)
276
+ * Samuel Williams [ioquatix](https://github.com/ioquatix)
277
+ * Jeremy Evans [jeremyevans](https://github.com/jeremyevans)
278
+ * Eileen Uchitelle [eileencodes](https://github.com/eileencodes)
279
+ * Matthew Draper [matthewd](https://github.com/matthewd)
280
+ * Rafael França [rafaelfranca](https://github.com/rafaelfranca)
281
+
282
+ and the Rack Alumni
283
+
284
+ * Ryan Tomayko [rtomayko](https://github.com/rtomayko)
285
+ * Scytrin dai Kinthra [scytrin](https://github.com/scytrin)
286
+ * Leah Neukirchen [leahneukirchen](https://github.com/leahneukirchen)
287
+ * James Tucker [raggi](https://github.com/raggi)
288
+ * Josh Peek [josh](https://github.com/josh)
289
+ * José Valim [josevalim](https://github.com/josevalim)
290
+ * Michael Fellinger [manveru](https://github.com/manveru)
291
+ * Santiago Pastorino [spastorino](https://github.com/spastorino)
292
+ * Konstantin Haase [rkh](https://github.com/rkh)
293
+
294
+ would like to thank:
295
+
296
+ * Adrian Madrid, for the LiteSpeed handler.
297
+ * Christoffer Sawicki, for the first Rails adapter and `Rack::Deflater`.
298
+ * Tim Fletcher, for the HTTP authentication code.
299
+ * Luc Heinrich for the Cookie sessions, the static file handler and bugfixes.
300
+ * Armin Ronacher, for the logo and racktools.
301
+ * Alex Beregszaszi, Alexander Kahn, Anil Wadghule, Aredridel, Ben Alpert, Dan
302
+ Kubb, Daniel Roethlisberger, Matt Todd, Tom Robinson, Phil Hagelberg, S. Brent
303
+ Faulkner, Bosko Milekic, Daniel Rodríguez Troitiño, Genki Takiuchi, Geoffrey
304
+ Grosenbach, Julien Sanchez, Kamal Fariz Mahyuddin, Masayoshi Takahashi,
305
+ Patrick Aljordm, Mig, Kazuhiro Nishiyama, Jon Bardin, Konstantin Haase, Larry
306
+ Siden, Matias Korhonen, Sam Ruby, Simon Chiang, Tim Connor, Timur Batyrshin,
307
+ and Zach Brock for bug fixing and other improvements.
308
+ * Eric Wong, Hongli Lai, Jeremy Kemper for their continuous support and API
309
+ improvements.
310
+ * Yehuda Katz and Carl Lerche for refactoring rackup.
311
+ * Brian Candler, for `Rack::ContentType`.
312
+ * Graham Batty, for improved handler loading.
313
+ * Stephen Bannasch, for bug reports and documentation.
314
+ * Gary Wright, for proposing a better `Rack::Response` interface.
315
+ * Jonathan Buch, for improvements regarding `Rack::Response`.
316
+ * Armin Röhrl, for tracking down bugs in the Cookie generator.
317
+ * Alexander Kellett for testing the Gem and reviewing the announcement.
318
+ * Marcus Rückert, for help with configuring and debugging lighttpd.
319
+ * The WSGI team for the well-done and documented work they've done and Rack
320
+ builds up on.
321
+ * All bug reporters and patch contributors not mentioned above.
322
+
323
+ ## License
324
+
325
+ Rack is released under the [MIT License](MIT-LICENSE).
326
+
327
+ [Rack Specification]: SPEC.rdoc
328
+ [Security Policy]: SECURITY.md