From 8d1bf996e30897f740c54669d891eeda8036113d Mon Sep 17 00:00:00 2001 From: Hartley McGuire Date: Wed, 14 Jun 2023 03:24:10 +0000 Subject: [PATCH 1/4] Update CHANGELOG for 3.0.8 (#2086) --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 09a7aa440..a9c901c0d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,10 @@ All notable changes to this project will be documented in this file. For info on how to format all future additions to this file please reference [Keep A Changelog](https://keepachangelog.com/en/1.0.0/). +## [3.0.8] - 2023-06-14 + +- Fix some unused variable verbose warnings. ([#2084](https://github.com/rack/rack/pull/2084), [@jeremyevans], [@skipkayhil](https://github.com/skipkayhil)) + ## [3.0.7] - 2023-03-16 - Make query parameters without `=` have `nil` values. ([#2059](https://github.com/rack/rack/pull/2059), [@jeremyevans]) From c8b977f6c3a002b6e6f395ce8b5c14f21dad7f39 Mon Sep 17 00:00:00 2001 From: Matt Brictson Date: Tue, 30 Jan 2024 21:56:31 -0800 Subject: [PATCH 2/4] Fix content-length calcuation in Rack:Response#write (#2150) When `Rack::Response` is initialized with an Array, it incorrectly increments its internal `@length` value and emitted content-length header on every subsequent write. The more times `write` is called, the more the error accumulates. This commit fixes the accumulation bug, and fixes/adds specs to properly test the scenario where `write` is used multiple times. --- CHANGELOG.md | 6 ++++++ lib/rack/response.rb | 2 ++ test/spec_response.rb | 39 +++++++++++++++++++++++++++++---------- 3 files changed, 37 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a9c901c0d..6e155c4dc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,12 @@ All notable changes to this project will be documented in this file. For info on how to format all future additions to this file please reference [Keep A Changelog](https://keepachangelog.com/en/1.0.0/). +## Unreleased + +### Changed + +- Fix incorrect content-length header that was emitted when `Rack::Response#write` was used in some situations. ([#2150](https://github.com/rack/rack/pull/2150), [@mattbrictson]) + ## [3.0.8] - 2023-06-14 - Fix some unused variable verbose warnings. ([#2084](https://github.com/rack/rack/pull/2084), [@jeremyevans], [@skipkayhil](https://github.com/skipkayhil)) diff --git a/lib/rack/response.rb b/lib/rack/response.rb index f24683bcb..b9b02c272 100644 --- a/lib/rack/response.rb +++ b/lib/rack/response.rb @@ -328,6 +328,8 @@ def buffered_body! @body.each do |part| @length += part.to_s.bytesize end + + @buffered = true elsif @body.respond_to?(:each) # Turn the user supplied body into a buffered array: body = @body diff --git a/test/spec_response.rb b/test/spec_response.rb index ef8aa481c..11e64d61f 100644 --- a/test/spec_response.rb +++ b/test/spec_response.rb @@ -412,7 +412,7 @@ def object_with_each.each status.must_equal 404 end - it "correctly updates content-type when writing when not initialized with body" do + it "correctly updates content-length when writing when initialized without body" do r = Rack::Response.new r.write('foo') r.write('bar') @@ -423,20 +423,39 @@ def object_with_each.each header['content-length'].must_equal '9' end - it "correctly updates content-type when writing when initialized with body" do + it "correctly updates content-length when writing when initialized with Array body" do + r = Rack::Response.new(["foo"]) + r.write('bar') + r.write('baz') + _, header, body = r.finish + str = "".dup; body.each { |part| str << part } + str.must_equal "foobarbaz" + header['content-length'].must_equal '9' + end + + it "correctly updates content-length when writing when initialized with String body" do + r = Rack::Response.new("foo") + r.write('bar') + r.write('baz') + _, header, body = r.finish + str = "".dup; body.each { |part| str << part } + str.must_equal "foobarbaz" + header['content-length'].must_equal '9' + end + + it "correctly updates content-length when writing when initialized with object body that responds to #each" do obj = Object.new def obj.each yield 'foo' yield 'bar' end - ["foobar", ["foo", "bar"], obj].each do - r = Rack::Response.new(["foo", "bar"]) - r.write('baz') - _, header, body = r.finish - str = "".dup; body.each { |part| str << part } - str.must_equal "foobarbaz" - header['content-length'].must_equal '9' - end + r = Rack::Response.new(obj) + r.write('baz') + r.write('baz') + _, header, body = r.finish + str = "".dup; body.each { |part| str << part } + str.must_equal "foobarbazbaz" + header['content-length'].must_equal '12' end it "doesn't return invalid responses" do From d3d415ed68fe9471f04bafe4a299eb099330fcb1 Mon Sep 17 00:00:00 2001 From: Samuel Williams Date: Fri, 5 Jan 2024 09:02:30 +1300 Subject: [PATCH 3/4] Update Ruby versions for external tests: drop v2.7 and add v3.2 and v3.3. (#2143) --- .github/workflows/test-external.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test-external.yaml b/.github/workflows/test-external.yaml index d55882cea..bcf7a6c72 100644 --- a/.github/workflows/test-external.yaml +++ b/.github/workflows/test-external.yaml @@ -11,7 +11,7 @@ jobs: fail-fast: false matrix: os: [ubuntu-latest] - ruby: ['2.7', '3.0', '3.1'] + ruby: ['3.0', '3.1', '3.2', '3.3'] runs-on: ${{matrix.os}} From 0b3f997e7bb14c1dc42130e1eb50e62797d8c039 Mon Sep 17 00:00:00 2001 From: Samuel Williams Date: Wed, 31 Jan 2024 20:51:51 +1300 Subject: [PATCH 4/4] Bump patch version. --- CHANGELOG.md | 2 +- lib/rack/version.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6e155c4dc..c1f38daf6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,7 @@ All notable changes to this project will be documented in this file. For info on ## Unreleased -### Changed +## [3.0.9] - 2024-01-31 - Fix incorrect content-length header that was emitted when `Rack::Response#write` was used in some situations. ([#2150](https://github.com/rack/rack/pull/2150), [@mattbrictson]) diff --git a/lib/rack/version.rb b/lib/rack/version.rb index e634f23ae..e2deadab2 100644 --- a/lib/rack/version.rb +++ b/lib/rack/version.rb @@ -25,7 +25,7 @@ def self.version VERSION end - RELEASE = "3.0.8" + RELEASE = "3.0.9" # Return the Rack release as a dotted string. def self.release