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