pact_broker 2.113.0 → 2.113.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +19 -0
  3. data/Gemfile +4 -4
  4. data/lib/pact_broker/api/resources/badge.rb +2 -2
  5. data/lib/pact_broker/api/resources/badge_methods.rb +1 -1
  6. data/lib/pact_broker/api/resources/error_handling_methods.rb +2 -2
  7. data/lib/pact_broker/api/resources/error_response_generator.rb +2 -2
  8. data/lib/pact_broker/api/resources/pact_resource_methods.rb +1 -1
  9. data/lib/pact_broker/api/resources/pacticipant_resource_methods.rb +1 -1
  10. data/lib/pact_broker/api/resources/provider_states.rb +1 -1
  11. data/lib/pact_broker/api/resources/publish_contracts.rb +1 -1
  12. data/lib/pact_broker/api/resources/webhook_execution.rb +1 -1
  13. data/lib/pact_broker/app.rb +1 -1
  14. data/lib/pact_broker/diagnostic/app.rb +2 -2
  15. data/lib/pact_broker/test/test_data_builder.rb +1 -1
  16. data/lib/pact_broker/ui/controllers/base_controller.rb +1 -0
  17. data/lib/pact_broker/ui/controllers/dashboard.rb +1 -1
  18. data/lib/pact_broker/ui/controllers/index.rb +1 -1
  19. data/lib/pact_broker/version.rb +1 -1
  20. data/lib/pact_broker/webhooks/webhook_request_template.rb +4 -3
  21. data/lib/pact_broker/webmachine.rb +2 -3
  22. data/lib/rack/pact_broker/add_cache_header.rb +1 -1
  23. data/lib/rack/pact_broker/add_pact_broker_version_header.rb +1 -1
  24. data/lib/rack/pact_broker/add_vary_header.rb +1 -1
  25. data/lib/rack/pact_broker/cascade.rb +2 -2
  26. data/lib/rack/pact_broker/invalid_uri_protection.rb +1 -1
  27. data/lib/rack/pact_broker/request_target.rb +2 -2
  28. data/lib/webmachine/adapters/rack3_adapter.rb +178 -0
  29. data/lib/webmachine/adapters.rb +9 -0
  30. data/lib/webmachine/describe_routes.rb +4 -4
  31. data/lib/webmachine/render_error_monkey_patch.rb +1 -1
  32. data/pact_broker.gemspec +2 -3
  33. metadata +15 -27
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7f58c954e3864629cd056224198acfe87df68d7a38ff2a098bf1c7e78541a8d1
4
- data.tar.gz: 6f59e94416775c9beb054cd7ef0ca77e055505e99864a8cc0c0dd4c8a0bf3f9b
3
+ metadata.gz: ae37811c3c1f10c9ce20490a05dd1d4683c3c071c3529877d14fde1c1dcb9d77
4
+ data.tar.gz: 437dabe157b2b2644edbbfdbd71d060f78aa449cfdff717552e074db0a69fa25
5
5
  SHA512:
