From bcf2698bcc90f346b145538e53d0d61bcceb2e48 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Wed, 14 Dec 2016 21:58:15 +0000 Subject: Revert "Add 205 Reset Content to the list of statuses without a message body" 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. --- 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 Content-Type, when the +Status+ is 1xx, -204, 205 or 304. +204 or 304. === The Content-Length There must not be a Content-Length 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 Content-Type, 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 Content-Length 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 -- cgit v1.2.3-24-ge0c7