Skip to content

Commit 40be97d

Browse files
committed
feat: monkeypatch webmachine to make the rack env available on the request
1 parent 672f0ee commit 40be97d

File tree

7 files changed

+92
-109
lines changed

7 files changed

+92
-109
lines changed

lib/pact_broker/api.rb

+1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
require 'webmachine/adapters/rack_mapped'
2+
require 'webmachine/rack_adapter_monkey_patch'
23
require 'pact_broker/api/resources'
34
require 'pact_broker/feature_toggle'
45

lib/pact_broker/api/resources/error_handler.rb

+1-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
require 'webmachine/convert_request_to_rack_env'
21
require 'pact_broker/configuration'
32
require 'securerandom'
43

@@ -49,7 +48,7 @@ def self.response_body_hash e, error_reference
4948
def self.report e, error_reference, request
5049
PactBroker.configuration.api_error_reporters.each do | error_notifier |
5150
begin
52-
error_notifier.call(e, env: Webmachine::ConvertRequestToRackEnv.call(request), error_reference: error_reference)
51+
error_notifier.call(e, env: request.env, error_reference: error_reference)
5352
rescue StandardError => e
5453
log_error(e, "Error executing api_error_reporter")
5554
end

lib/webmachine/convert_request_to_rack_env.rb

-37
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
require 'webmachine/request'
2+
require 'webmachine/adapters/rack'
3+
4+
# Monkey patch to make the Rack env available on the Webmachine Request object
5+
6+
module Webmachine
7+
class RackRequest < Webmachine::Request
8+
attr_reader :env
9+
10+
def initialize(method, uri, headers, body, routing_tokens, base_uri, env)
11+
super(method, uri, headers, body, routing_tokens, base_uri)
12+
@env = env
13+
end
14+
end
15+
end
16+
17+
18+
unless Webmachine::Adapters::Rack.private_instance_methods.include?(:build_webmachine_request)
19+
raise "Webmachine::Adapters::Rack no longer has the private instance method #build_webmachine_request - rack env monkey patch won't work"
20+
end
21+
22+
module Webmachine
23+
module Adapters
24+
class Rack < Adapter
25+
private
26+
27+
def build_webmachine_request(rack_req, headers)
28+
Webmachine::RackRequest.new(rack_req.request_method,
29+
rack_req.url,
30+
headers,
31+
RequestBody.new(rack_req),
32+
routing_tokens(rack_req),
33+
base_uri(rack_req),
34+
rack_req.env
35+
)
36+
end
37+
end
38+
end
39+
end

spec/lib/pact_broker/api/resources/error_handler_spec.rb

+1-2
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,13 @@ module Resources
1515
let(:error) { StandardError.new('test error') }
1616
let(:thing) { double('thing', call: nil, another_call: nil) }
1717
let(:options) { { env: env, error_reference: "bYWfnyWPlf" } }
18-
let(:request) { double('request' ) }
18+
let(:request) { double('request', env: env ) }
1919
let(:response) { double('response', :body= => nil) }
2020
let(:env) { double('env') }
2121

2222
subject { ErrorHandler.call(error, request, response) }
2323

2424
before do
25-
allow(Webmachine::ConvertRequestToRackEnv).to receive(:call).and_return(env)
2625
PactBroker.configuration.add_api_error_reporter do | error, options |
2726
thing.call(error, options)
2827
end

spec/lib/webmachine/convert_request_to_rack_env_spec.rb

-68
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
require 'webmachine'
2+
require 'webmachine/adapters/rack_mapped'
3+
require 'webmachine/rack_adapter_monkey_patch'
4+
require 'rack/test'
5+
6+
module Webmachine
7+
module Adapters
8+
class TestResource < Webmachine::Resource
9+
def allowed_methods
10+
["POST"]
11+
end
12+
13+
def process_post
14+
response.body = request.env['FOO']
15+
true
16+
end
17+
end
18+
19+
describe Rack do
20+
include ::Rack::Test::Methods
21+
22+
let(:app) do
23+
pact_api = Webmachine::Application.new do |app|
24+
app.routes do
25+
add(['test'], TestResource)
26+
end
27+
end
28+
29+
pact_api.configure do |config|
30+
config.adapter = :RackMapped
31+
end
32+
33+
pact_api.adapter
34+
end
35+
36+
let(:rack_env) do
37+
{
38+
'FOO' => 'foo'
39+
}
40+
end
41+
42+
subject { post("/test", nil, rack_env) }
43+
44+
it "passes the rack env through on the request" do
45+
expect(subject.status).to eq 200
46+
expect(subject.body).to eq 'foo'
47+
end
48+
end
49+
end
50+
end

0 commit comments

Comments
 (0)