6
- metadata.gz: d64bab2b42d053d80a63c797e2a3ee84f2731a8eee85368a31bb1d70a102ef38df362feb7ef9151b2890307944123e0a0ec04acb82e1c7d956f88c12d6935116
7
- data.tar.gz: 8c46ee348ffad72bad86d132873e1d812c70585b570d8e63c7b71187dfd653afa1eea795f804b8fb2d2ed3fe1f7d372996ff4eb598fcc17a775cd214be5cb236
6
+ metadata.gz: ff2279ac36ad3f8de1c05a7b059bca6b207399613f9920303d69f03865a3727cde1b9eaacf765c7e2c3c4ad6e0db7bd927c1f45464feeac0d77193bc32f1e013
7
+ data.tar.gz: 851dd199c1085589350e676cb03aa6efa06915dbea1cb574d515a66a52e59039f6faab1a962dd16605427b0f62fb845d45d2c57bc221fac8ae8eb6881016bbd0
data/CHANGELOG.md CHANGED
@@ -1,3 +1,22 @@
1
+ <a name="v2.113.2"></a>
2
+ ### v2.113.2 (2025-03-05)
3
+
4
+ #### Bug Fixes
5
+
6
+ * downcase Content-Type header ([6eebfbdf](/../../commit/6eebfbdf))
7
+ * downcase X-Pact-Broker-Version header ([8dfb3ac2](/../../commit/8dfb3ac2))
8
+ * downcase Cache-Control header ([6ceae489](/../../commit/6ceae489))
9
+ * downcase Vary header ([a43416a3](/../../commit/a43416a3))
10
+ * add webmachine monkey patch to exclude webrick default load ([ef674d37](/../../commit/ef674d37))
11
+
12
+ <a name="v2.113.1"></a>
13
+ ### v2.113.1 (2025-02-20)
14
+
15
+ #### Bug Fixes
16
+
17
+ * Update openapi_first and use it's coverage thing (#783) ([b3da850b](/../../commit/b3da850b))
18
+ * incorrect ProviderStates policy name. (#782) ([bddfd2d0](/../../commit/bddfd2d0))
19
+
1
20
  <a name="v2.113.0"></a>
2
21
  ### v2.113.0 (2025-02-13)
3
22
 
data/Gemfile CHANGED
@@ -7,8 +7,8 @@ gem "rake", "~>13.0"
7
7
  gem "sqlite3", ">=2.0.0"
8
8
  gem "conventional-changelog", "~>1.3"
9
9
  gem "bump", "~> 0.5"
10
- gem "padrino-core", ">= 0.14.3", "~> 0.14", require: false
11
- gem "sinatra", "~> 3.0", require: false
10
+ gem "padrino-core", ">= 0.16.0.pre3", require: false
11
+ gem "rackup", "~> 2.2"
12
12
 
13
13
  group :development do
14
14
  gem "pry-byebug"
@@ -29,11 +29,11 @@ group :test do
29
29
  gem "database_cleaner", "~>1.8", ">= 1.8.1"
30
30
  gem "timecop", "~> 0.9"
31
31
  gem "faraday", "~>2.0"
32
- gem "docker-api", "~>1.34"
32
+ gem "docker-api", "~>2.0"
33
33
  gem "approvals", ">=0.0.24", "<1.0.0"
34
34
  gem "tzinfo", "~>2.0"
35
35
  gem "faraday-retry", "~>2.0"
36
- gem "openapi_first", "~>0.20"
36
+ gem "openapi_first", ">= 2.3", "< 3"
37
37
  end
38
38
 
39
39
  group :pg, optional: true do
@@ -18,12 +18,12 @@ module PactBroker
18
18
  end
19
19
 
20
20
  def to_svg
21
- response.headers["Cache-Control"] = "no-cache"
21
+ response.headers["cache-control"] = "no-cache"
22
22
  comment + badge_service.pact_verification_badge(pact, label, initials, pseudo_branch_verification_status, tags)
23
23
  end
24
24
 
25
25
  def moved_temporarily?
26
- response.headers["Cache-Control"] = "no-cache"
26
+ response.headers["cache-control"] = "no-cache"
27
27
  badge_service.pact_verification_badge_url(pact, label, initials, pseudo_branch_verification_status, tags)
28
28
  end
29
29
 
@@ -47,7 +47,7 @@ module PactBroker
47
47
  end
48
48
 
49
49
  def set_cache_control(cache_control_str)
50
- response.headers["Cache-Control"] = cache_control_str
50
+ response.headers["cache-control"] = cache_control_str
51
51
  end
52
52
 
53
53
  private
@@ -32,13 +32,13 @@ module PactBroker
32
32
  # @param [String] type
33
33
  # @param [Integer] status
34
34
  def set_json_error_message(detail, title: "Server error", type: "server-error", status: 500)
35
- response.headers["Content-Type"] = error_response_content_type
35
+ response.headers["content-type"] = error_response_content_type
36
36
  response.body = error_response_body(detail, title, type, status)
37
37
  end
38
38
 
39
39
  # @param [Hash,Dry::Validation::MessageSet] errors
40
40
  def set_json_validation_error_messages(errors)
41
- response.headers["Content-Type"] = error_response_content_type
41
+ response.headers["content-type"] = error_response_content_type
42
42
  response.body = validation_errors_response_body(errors)
43
43
  end
44
44
 
@@ -68,9 +68,9 @@ module PactBroker
68
68
 
69
69
  private_class_method def self.headers(env)
70
70
  if problem_json?(env)
71
- { "Content-Type" => "application/problem+json;charset=utf-8" }
71
+ { "content-type" => "application/problem+json;charset=utf-8" }
72
72
  else
73
- { "Content-Type" => "application/hal+json;charset=utf-8" }
73
+ { "content-type" => "application/hal+json;charset=utf-8" }
74
74
  end
75
75
  end
76
76
 
@@ -15,7 +15,7 @@ module PactBroker
15
15
  }
