From fab4a8fa63d2d1cd014da79607584a14e7c71644 Mon Sep 17 00:00:00 2001 From: pezholio Date: Fri, 14 Jun 2024 09:14:17 +0100 Subject: [PATCH 1/5] fix: Fix Rack > 3.0.0 support MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Now Rack::Handler has been moved to a seperate gem, we need to specify it specifically. I’ve monkeypatched `Rack::Handler::WEBrick` to support both use cases everywhere in the gem --- lib/pact/consumer/server.rb | 6 +----- lib/pact/mock_service/control_server/run.rb | 1 + lib/pact/mock_service/run.rb | 1 + lib/rack/handler/webbrick.rb | 12 ++++++++++++ 4 files changed, 15 insertions(+), 5 deletions(-) create mode 100644 lib/rack/handler/webbrick.rb diff --git a/lib/pact/consumer/server.rb b/lib/pact/consumer/server.rb index 767d837..7878e2d 100644 --- a/lib/pact/consumer/server.rb +++ b/lib/pact/consumer/server.rb @@ -1,6 +1,7 @@ require 'uri' require 'net/http' require 'rack' +require 'rack/handler/webbrick' # Copied shamelessly from Capybara # Used to run a mock service in a new thread when started by the AppManager or the ControlServer @@ -66,11 +67,6 @@ def responsive? end def run_default_server(app, port) - begin - require 'rack/handler/webrick' - rescue LoadError - require 'rackup/handler/webrick' - end Rack::Handler::WEBrick.run(app, **webrick_opts) do |server| @port = server[:Port] end diff --git a/lib/pact/mock_service/control_server/run.rb b/lib/pact/mock_service/control_server/run.rb index 0524e2b..8b654c7 100644 --- a/lib/pact/mock_service/control_server/run.rb +++ b/lib/pact/mock_service/control_server/run.rb @@ -1,5 +1,6 @@ require 'pact/mock_service/control_server/app' require 'pact/mock_service/server/webrick_request_monkeypatch' +require 'rack/handler/webbrick' module Pact module MockService diff --git a/lib/pact/mock_service/run.rb b/lib/pact/mock_service/run.rb index 85f3166..d0677f4 100644 --- a/lib/pact/mock_service/run.rb +++ b/lib/pact/mock_service/run.rb @@ -5,6 +5,7 @@ require 'pact/mock_service/server/webrick_request_monkeypatch' require 'pact/specification_version' require 'pact/support/metrics' +require 'rack/handler/webbrick' module Pact module MockService diff --git a/lib/rack/handler/webbrick.rb b/lib/rack/handler/webbrick.rb new file mode 100644 index 0000000..6b5acc0 --- /dev/null +++ b/lib/rack/handler/webbrick.rb @@ -0,0 +1,12 @@ +module Rack + module Handler + begin + require 'rack/handler/webrick' + WEBrick = Class.new(Rack::Handler::WEBrick) + rescue LoadError + require 'rackup/handler/webrick' + WEBrick = Class.new(Rackup::Handler::WEBrick) + end + end +end + From 92e7e67634f92938eb8dd026019b519d78dc8a3e Mon Sep 17 00:00:00 2001 From: pezholio Date: Fri, 14 Jun 2024 13:55:15 +0100 Subject: [PATCH 2/5] Handle missing `body` variable As of Rack `3.1.0`, `rack.input` is now optional, so cannot always be guaranteed to be present (https://github.com/rack/rack/blob/b4c92944e0dd04874bed36281fc8e1a44023677f/CHANGELOG.md?plain=1#L40) --- lib/pact/consumer/mock_service/rack_request_helper.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pact/consumer/mock_service/rack_request_helper.rb b/lib/pact/consumer/mock_service/rack_request_helper.rb index 130fc15..f9184d1 100644 --- a/lib/pact/consumer/mock_service/rack_request_helper.rb +++ b/lib/pact/consumer/mock_service/rack_request_helper.rb @@ -24,7 +24,7 @@ def request_as_hash_from env end request[:headers] = headers_from env - body_string = request[:body].read + body_string = request[:body]&.read || "" if body_string.empty? request.delete :body From c2d034ad51e39c1246bc31fbac2cf027233800e0 Mon Sep 17 00:00:00 2001 From: pezholio Date: Fri, 14 Jun 2024 09:19:05 +0100 Subject: [PATCH 3/5] Run tests against both Rack 2.x.x and 3.x.x MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This ensures we’re backwardsly compatible with both versions of Rack. --- .github/workflows/test.yml | 3 +++ pact-mock_service.gemspec | 8 ++++++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index f885e8e..5497721 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -9,7 +9,10 @@ jobs: matrix: ruby_version: ["2.7", "3.0", "3.1", "3.2", "3.3"] os: ["ubuntu-latest","windows-latest","macos-latest"] + rack_version: ["2", "3"] runs-on: ${{ matrix.os }} + env: + RACK_VERSION: ${{ matrix.rack_version }} steps: - uses: actions/checkout@v4 - uses: ruby/setup-ruby@v1 diff --git a/pact-mock_service.gemspec b/pact-mock_service.gemspec index d5aebf5..5e46486 100644 --- a/pact-mock_service.gemspec +++ b/pact-mock_service.gemspec @@ -20,8 +20,12 @@ Gem::Specification.new do |gem| gem.require_paths = ["lib"] gem.license = 'MIT' - gem.add_runtime_dependency 'rack', '>= 2.0', '< 4.0' - gem.add_runtime_dependency 'rackup', '~> 2.0' + if ENV['RACK_VERSION'] == '2' + gem.add_runtime_dependency 'rack', '>= 2.0', '< 3.0' + else + gem.add_runtime_dependency 'rack', '>= 3.0', '< 4.0' + gem.add_runtime_dependency 'rackup', '~> 2.0' + end gem.add_runtime_dependency 'rspec', '>=2.14' gem.add_runtime_dependency 'find_a_port', '~> 1.0.1' gem.add_runtime_dependency 'thor', '>= 0.19', '< 2.0' From 9143534464e2c7faf024728f2f23fdb9922b9e36 Mon Sep 17 00:00:00 2001 From: Yousaf Nabi Date: Sat, 15 Jun 2024 18:56:38 +0100 Subject: [PATCH 4/5] Revert "Fix Rack 3 support" --- .github/workflows/test.yml | 3 --- .../consumer/mock_service/rack_request_helper.rb | 2 +- lib/pact/consumer/server.rb | 6 +++++- lib/pact/mock_service/control_server/run.rb | 1 - lib/pact/mock_service/run.rb | 1 - lib/rack/handler/webbrick.rb | 12 ------------ pact-mock_service.gemspec | 8 ++------ 7 files changed, 8 insertions(+), 25 deletions(-) delete mode 100644 lib/rack/handler/webbrick.rb diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 5497721..f885e8e 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -9,10 +9,7 @@ jobs: matrix: ruby_version: ["2.7", "3.0", "3.1", "3.2", "3.3"] os: ["ubuntu-latest","windows-latest","macos-latest"] - rack_version: ["2", "3"] runs-on: ${{ matrix.os }} - env: - RACK_VERSION: ${{ matrix.rack_version }} steps: - uses: actions/checkout@v4 - uses: ruby/setup-ruby@v1 diff --git a/lib/pact/consumer/mock_service/rack_request_helper.rb b/lib/pact/consumer/mock_service/rack_request_helper.rb index f9184d1..130fc15 100644 --- a/lib/pact/consumer/mock_service/rack_request_helper.rb +++ b/lib/pact/consumer/mock_service/rack_request_helper.rb @@ -24,7 +24,7 @@ def request_as_hash_from env end request[:headers] = headers_from env - body_string = request[:body]&.read || "" + body_string = request[:body].read if body_string.empty? request.delete :body diff --git a/lib/pact/consumer/server.rb b/lib/pact/consumer/server.rb index 7878e2d..767d837 100644 --- a/lib/pact/consumer/server.rb +++ b/lib/pact/consumer/server.rb @@ -1,7 +1,6 @@ require 'uri' require 'net/http' require 'rack' -require 'rack/handler/webbrick' # Copied shamelessly from Capybara # Used to run a mock service in a new thread when started by the AppManager or the ControlServer @@ -67,6 +66,11 @@ def responsive? end def run_default_server(app, port) + begin + require 'rack/handler/webrick' + rescue LoadError + require 'rackup/handler/webrick' + end Rack::Handler::WEBrick.run(app, **webrick_opts) do |server| @port = server[:Port] end diff --git a/lib/pact/mock_service/control_server/run.rb b/lib/pact/mock_service/control_server/run.rb index 8b654c7..0524e2b 100644 --- a/lib/pact/mock_service/control_server/run.rb +++ b/lib/pact/mock_service/control_server/run.rb @@ -1,6 +1,5 @@ require 'pact/mock_service/control_server/app' require 'pact/mock_service/server/webrick_request_monkeypatch' -require 'rack/handler/webbrick' module Pact module MockService diff --git a/lib/pact/mock_service/run.rb b/lib/pact/mock_service/run.rb index d0677f4..85f3166 100644 --- a/lib/pact/mock_service/run.rb +++ b/lib/pact/mock_service/run.rb @@ -5,7 +5,6 @@ require 'pact/mock_service/server/webrick_request_monkeypatch' require 'pact/specification_version' require 'pact/support/metrics' -require 'rack/handler/webbrick' module Pact module MockService diff --git a/lib/rack/handler/webbrick.rb b/lib/rack/handler/webbrick.rb deleted file mode 100644 index 6b5acc0..0000000 --- a/lib/rack/handler/webbrick.rb +++ /dev/null @@ -1,12 +0,0 @@ -module Rack - module Handler - begin - require 'rack/handler/webrick' - WEBrick = Class.new(Rack::Handler::WEBrick) - rescue LoadError - require 'rackup/handler/webrick' - WEBrick = Class.new(Rackup::Handler::WEBrick) - end - end -end - diff --git a/pact-mock_service.gemspec b/pact-mock_service.gemspec index 5e46486..d5aebf5 100644 --- a/pact-mock_service.gemspec +++ b/pact-mock_service.gemspec @@ -20,12 +20,8 @@ Gem::Specification.new do |gem| gem.require_paths = ["lib"] gem.license = 'MIT' - if ENV['RACK_VERSION'] == '2' - gem.add_runtime_dependency 'rack', '>= 2.0', '< 3.0' - else - gem.add_runtime_dependency 'rack', '>= 3.0', '< 4.0' - gem.add_runtime_dependency 'rackup', '~> 2.0' - end + gem.add_runtime_dependency 'rack', '>= 2.0', '< 4.0' + gem.add_runtime_dependency 'rackup', '~> 2.0' gem.add_runtime_dependency 'rspec', '>=2.14' gem.add_runtime_dependency 'find_a_port', '~> 1.0.1' gem.add_runtime_dependency 'thor', '>= 0.19', '< 2.0' From f6b1869fc8c1ffb2b864ac1eeb0453f37572df8f Mon Sep 17 00:00:00 2001 From: Yousaf Nabi Date: Sat, 15 Jun 2024 18:58:27 +0100 Subject: [PATCH 5/5] fix: Fix Rack 3 support --- .github/workflows/test.yml | 3 +++ .../consumer/mock_service/rack_request_helper.rb | 2 +- lib/pact/consumer/server.rb | 6 +----- lib/pact/mock_service/control_server/run.rb | 1 + lib/pact/mock_service/run.rb | 1 + lib/rack/handler/webbrick.rb | 12 ++++++++++++ pact-mock_service.gemspec | 8 ++++++-- 7 files changed, 25 insertions(+), 8 deletions(-) create mode 100644 lib/rack/handler/webbrick.rb diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index f885e8e..5497721 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -9,7 +9,10 @@ jobs: matrix: ruby_version: ["2.7", "3.0", "3.1", "3.2", "3.3"] os: ["ubuntu-latest","windows-latest","macos-latest"] + rack_version: ["2", "3"] runs-on: ${{ matrix.os }} + env: + RACK_VERSION: ${{ matrix.rack_version }} steps: - uses: actions/checkout@v4 - uses: ruby/setup-ruby@v1 diff --git a/lib/pact/consumer/mock_service/rack_request_helper.rb b/lib/pact/consumer/mock_service/rack_request_helper.rb index 130fc15..f9184d1 100644 --- a/lib/pact/consumer/mock_service/rack_request_helper.rb +++ b/lib/pact/consumer/mock_service/rack_request_helper.rb @@ -24,7 +24,7 @@ def request_as_hash_from env end request[:headers] = headers_from env - body_string = request[:body].read + body_string = request[:body]&.read || "" if body_string.empty? request.delete :body diff --git a/lib/pact/consumer/server.rb b/lib/pact/consumer/server.rb index 767d837..7878e2d 100644 --- a/lib/pact/consumer/server.rb +++ b/lib/pact/consumer/server.rb @@ -1,6 +1,7 @@ require 'uri' require 'net/http' require 'rack' +require 'rack/handler/webbrick' # Copied shamelessly from Capybara # Used to run a mock service in a new thread when started by the AppManager or the ControlServer @@ -66,11 +67,6 @@ def responsive? end def run_default_server(app, port) - begin - require 'rack/handler/webrick' - rescue LoadError - require 'rackup/handler/webrick' - end Rack::Handler::WEBrick.run(app, **webrick_opts) do |server| @port = server[:Port] end diff --git a/lib/pact/mock_service/control_server/run.rb b/lib/pact/mock_service/control_server/run.rb index 0524e2b..8b654c7 100644 --- a/lib/pact/mock_service/control_server/run.rb +++ b/lib/pact/mock_service/control_server/run.rb @@ -1,5 +1,6 @@ require 'pact/mock_service/control_server/app' require 'pact/mock_service/server/webrick_request_monkeypatch' +require 'rack/handler/webbrick' module Pact module MockService diff --git a/lib/pact/mock_service/run.rb b/lib/pact/mock_service/run.rb index 85f3166..d0677f4 100644 --- a/lib/pact/mock_service/run.rb +++ b/lib/pact/mock_service/run.rb @@ -5,6 +5,7 @@ require 'pact/mock_service/server/webrick_request_monkeypatch' require 'pact/specification_version' require 'pact/support/metrics' +require 'rack/handler/webbrick' module Pact module MockService diff --git a/lib/rack/handler/webbrick.rb b/lib/rack/handler/webbrick.rb new file mode 100644 index 0000000..6b5acc0 --- /dev/null +++ b/lib/rack/handler/webbrick.rb @@ -0,0 +1,12 @@ +module Rack + module Handler + begin + require 'rack/handler/webrick' + WEBrick = Class.new(Rack::Handler::WEBrick) + rescue LoadError + require 'rackup/handler/webrick' + WEBrick = Class.new(Rackup::Handler::WEBrick) + end + end +end + diff --git a/pact-mock_service.gemspec b/pact-mock_service.gemspec index d5aebf5..5e46486 100644 --- a/pact-mock_service.gemspec +++ b/pact-mock_service.gemspec @@ -20,8 +20,12 @@ Gem::Specification.new do |gem| gem.require_paths = ["lib"] gem.license = 'MIT' - gem.add_runtime_dependency 'rack', '>= 2.0', '< 4.0' - gem.add_runtime_dependency 'rackup', '~> 2.0' + if ENV['RACK_VERSION'] == '2' + gem.add_runtime_dependency 'rack', '>= 2.0', '< 3.0' + else + gem.add_runtime_dependency 'rack', '>= 3.0', '< 4.0' + gem.add_runtime_dependency 'rackup', '~> 2.0' + end gem.add_runtime_dependency 'rspec', '>=2.14' gem.add_runtime_dependency 'find_a_port', '~> 1.0.1' gem.add_runtime_dependency 'thor', '>= 0.19', '< 2.0'