[PATCH] Revert "Add 205 Reset Content to the list of statuses without a message body"

23 views
Skip to first unread message

Eric Wong

unread,
Dec 14, 2016, 5:14:57 PM12/14/16
to rack-...@googlegroups.com
RFC 7231, section 6.3.5 gives three possible options for what a
server MUST do when sending a 205 status code:

> Since the 205 status code implies that no additional content will be
> provided, a server MUST NOT generate a payload in a 205 response. In
> other words, a server MUST do one of the following for a 205
> response: a) indicate a zero-length body for the response by
> including a Content-Length header field with a value of 0; b)
> indicate a zero-length payload for the response by including a
> Transfer-Encoding header field with a value of chunked and a message
> body consisting of a single chunk of zero-length; or, c) close the
> connection immediately after sending the blank line terminating the
> header section.

rack itself has no control over c), but should leave options
a) and b) available for middleware and application authors.

https://tools.ietf.org/html/rfc7231#section-6.3.6

The older RFC 2616 text was vague and not specific about
what a server should do:

https://tools.ietf.org/html/rfc2616#section-10.2.6

I noticed this from Plack: https://metacpan.org/pod/Plack::Util

This reverts commit 2c5b076aaba6c83ffce8c6c2b5c49085c1abb5a5.
---
If you prefer to use "git pull" or "git merge":

The following changes since commit 9e73bd1ae7b5df937302a148ab99bf3be12eb063:

Merge pull request #1135 from tonytonyjan/patch-rdoc (2016-12-08 13:13:44 -0500)

are available in the git repository at:

git://80x24.org/rack rfc7231-sec6.3.6-205

for you to fetch changes up to bcf2698bcc90f346b145538e53d0d61bcceb2e48:

Revert "Add 205 Reset Content to the list of statuses without a message body" (2016-12-14 21:58:54 +0000)

----------------------------------------------------------------
Eric Wong (1):
Revert "Add 205 Reset Content to the list of statuses without a message body"

SPEC | 4 ++--
lib/rack/lint.rb | 4 ++--
lib/rack/mock.rb | 2 +-
lib/rack/response.rb | 2 +-
lib/rack/utils.rb | 2 +-
test/spec_chunked.rb | 2 +-
test/spec_lint.rb | 4 ++--
test/spec_response.rb | 4 ++--
8 files changed, 12 insertions(+), 12 deletions(-)