16
16
  end
17
17
  response.body = response_body.to_json
18
- response.headers["Content-Type" => "application/hal+json;charset=utf-8"]
18
+ response.headers["content-type" => "application/hal+json;charset=utf-8"]
19
19
  end
20
20
  end
21
21
  end
@@ -8,7 +8,7 @@ module PactBroker
8
8
  messages = pacticipant_service.messages_for_potential_duplicate_pacticipants pacticipant_names, base_url
9
9
  if messages.any?
10
10
  response.body = messages.join("\n")
11
- response.headers["Content-Type"] = "text/plain"
11
+ response.headers["content-type"] = "text/plain"
12
12
  end
13
13
  messages.any?
14
14
  else
@@ -22,7 +22,7 @@ module PactBroker
22
22
  end
23
23
 
24
24
  def policy_name
25
- :'pacts::pacts'
25
+ :'pacts::pact'
26
26
  end
27
27
 
28
28
  private
@@ -97,7 +97,7 @@ module PactBroker
97
97
  contracts: conflict_notices.select(&:error?).collect(&:text)
98
98
  }
99
99
  }.to_json
100
- response.headers["Content-Type"] = "application/json;charset=utf-8"
100
+ response.headers["content-type"] = "application/json;charset=utf-8"
101
101
  end
102
102
 
103
103
  def conflict_notices
@@ -21,7 +21,7 @@ module PactBroker
21
21
 
22
22
  def process_post
23
23
  webhook_execution_result = webhook_trigger_service.test_execution(webhook, webhook_execution_configuration.webhook_context, webhook_execution_configuration)
24
- response.headers["Content-Type"] = "application/hal+json;charset=utf-8"
24
+ response.headers["content-type"] = "application/hal+json;charset=utf-8"
25
25
  response.body = post_response_body(webhook_execution_result)
26
26
  true
27
27
  end
@@ -197,7 +197,7 @@ module PactBroker
197
197
  @app_builder.use Rack::PactBroker::AddPactBrokerVersionHeader
198
198
  @app_builder.use Rack::PactBroker::AddVaryHeader
199
199
  @app_builder.use Rack::Static, :urls => ["/stylesheets", "/css", "/fonts", "/js", "/javascripts", "/images"], :root => PactBroker.project_root.join("public")
200
- @app_builder.use Rack::Static, :urls => ["/favicon.ico"], :root => PactBroker.project_root.join("public/images"), header_rules: [[:all, {"Content-Type" => "image/x-icon"}]]
200
+ @app_builder.use Rack::Static, :urls => ["/favicon.ico"], :root => PactBroker.project_root.join("public/images"), header_rules: [[:all, {"content-type" => "image/x-icon"}]]
201
201
  @app_builder.use Rack::PactBroker::AddCacheHeader
202
202
  @app_builder.use Rack::PactBroker::ConvertFileExtensionToAcceptHeader
203
203
  # Rack::PactBroker::SetBaseUrl needs to be before the Rack::PactBroker::HalBrowserRedirect
@@ -1,6 +1,6 @@
1
1
  require "pact_broker/diagnostic/resources/heartbeat"
2
2
  require "pact_broker/diagnostic/resources/dependencies"
3
- require "webmachine/adapters/rack_mapped"
3
+ require "webmachine/adapters/rack3_adapter"
4
4
 
5
5
  module PactBroker
6
6
  module Diagnostic
@@ -27,7 +27,7 @@ module PactBroker
27
27
  end
28
28
 
29
29
  app.configure do |config|
30
- config.adapter = :RackMapped
30
+ config.adapter = :Rack3Mapped
31
31
  end
32
32
 
33
33
  app.adapter
@@ -362,7 +362,7 @@ module PactBroker
362
362
  params[:events] || [{ name: PactBroker::Webhooks::WebhookEvent::DEFAULT_EVENT_NAME }]
363
363
  end
