Skip to content

Commit 0724701

Browse files
committed
fix: ensure underscored headers are maintained
pact-foundation/pact-net#148
1 parent e63f2ba commit 0724701

File tree

7 files changed

+78
-4
lines changed

7 files changed

+78
-4
lines changed

lib/pact/consumer/mock_service/rack_request_helper.rb

+13-2
Original file line numberDiff line numberDiff line change
@@ -38,14 +38,25 @@ def request_as_hash_from env
3838

3939
def headers_from env
4040
headers = env.reject{ |key, value| !(key.start_with?("HTTP") || key == 'CONTENT_TYPE' || key == 'CONTENT_LENGTH')}
41-
headers.inject({}) do | hash, header |
41+
dasherized_headers = headers.inject({}) do | hash, header |
4242
hash[standardise_header(header.first)] = header.last
4343
hash
4444
end
45+
# This header is set in lib/pact/mock_service/server/webrick_request_monkeypatch.rb to allow use to
46+
# restore the original header names with underscores.
47+
restore_underscored_header_names(dasherized_headers, (env['X_PACT_UNDERSCORED_HEADER_NAMES'] || '').split(","))
4548
end
4649

4750
def standardise_header header
48-
header.gsub(/^HTTP_/, '').split("_").collect{|word| word[0] + word[1..-1].downcase}.join("-")
51+
header.gsub(/^HTTP_/, '').split(/[_-]/).collect{|word| word[0].upcase + word[1..-1].downcase}.join("-")
52+
end
53+
54+
def restore_underscored_header_names dasherized_headers, original_header_names
55+
original_header_names.each_with_object(dasherized_headers) do | original_header_name, headers |
56+
if headers.key?(standardise_header(original_header_name))
57+
headers[original_header_name] = headers.delete(standardise_header(original_header_name))
58+
end
59+
end
4960
end
5061
end
5162
end

lib/pact/mock_service/control_server/run.rb

+1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
require 'pact/mock_service/control_server/app'
2+
require 'pact/mock_service/server/webrick_request_monkeypatch'
23

34
module Pact
45
module MockService

lib/pact/mock_service/run.rb

+1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
require 'pact/mock_service/app'
33
require 'pact/consumer/mock_service/set_location'
44
require 'pact/mock_service/run'
5+
require 'pact/mock_service/server/webrick_request_monkeypatch'
56

67
module Pact
78
module MockService
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
module WEBrick
2+
class HTTPRequest
3+
alias_method :pact_original_meta_vars, :meta_vars
4+
5+
def meta_vars
6+
original_underscored_headers = []
7+
self.each{|key, val| original_underscored_headers << key if key.include?("_") }
8+
# This header allows us to restore the original format (eg. underscored) of the headers
9+
# when parsing the incoming Rack env back to a response object.
10+
vars = pact_original_meta_vars
11+
vars["X_PACT_UNDERSCORED_HEADER_NAMES"] = original_underscored_headers.join(",")
12+
vars
13+
end
14+
end
15+
end

spec/integration/cli_spec.rb

+7
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,13 @@
2323
expect(response.status).to eq 200
2424
end
2525

26+
it "respects headers with underscores" do
27+
setup_interaction_with_underscored_header 1234
28+
response = invoke_request_with_underscored_header 1234
29+
puts response.body unless response.status == 200
30+
expect(response.status).to eq 200
31+
end
32+
2633
it "sets the X-Pact-Mock-Service-Location header" do
2734
response = setup_interaction 1234
2835
expect(response.headers['X-Pact-Mock-Service-Location']).to eq 'http://0.0.0.0:1234'

spec/lib/pact/consumer/mock_service/rack_request_helper_spec.rb

+15-2
Original file line numberDiff line numberDiff line change
@@ -63,10 +63,10 @@ class TestSubject
6363
}
6464
}
6565

66+
let(:expected_body) { body }
6667
context "with a text body" do
6768
let(:content_type) { "application/x-www-form-urlencoded" }
6869
let(:body) { 'this is the body' }
69-
let(:expected_body) { body }
7070

7171
it "extracts the body" do
7272
expect(subject.request_as_hash_from(rack_env)).to eq expected_request
@@ -83,6 +83,19 @@ class TestSubject
8383
end
8484
end
8585

86+
context "with X_PACT_UNDERSCORED_HEADER_NAMES" do
87+
before do
88+
rack_env["HTTP_ACCESS_TOKEN"] = "123"
89+
rack_env["X_PACT_UNDERSCORED_HEADER_NAMES"] = "access_token"
90+
end
91+
92+
let(:request) { subject.request_as_hash_from(rack_env) }
8693

94+
it "sets any headers with underscores back to their original format" do
95+
expect(request[:headers]["access_token"]).to eq "123"
96+
expect(request[:headers]["X-Something"]).to eq "1, 2"
97+
expect(request[:headers].key?("Access-Token")).to be false
98+
end
99+
end
87100
end
88-
end
101+
end

spec/support/integration_spec_support.rb

+26
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,20 @@ def another_expected_interaction
8282
}.to_json
8383
end
8484

85+
def interaction_with_underscored_header
86+
{
87+
description: "another request for a greeting",
88+
request: {
89+
method: :get,
90+
headers: {'access_token' => '123'},
91+
path: '/'
92+
},
93+
response: {
94+
status: 200
95+
}
96+
}.to_json
97+
end
98+
8599
def mock_service_headers
86100
{
87101
'Content-Type' => 'application/json',
@@ -108,6 +122,12 @@ def setup_another_interaction port
108122
mock_service_headers
109123
end
110124

125+
def setup_interaction_with_underscored_header port
126+
Faraday.post "http://localhost:#{port}/interactions",
127+
interaction_with_underscored_header,
128+
mock_service_headers
129+
end
130+
111131
def invoke_expected_request port
112132
Faraday.get "http://localhost:#{port}/greeting",
113133
nil,
@@ -120,6 +140,12 @@ def invoke_another_expected_request port
120140
{'Foo' => 'Bar'}
121141
end
122142

143+
def invoke_request_with_underscored_header port
144+
Faraday.get "http://localhost:#{port}/",
145+
nil,
146+
{'access_token' => '123'}
147+
end
148+
123149
def verify port
124150
Faraday.get "http://localhost:#{port}/interactions/verification",
125151
nil,

0 commit comments

Comments
 (0)