diff --git a/SPEC b/SPEC
index 7e3af40a..9b278846 100644
--- a/SPEC
+++ b/SPEC
@@ -237,10 +237,10 @@ consisting of lines (for multiple header values, e.g. multiple
The lines must not contain characters below 037.
=== The Content-Type
There must not be a <tt>Content-Type</tt>, when the +Status+ is 1xx,
-204, 205 or 304.
+204 or 304.
=== The Content-Length
There must not be a <tt>Content-Length</tt> header when the
-+Status+ is 1xx, 204, 205 or 304.
++Status+ is 1xx, 204 or 304.
=== The Body
The Body must respond to +each+
and must only yield String values.
diff --git a/lib/rack/lint.rb b/lib/rack/lint.rb
index 54d37822..683ba684 100644
--- a/lib/rack/lint.rb
+++ b/lib/rack/lint.rb
@@ -659,7 +659,7 @@ module Rack
def check_content_type(status, headers)
headers.each { |key, value|
## There must not be a <tt>Content-Type</tt>, when the +Status+ is 1xx,
- ## 204, 205 or 304.
+ ## 204 or 304.
if key.downcase == "content-type"
assert("Content-Type header found in #{status} response, not allowed") {
not Rack::Utils::STATUS_WITH_NO_ENTITY_BODY.include? status.to_i
@@ -674,7 +674,7 @@ module Rack
headers.each { |key, value|
if key.downcase == 'content-length'
## There must not be a <tt>Content-Length</tt> header when the
- ## +Status+ is 1xx, 204, 205 or 304.
+ ## +Status+ is 1xx, 204 or 304.
assert("Content-Length header found in #{status} response, not allowed") {
not Rack::Utils::STATUS_WITH_NO_ENTITY_BODY.include? status.to_i
}
diff --git a/lib/rack/mock.rb b/lib/rack/mock.rb
index 4ebc4df1..afc855e2 100644
--- a/lib/rack/mock.rb
+++ b/lib/rack/mock.rb
@@ -190,7 +190,7 @@ module Rack
end

def empty?
- [201, 204, 205, 304].include? status
+ [201, 204, 304].include? status
end
end
end
diff --git a/lib/rack/response.rb b/lib/rack/response.rb
index 9ac47aad..a9f0c2a3 100644
--- a/lib/rack/response.rb
+++ b/lib/rack/response.rb
@@ -60,7 +60,7 @@ module Rack
def finish(&block)
@block = block

- if [204, 205, 304].include?(status.to_i)
+ if [204, 304].include?(status.to_i)
delete_header CONTENT_TYPE
delete_header CONTENT_LENGTH
close
diff --git a/lib/rack/utils.rb b/lib/rack/utils.rb
index 7b842125..c253f3cf 100644
--- a/lib/rack/utils.rb
+++ b/lib/rack/utils.rb
@@ -576,7 +576,7 @@ module Rack
}

# Responses with HTTP status codes that should not have an entity body
- STATUS_WITH_NO_ENTITY_BODY = Set.new((100..199).to_a << 204 << 205 << 304)
+ STATUS_WITH_NO_ENTITY_BODY = Set.new((100..199).to_a << 204 << 304)

SYMBOL_TO_STATUS_CODE = Hash[*HTTP_STATUS_CODES.map { |code, message|
[message.downcase.gsub(/\s|-|'/, '_').to_sym, code]
diff --git a/test/spec_chunked.rb b/test/spec_chunked.rb
index 7bbcfd92..dc6e8c9d 100644
--- a/test/spec_chunked.rb
+++ b/test/spec_chunked.rb
@@ -92,7 +92,7 @@ describe Rack::Chunked do
body.join.must_equal 'Hello World!'
end

- [100, 204, 205, 304].each do |status_code|
+ [100, 204, 304].each do |status_code|
it "not modify response when status code is #{status_code}" do
app = lambda { |env| [status_code, {}, []] }
status, headers, _ = chunked(app).call(@env)
diff --git a/test/spec_lint.rb b/test/spec_lint.rb
index 6d1c2c45..d99c1aa3 100644
--- a/test/spec_lint.rb
+++ b/test/spec_lint.rb
@@ -269,7 +269,7 @@ describe Rack::Lint do
# }.must_raise(Rack::Lint::LintError).
# message.must_match(/No Content-Type/)

- [100, 101, 204, 205, 304].each do |status|
+ [100, 101, 204, 304].each do |status|
lambda {
Rack::Lint.new(lambda { |env|
[status, {"Content-type" => "text/plain", "Content-length" => "0"}, []]
@@ -280,7 +280,7 @@ describe Rack::Lint do
end

it "notice content-length errors" do
- [100, 101, 204, 205, 304].each do |status|
+ [100, 101, 204, 304].each do |status|
lambda {
Rack::Lint.new(lambda { |env|
[status, {"Content-length" => "0"}, []]
diff --git a/test/spec_response.rb b/test/spec_response.rb
index 2dd2c001..987199de 100644
--- a/test/spec_response.rb
+++ b/test/spec_response.rb
@@ -410,7 +410,7 @@ describe Rack::Response do
res.body.must_be :closed?
end

- it "calls close on #body when 204, 205, or 304" do
+ it "calls close on #body when 204 or 304" do
res = Rack::Response.new
res.body = StringIO.new
res.finish
@@ -424,7 +424,7 @@ describe Rack::Response do
res.body = StringIO.new
res.status = 205
_, _, b = res.finish
- res.body.must_be :closed?
+ res.body.wont_be :closed?
b.wont_equal res.body

res.body = StringIO.new
--
EW

James Tucker

unread,
Dec 15, 2016, 2:46:05 PM12/15/16
to Rack Development
+1

--
EW

--

---
You received this message because you are subscribed to the Google Groups "Rack Development" group.
To unsubscribe from this group and stop receiving emails from it, send an email to rack-devel+unsubscribe@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Eric Wong

unread,
Feb 15, 2017, 1:54:38 PM2/15/17
to rack-...@googlegroups.com
Eric Wong <e...@80x24.org> wrote:
> git://80x24.org/rack rfc7231-sec6.3.6-205
>
> for you to fetch changes up to bcf2698bcc90f346b145538e53d0d61bcceb2e48:

Ping on this.

There's also:

Subject: [PATCH] deflater: remove "deflate" encoding support
Message-Id: <20160727021048.GA27519@starla>
> git://80x24.org/rack.git no-deflate
>
> for you to fetch changes up to d6380043a8953dca63743c947c8027f465d29a5d:

Thanks.

Aaron Patterson

unread,
Feb 15, 2017, 4:25:51 PM2/15/17
to rack-...@googlegroups.com
Thanks for the friendly bump! I've applied both patches to master.

--
Aaron Patterson
http://tenderlovemaking.com/
signature.asc
Reply all
Reply to author
Forward
0 new messages