364
364
  events = event_params.collect{ |e| PactBroker::Webhooks::WebhookEvent.new(e) }
365
- template_params = { method: "POST", url: "http://example.org", headers: {"Content-Type" => "application/json"}, username: params[:username], password: params[:password] }
365
+ template_params = { method: "POST", url: "http://example.org", headers: {"content-type" => "application/json"}, username: params[:username], password: params[:password] }
366
366
  request = PactBroker::Webhooks::WebhookRequestTemplate.new(template_params.merge(params))
367
367
  new_webhook = PactBroker::Domain::Webhook.new(
368
368
  request: request,
@@ -1,3 +1,4 @@
1
+ require "rackup"
1
2
  require "padrino-core"
2
3
  require "haml"
3
4
  require "pact_broker/services"
@@ -70,7 +70,7 @@ module PactBroker
70
70
  private
71
71
 
72
72
  def set_headers
73
- response.headers["Cache-Control"] = "no-cache, no-store, must-revalidate"
73
+ response.headers["cache-control"] = "no-cache, no-store, must-revalidate"
74
74
  response.headers["Pragma"] = "no-cache"
75
75
  response.headers["Expires"] = "0"
76
76
  end
@@ -55,7 +55,7 @@ module PactBroker
55
55
  private
56
56
 
57
57
  def set_headers
58
- response.headers["Cache-Control"] = "no-cache, no-store, must-revalidate"
58
+ response.headers["cache-control"] = "no-cache, no-store, must-revalidate"
59
59
  response.headers["Pragma"] = "no-cache"
60
60
  response.headers["Expires"] = "0"
61
61
  end
@@ -1,3 +1,3 @@
1
1
  module PactBroker
2
- VERSION = "2.113.0"
2
+ VERSION = "2.113.2"
3
3
  end
@@ -24,7 +24,8 @@ module PactBroker
24
24
  attributes.each do | (name, value) |
25
25
  instance_variable_set("@#{name}", value) if respond_to?(name)
26
26
  end
27
- @headers = Rack::Utils::HeaderHash.new(attributes[:headers] || {})
27
+ @headers = Rack::Headers.new
28
+ @headers.merge!(attributes[:headers]) if attributes[:headers]
28
29
  end
29
30
 
30
31
  def build(template_params, user_agent: nil, disable_ssl_verification: false, cert_store: nil)
@@ -59,7 +60,7 @@ module PactBroker
59
60
  end
60
61
 
61
62
  def headers= headers
62
- @headers = Rack::Utils::HeaderHash.new(headers)
63
+ @headers.replace(headers)
63
64
  end
64
65
 
65
66
  def uses_parameter?(parameter_name)
@@ -114,7 +115,7 @@ module PactBroker
114
115
  end
115
116
 
116
117
  def build_headers(template_params)
117
- headers.each_with_object(Rack::Utils::HeaderHash.new) do | (key, value), new_headers |
118
+ headers.each_with_object(Rack::Headers.new) do | (key, value), new_headers |
118
119
  new_headers[key] = build_string(value, template_params)
119
120
  end
120
121
  end
@@ -1,10 +1,9 @@
1
1
  require "webmachine"
2
2
  require "webmachine/application_monkey_patch"
3
- require "webmachine/adapters/rack_mapped"
3
+ require "webmachine/adapters/rack3_adapter"
4
4
  require "webmachine/application_monkey_patch"
5
5
  require "webmachine/render_error_monkey_patch"
6
6
 
7
-
8
7
  module Webmachine
9
8
  def self.build_rack_api(application_context)
10
9
  api = Webmachine::Application.new do |app|
@@ -14,7 +13,7 @@ module Webmachine
14
13
  api.application_context = application_context
15
14
 
16
15
  api.configure do |config|
17
- config.adapter = :RackMapped
16
+ config.adapter = :Rack3Mapped
18
17
  end
19
18
 
20
19
  api.adapter
@@ -7,7 +7,7 @@ module Rack
7
7
 
8
8
  def call(env)
9
9
  status, headers, body = @app.call(env)
10
- [status, { "Cache-Control" => "no-cache" }.merge(headers || {}), body]
10
+ [status, { "cache-control" => "no-cache" }.merge(headers || {}), body]
11
11
  end
12
12
  end
13
13
  end
@@ -4,7 +4,7 @@ module Rack
4
4
  module PactBroker
5
5
  class AddPactBrokerVersionHeader
6
6
 
7
- X_PACT_BROKER_VERSION = "X-Pact-Broker-Version".freeze
7
+ X_PACT_BROKER_VERSION = "x-pact-broker-version".freeze
8
8
 
9
9
  def initialize app
10
10
  @app = app
@@ -32,7 +32,7 @@ module Rack
32
32
 
33
33
  def call(env)
34
34
  status, headers, body = @app.call(env)
35
- [status, { "Vary" => "Accept" }.merge(headers || {}), body]
35
+ [status, { "vary" => "Accept" }.merge(headers || {}), body]
36
36
  end
37
37
  end
38
38
  end
@@ -18,7 +18,7 @@ module Rack
18
18
  module PactBroker
19
19
  class Cascade
20
20
  # deprecated, no longer used
21
- NotFound = [404, { CONTENT_TYPE => "text/plain" }, []]
21
+ NotFound = [404, { "content-type" => "text/plain" }, []]
22
22
 
23
23
  # An array of applications to try in order.
24
24
  attr_reader :apps
@@ -41,7 +41,7 @@ module Rack
41
41
  # cascading, try the next app. If all responses require cascading,
42
42
  # return the response from the last app.
43
43
  def call(env)
44
- return [404, { CONTENT_TYPE => "text/plain" }, []] if @apps.empty?
44
+ return [404, { "content-type" => "text/plain" }, []] if @apps.empty?
45
45
  result = nil
46
46
  last_body = nil
47
47
 
@@ -58,7 +58,7 @@ module Rack
58
58
  end
59
59
 
60
60
  def headers
61
- {"Content-Type" => "application/problem+json"}
61
+ {"content-type" => "application/problem+json"}
62
62
  end
63
63
 
64
64
  def body(env, detail, title, type, status)
@@ -20,7 +20,7 @@ module Rack
20
20
  private
21
21
 
22
22
  def body_is_json(env)
23
- env["CONTENT_TYPE"]&.include?("json")
23
+ env["content-type"]&.include?("json")
24
24
  end
25
25
 
26
26
  def explicit_request_for_api(env)
@@ -32,7 +32,7 @@ module Rack
32
32
  end
33
33
 
34
34
  def body_is_api_content_type(env)
35
- is_api_content_type((env["CONTENT_TYPE"]&.downcase) || "")
35
+ is_api_content_type((env["content-type"]&.downcase) || "")
36
36
  end
37
37
 
38
38
  def is_api_content_type(header)
@@ -0,0 +1,178 @@
1
+ # Taken from https://github.com/webmachine/webmachine-ruby/blob/master/lib/webmachine/adapters/rack.rb
2
+
3
+ require "webmachine/adapter"
4
+ require "rack"
5
+ require "webmachine/constants"
6
+ require "webmachine/headers"
7
+ require "webmachine/request"
8
+ require "webmachine/response"
9
+ require "webmachine/version"
10
+ require "webmachine/chunked_body"
11
+
12
+ module Webmachine
13
+ module Adapters
14
+ class Rack3 < Adapter
15
+ # Used to override default Rack server options (useful in testing)
16
+ DEFAULT_OPTIONS = {}
17
+
18
+ REQUEST_URI = "REQUEST_URI".freeze
19
+ RACK_VERSION = ::Rack::RELEASE.match(/^(\d+\.\d+)/)[1]
20
+ VERSION_STRING = "#{Webmachine::SERVER_STRING} Rack/#{RACK_VERSION}".freeze
21
+ NEWLINE = "\n".freeze
22
+
23
+ # Start the Rack adapter
24
+ def run
25
+ options = DEFAULT_OPTIONS.merge({
26
+ app: self,
27
+ Port: application.configuration.port,
28
+ Host: application.configuration.ip
29
+ }).merge(application.configuration.adapter_options)
30
+
31
+ @server = ::Rack::Server.new(options)
32
+ @server.start
33
+ end
34
+
35
+ # Handles a Rack-based request.
36
+ # @param [Hash] env the Rack environment
37
+ def call(env)
38
+ headers = Webmachine::Headers.from_cgi(env)
39
+
40
+ rack_req = ::Rack::Request.new env
41
+ request = build_webmachine_request(rack_req, headers)
42
+
43
+ response = Webmachine::Response.new
44
+ application.dispatcher.dispatch(request, response)
45
+
46
+ response.headers[SERVER] = VERSION_STRING
47
+
48
+ rack_body =
49
+ case response.body
50
+ when String # Strings are enumerable in ruby 1.8
51
+ [response.body]
52
+ else
53
+ if (io_body = IO.try_convert(response.body))
54
+ io_body
55
+ elsif response.body.respond_to?(:call)
56
+ response.body
57
+ elsif response.body.respond_to?(:each)
58
+ response.body
59
+ else
60
+ [response.body.to_s]
61
+ end
62
+ end
63
+
64
+ rack_res = ::Rack::Response.new(rack_body, response.code, response.headers)
65
+ rack_res.finish
66
+ end
67
+
68
+ protected
69
+
70
+ def routing_tokens(_rack_req)
71
+ nil # no-op for default, un-mapped rack adapter
72
+ end
73
+
74
+ def base_uri(_rack_req)
75
+ nil # no-op for default, un-mapped rack adapter
76
+ end
77
+
78
+ private
79
+
80
+ def build_webmachine_request(rack_req, headers)
81
+ RackRequest.new(rack_req.request_method,
82
+ rack_req.url,
83
+ headers,
84
+ RequestBody.new(rack_req),
85
+ routing_tokens(rack_req),
86
+ base_uri(rack_req),
87
+ rack_req.env)
88
+ end
89
+
90
+ class RackRequest < Webmachine::Request
91
+ attr_reader :env
92
+
93
+ # Yeah, Rubocop, piss off!
94
+ # rubocop:disable ParameterLists
95
+ def initialize(method, uri, headers, body, routing_tokens, base_uri, env)
96
+ super(method, uri, headers, body, routing_tokens, base_uri)
97
+ @env = env
98
+ end
99
+ end
100
+
101
+ # Wraps the Rack input so it can be treated like a String or
102
+ # Enumerable.
103
+ # @api private
104
+ class RequestBody
105
+ # @param [Rack::Request] request the Rack request
106
+ def initialize(request)
107
+ @request = request
108
+ end
109
+
110
+ # Rack Servers differ in the way you can access their request bodys.
111
+ # While some allow you to directly get a Ruby IO object others don't.
112
+ # You have to check the methods they expose, like #gets, #read, #each, #rewind and maybe others.
113
+ # See: https://github.com/rack/rack/blob/rack-1.5/lib/rack/lint.rb#L296
114
+ # @return [IO] the request body
115
+ def to_io
116
+ @request.body
117
+ end
118
+
119
+ # Converts the body to a String so you can work with the entire
120
+ # thing.
121
+ # @return [String] the request body as a string
122
+ def to_s
123
+ if @value
124
+ @value.join
125
+ elsif @request.body.respond_to?(:to_ary)
126
+ @request.body.to_ary.join
127
+ elsif @request.body.respond_to?(:read)
128
+ @request.body.rewind if @request.body.respond_to?(:rewind)
129
+ @request.body.read
130
+ else
131
+ @request.body&.to_s || ""
132
+ end
133
+ end
134
+
135
+ # Iterates over the body in chunks. If the body has previously
136
+ # been read, this method can be called again and get the same
137
+ # sequence of chunks.
138
+ # @yield [chunk]
139
+ # @yieldparam [String] chunk a chunk of the request body
140
+ def each
141
+ if @value
142
+ @value.each { |chunk| yield chunk }
143
+ elsif @request.body.respond_to?(:each)
144
+ @value = []
145
+ @request.body.each { |chunk|
146
+ @value << chunk
147
+ yield chunk
148
+ }
149
+ elsif @request.body.respond_to?(:to_ary)
150
+ @value = @request.body.to_ary
151
+ @value.each { |chunk| yield chunk }
152
+ else
153
+ yield @request.body
154
+ end
155
+ end
156
+ end # class RequestBody
157
+ end # class Rack
158
+
159
+ class Rack3Mapped < Rack3
160
+ protected
161
+
162
+ def routing_tokens(rack_req)
163
+ routing_match = rack_req.path_info.match(Webmachine::Request::ROUTING_PATH_MATCH)
164
+ routing_path = routing_match ? routing_match[1] : ""
165
+ routing_path.split(SLASH)
166
+ end
167
+
168
+ def base_uri(rack_req)
169
+ # rack SCRIPT_NAME env var doesn't end with "/". This causes weird
170
+ # behavour when URI.join concatenates URI components in
171
+ # Webmachine::Decision::Flow#n11
172
+ script_name = rack_req.script_name + SLASH
173
+ URI.join(rack_req.base_url, script_name)
174
+ end
175
+ end # class RackMapped
176
+
177
+ end # module Adapters
178
+ end # module Webmachine
@@ -0,0 +1,9 @@
1
+ require "webmachine/adapters/lazy_request_body"
2
+ # require "webmachine/adapters/webrick" # Commenting out this line as our monkey patch
3
+
4
+ module Webmachine
5
+ # Contains classes and modules that connect Webmachine to Ruby
6
+ # application servers.
7
+ module Adapters
8
+ end
9
+ end
@@ -1,4 +1,4 @@
1
- require "webmachine/adapters/rack_mapped"
1
+ require "webmachine/adapters/rack3_adapter"
2
2
  require "pact_broker/string_refinements"
3
3
 
4
4
  # Code to describe the routes in a Webmachine API, including
@@ -44,11 +44,11 @@ module Webmachine
44
44
  }.merge(path_params)
45
45
 
46
46
  rack_req = ::Rack::Request.new({ "REQUEST_METHOD" => "GET", "rack.input" => StringIO.new("") }.merge(env) )
47
- request = Webmachine::Adapters::Rack::RackRequest.new(
47
+ request = Webmachine::Adapters::Rack3::RackRequest.new(
48
48
  rack_req.env["REQUEST_METHOD"],
49
49
  path,
50
50
  Webmachine::Headers.from_cgi({"HTTP_HOST" => "example.org"}.merge(env)),
51
- Webmachine::Adapters::Rack::RequestBody.new(rack_req),
51
+ Webmachine::Adapters::Rack3::RequestBody.new(rack_req),
52
52
  {},
53
53
  {},
54
54
  rack_req.env
@@ -134,7 +134,7 @@ module Webmachine
134
134
  end
135
135
 
136
136
  def self.build_request(http_method: "GET", path_info: )
137
- request = Webmachine::Adapters::Rack::RackRequest.new(http_method, "/", Webmachine::Headers["host" => "example.org"], nil, {}, {}, { "REQUEST_METHOD" => http_method })
137
+ request = Webmachine::Adapters::Rack3::RackRequest.new(http_method, "/", Webmachine::Headers["host" => "example.org"], nil, {}, {}, { "REQUEST_METHOD" => http_method })
138
138
  request.path_info = path_info
139
139
  request
140
140
  end
@@ -36,7 +36,7 @@ module Webmachine
36
36
  message = options[:message] if options[:message]
37
37
 
38
38
  res.body = error_response_body(req, message, title, title.dasherize.gsub(/^\d+\-/, ""), code, req)
39
- res.headers[CONTENT_TYPE] = error_response_content_type(req)
39
+ res.headers["content-type"] = error_response_content_type(req)
40
40
  end
41
41
  ensure_content_length(res)
42
42
  ensure_date_header(res)
data/pact_broker.gemspec CHANGED
@@ -56,14 +56,13 @@ Gem::Specification.new do |gem|
56
56
  gem.add_runtime_dependency "reform", "~> 2.6"
57
57
  gem.add_runtime_dependency "sequel", "~> 5.28"
58
58
  gem.add_runtime_dependency "webmachine", ">= 2.0.0.beta", "< 3.0"
59
- gem.add_runtime_dependency "webrick", "~> 1.8" # webmachine requires webrick, but doesn't declare it as a dependency :shrug:
60
59
  gem.add_runtime_dependency "semver2", "~> 3.4.2"
61
- gem.add_runtime_dependency "rack", ">= 2.2.3", "~> 2.2" # TODO update to 3
60
+ gem.add_runtime_dependency "rack", "~> 3.1", ">= 3.1.11"
62
61
  gem.add_runtime_dependency "redcarpet", ">= 3.5.1", "~>3.5"
63
62
  gem.add_runtime_dependency "pact-support" , ">= 1.21.2", "~> 1.21"
64
63
  gem.add_runtime_dependency "haml", "~>5.0"
65
64
  gem.add_runtime_dependency "sucker_punch", "~>3.0"
66
- gem.add_runtime_dependency "rack-protection", "~> 3.0"
65
+ gem.add_runtime_dependency "rack-protection", "~> 4.1"
67
66
  gem.add_runtime_dependency "table_print", "~> 1.5"
68
67
  gem.add_runtime_dependency "semantic_logger", "~> 4.11"
69
68
  gem.add_runtime_dependency "sanitize", "~> 6.0"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pact_broker
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.113.0
4
+ version: 2.113.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bethany Skurrie
@@ -9,7 +9,7 @@ authors:
9
9
  - Warner Godfrey
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2025-02-13 00:00:00.000000000 Z
12
+ date: 2025-03-06 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: json
@@ -115,20 +115,6 @@ dependencies:
115
115
  - - "<"
116
116
  - !ruby/object:Gem::Version
117
117
  version: '3.0'
118
- - !ruby/object:Gem::Dependency
119
- name: webrick
120
- requirement: !ruby/object:Gem::Requirement
121
- requirements:
122
- - - "~>"
123
- - !ruby/object:Gem::Version
124
- version: '1.8'
125
- type: :runtime
126
- prerelease: false
127
- version_requirements: !ruby/object:Gem::Requirement
128
- requirements:
129
- - - "~>"
130
- - !ruby/object:Gem::Version
131
- version: '1.8'
132
118
  - !ruby/object:Gem::Dependency
133
119
  name: semver2
134
120
  requirement: !ruby/object:Gem::Requirement
@@ -147,22 +133,22 @@ dependencies:
147
133
  name: rack
148
134
  requirement: !ruby/object:Gem::Requirement
149
135
  requirements:
150
- - - ">="
151
- - !ruby/object:Gem::Version
152
- version: 2.2.3
153
136
  - - "~>"
154
137
  - !ruby/object:Gem::Version
155
- version: '2.2'
138
+ version: '3.1'
139
+ - - ">="
140
+ - !ruby/object:Gem::Version
141
+ version: 3.1.11
156
142
  type: :runtime
157
143
  prerelease: false
158
144
  version_requirements: !ruby/object:Gem::Requirement
159
145
  requirements:
160
- - - ">="
161
- - !ruby/object:Gem::Version
162
- version: 2.2.3
163
146
  - - "~>"
164
147
  - !ruby/object:Gem::Version
165
- version: '2.2'
148
+ version: '3.1'
149
+ - - ">="
150
+ - !ruby/object:Gem::Version
151
+ version: 3.1.11
166
152
  - !ruby/object:Gem::Dependency
167
153
  name: redcarpet
168
154
  requirement: !ruby/object:Gem::Requirement
@@ -237,14 +223,14 @@ dependencies:
237
223
  requirements:
238
224
  - - "~>"
239
225
  - !ruby/object:Gem::Version
240
- version: '3.0'
226
+ version: '4.1'
241
227
  type: :runtime
242
228
  prerelease: false
243
229
  version_requirements: !ruby/object:Gem::Requirement
244
230
  requirements:
245
231
  - - "~>"
246
232
  - !ruby/object:Gem::Version
247
- version: '3.0'
233
+ version: '4.1'
248
234
  - !ruby/object:Gem::Dependency
249
235
  name: table_print
250
236
  requirement: !ruby/object:Gem::Requirement
@@ -1107,6 +1093,8 @@ files:
1107
1093
  - lib/sequel/plugins/age.rb
1108
1094
  - lib/sequel/plugins/insert_ignore.rb
1109
1095
  - lib/sequel/plugins/upsert.rb
1096
+ - lib/webmachine/adapters.rb
1097
+ - lib/webmachine/adapters/rack3_adapter.rb
1110
1098
  - lib/webmachine/application_monkey_patch.rb
1111
1099
  - lib/webmachine/describe_routes.rb
1112
1100
  - lib/webmachine/render_error_monkey_patch.rb
@@ -1238,7 +1226,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
1238
1226
  - !ruby/object:Gem::Version
1239
1227
  version: '0'
1240
1228
  requirements: []
1241
- rubygems_version: 3.6.3
1229
+ rubygems_version: 3.6.5
1242
1230
  specification_version: 4
1243
1231
  summary: See description
1244
1232
  test_files: []