Skip to content

Commit 6ba8e66

Browse files
committed
Stripping any Content- headers when mapping to a HttpRequestMessage
1 parent c11f618 commit 6ba8e66

File tree

2 files changed

+67
-103
lines changed

2 files changed

+67
-103
lines changed

PactNet.Tests/Mocks/MockHttpService/Mappers/HttpRequestMessageMapperTests.cs

+65-98
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,17 @@ namespace PactNet.Tests.Mocks.MockHttpService.Mappers
1212
{
1313
public class HttpRequestMessageMapperTests
1414
{
15+
IHttpMethodMapper _mockHttpMethodMapper;
16+
IHttpContentMapper _mockHttpContentMapper;
17+
IHttpBodyContentMapper _mockHttpBodyContentMapper;
18+
1519
public IHttpRequestMessageMapper GetSubject()
1620
{
17-
return new HttpRequestMessageMapper();
21+
_mockHttpMethodMapper = Substitute.For<IHttpMethodMapper>();
22+
_mockHttpContentMapper = Substitute.For<IHttpContentMapper>();
23+
_mockHttpBodyContentMapper = Substitute.For<IHttpBodyContentMapper>();
24+
25+
return new HttpRequestMessageMapper(_mockHttpMethodMapper, _mockHttpContentMapper, _mockHttpBodyContentMapper);
1826
}
1927

2028
[Fact]
@@ -36,20 +44,13 @@ public void Convert_WithRequest_CallsHttpMethodMapper()
3644
Path = "/events"
3745
};
3846

39-
var mockHttpMethodMapper = Substitute.For<IHttpMethodMapper>();
40-
var mockHttpContentMapper = Substitute.For<IHttpContentMapper>();
41-
var mockHttpBodyContentMapper = Substitute.For<IHttpBodyContentMapper>();
42-
43-
mockHttpMethodMapper.Convert(HttpVerb.Post).Returns(HttpMethod.Post);
47+
var mapper = GetSubject();
4448

45-
IHttpRequestMessageMapper mapper = new HttpRequestMessageMapper(
46-
mockHttpMethodMapper,
47-
mockHttpContentMapper,
48-
mockHttpBodyContentMapper);
49+
_mockHttpMethodMapper.Convert(HttpVerb.Post).Returns(HttpMethod.Post);
4950

5051
mapper.Convert(request);
5152

52-
mockHttpMethodMapper.Received(1).Convert(request.Method);
53+
_mockHttpMethodMapper.Received(1).Convert(request.Method);
5354
}
5455

5556
[Fact]
@@ -65,17 +66,10 @@ public void Convert_WithHeader_HeaderIsAddedToHttpRequestMessage()
6566
}
6667
};
6768

68-
var mockHttpMethodMapper = Substitute.For<IHttpMethodMapper>();
69-
var mockHttpContentMapper = Substitute.For<IHttpContentMapper>();
70-
var mockHttpBodyContentMapper = Substitute.For<IHttpBodyContentMapper>();
71-
72-
mockHttpMethodMapper.Convert(HttpVerb.Post).Returns(HttpMethod.Post);
73-
mockHttpBodyContentMapper.Convert(Arg.Any<object>(), request.Headers).Returns(new HttpBodyContent(String.Empty, null, null));
69+
var mapper = GetSubject();
7470

75-
IHttpRequestMessageMapper mapper = new HttpRequestMessageMapper(
76-
mockHttpMethodMapper,
77-
mockHttpContentMapper,
78-
mockHttpBodyContentMapper);
71+
_mockHttpMethodMapper.Convert(HttpVerb.Post).Returns(HttpMethod.Post);
72+
_mockHttpBodyContentMapper.Convert(Arg.Any<object>(), request.Headers).Returns(new HttpBodyContent(String.Empty, null, null));
7973

8074
var result = mapper.Convert(request);
8175

@@ -99,22 +93,15 @@ public void Convert_WithPlainContentTypeHeader_HeaderIsNotAddedToHttpRequestMess
9993
};
10094
var httpBodyContent = new HttpBodyContent(String.Empty, contentTypeString, null);
10195

102-
var mockHttpMethodMapper = Substitute.For<IHttpMethodMapper>();
103-
var mockHttpContentMapper = Substitute.For<IHttpContentMapper>();
104-
var mockHttpBodyContentMapper = Substitute.For<IHttpBodyContentMapper>();
105-
106-
mockHttpMethodMapper.Convert(HttpVerb.Post).Returns(HttpMethod.Post);
107-
mockHttpBodyContentMapper.Convert(Arg.Any<object>(), request.Headers).Returns(httpBodyContent);
96+
var mapper = GetSubject();
10897

109-
IHttpRequestMessageMapper mapper = new HttpRequestMessageMapper(
110-
mockHttpMethodMapper,
111-
mockHttpContentMapper,
112-
mockHttpBodyContentMapper);
98+
_mockHttpMethodMapper.Convert(HttpVerb.Post).Returns(HttpMethod.Post);
99+
_mockHttpBodyContentMapper.Convert(Arg.Any<object>(), request.Headers).Returns(httpBodyContent);
113100

114101
var result = mapper.Convert(request);
115102

116103
Assert.Empty(result.Headers);
117-
mockHttpContentMapper.Received(1).Convert(httpBodyContent);
104+
_mockHttpContentMapper.Received(1).Convert(httpBodyContent);
118105
}
119106

120107
[Fact]
@@ -133,22 +120,15 @@ public void Convert_WithPlainContentTypeHeaderLowercased_HeaderIsNotAddedToHttpR
133120
};
134121
var httpBodyContent = new HttpBodyContent(String.Empty, contentTypeString, null);
135122

136-
var mockHttpMethodMapper = Substitute.For<IHttpMethodMapper>();
137-
var mockHttpContentMapper = Substitute.For<IHttpContentMapper>();
138-
var mockHttpBodyContentMapper = Substitute.For<IHttpBodyContentMapper>();
139-
140-
mockHttpMethodMapper.Convert(HttpVerb.Post).Returns(HttpMethod.Post);
141-
mockHttpBodyContentMapper.Convert(Arg.Any<object>(), request.Headers).Returns(httpBodyContent);
123+
var mapper = GetSubject();
142124

143-
IHttpRequestMessageMapper mapper = new HttpRequestMessageMapper(
144-
mockHttpMethodMapper,
145-
mockHttpContentMapper,
146-
mockHttpBodyContentMapper);
125+
_mockHttpMethodMapper.Convert(HttpVerb.Post).Returns(HttpMethod.Post);
126+
_mockHttpBodyContentMapper.Convert(Arg.Any<object>(), request.Headers).Returns(httpBodyContent);
147127

148128
var result = mapper.Convert(request);
149129

150130
Assert.Empty(result.Headers);
151-
mockHttpContentMapper.Received(1).Convert(httpBodyContent);
131+
_mockHttpContentMapper.Received(1).Convert(httpBodyContent);
152132
}
153133

154134
[Fact]
@@ -169,23 +149,16 @@ public void Convert_WithPlainContentTypeAndUtf8CharsetHeader_HeaderIsNotAddedToH
169149
};
170150
var httpBodyContent = new HttpBodyContent(String.Empty, contentTypeString, encoding);
171151

172-
var mockHttpMethodMapper = Substitute.For<IHttpMethodMapper>();
173-
var mockHttpContentMapper = Substitute.For<IHttpContentMapper>();
174-
var mockHttpBodyContentMapper = Substitute.For<IHttpBodyContentMapper>();
175-
176-
mockHttpMethodMapper.Convert(HttpVerb.Post).Returns(HttpMethod.Post);
177-
mockHttpBodyContentMapper.Convert(Arg.Any<object>(), request.Headers).Returns(httpBodyContent);
152+
var mapper = GetSubject();
178153

179-
IHttpRequestMessageMapper mapper = new HttpRequestMessageMapper(
180-
mockHttpMethodMapper,
181-
mockHttpContentMapper,
182-
mockHttpBodyContentMapper);
154+
_mockHttpMethodMapper.Convert(HttpVerb.Post).Returns(HttpMethod.Post);
155+
_mockHttpBodyContentMapper.Convert(Arg.Any<object>(), request.Headers).Returns(httpBodyContent);
183156

184157
var result = mapper.Convert(request);
185158

186159
Assert.Empty(result.Headers);
187-
mockHttpBodyContentMapper.Received(1).Convert(request.Body, request.Headers);
188-
mockHttpContentMapper.Received(1).Convert(httpBodyContent);
160+
_mockHttpBodyContentMapper.Received(1).Convert(request.Body, request.Headers);
161+
_mockHttpContentMapper.Received(1).Convert(httpBodyContent);
189162
}
190163

191164
[Fact]
@@ -206,23 +179,16 @@ public void Convert_WithJsonContentTypeAndUnicodeCharsetHeader_HeaderIsNotAddedT
206179
};
207180
var httpBodyContent = new HttpBodyContent(String.Empty, contentTypeString, encoding);
208181

209-
var mockHttpMethodMapper = Substitute.For<IHttpMethodMapper>();
210-
var mockHttpContentMapper = Substitute.For<IHttpContentMapper>();
211-
var mockHttpBodyContentMapper = Substitute.For<IHttpBodyContentMapper>();
212-
213-
mockHttpMethodMapper.Convert(HttpVerb.Post).Returns(HttpMethod.Post);
214-
mockHttpBodyContentMapper.Convert(Arg.Any<object>(), request.Headers).Returns(httpBodyContent);
182+
var mapper = GetSubject();
215183

216-
IHttpRequestMessageMapper mapper = new HttpRequestMessageMapper(
217-
mockHttpMethodMapper,
218-
mockHttpContentMapper,
219-
mockHttpBodyContentMapper);
184+
_mockHttpMethodMapper.Convert(HttpVerb.Post).Returns(HttpMethod.Post);
185+
_mockHttpBodyContentMapper.Convert(Arg.Any<object>(), request.Headers).Returns(httpBodyContent);
220186

221187
var result = mapper.Convert(request);
222188

223189
Assert.Empty(result.Headers);
224-
mockHttpBodyContentMapper.Received(1).Convert(request.Body, request.Headers);
225-
mockHttpContentMapper.Received(1).Convert(httpBodyContent);
190+
_mockHttpBodyContentMapper.Received(1).Convert(request.Body, request.Headers);
191+
_mockHttpContentMapper.Received(1).Convert(httpBodyContent);
226192
}
227193

228194
[Fact]
@@ -242,24 +208,39 @@ public void Convert_WithContentTypeAndCustomHeader_OnlyCustomHeadersIsAddedToHtt
242208
};
243209
var httpBodyContent = new HttpBodyContent(String.Empty, contentTypeString, null);
244210

245-
var mockHttpMethodMapper = Substitute.For<IHttpMethodMapper>();
246-
var mockHttpContentMapper = Substitute.For<IHttpContentMapper>();
247-
var mockHttpBodyContentMapper = Substitute.For<IHttpBodyContentMapper>();
248-
249-
mockHttpMethodMapper.Convert(HttpVerb.Post).Returns(HttpMethod.Post);
250-
mockHttpBodyContentMapper.Convert(Arg.Any<object>(), request.Headers).Returns(httpBodyContent);
211+
var mapper = GetSubject();
251212

252-
IHttpRequestMessageMapper mapper = new HttpRequestMessageMapper(
253-
mockHttpMethodMapper,
254-
mockHttpContentMapper,
255-
mockHttpBodyContentMapper);
213+
_mockHttpMethodMapper.Convert(HttpVerb.Post).Returns(HttpMethod.Post);
214+
_mockHttpBodyContentMapper.Convert(Arg.Any<object>(), request.Headers).Returns(httpBodyContent);
256215

257216
var result = mapper.Convert(request);
258217

259218
Assert.Equal(request.Headers.Last().Key, result.Headers.First().Key);
260219
Assert.Equal(request.Headers.Last().Value, result.Headers.First().Value.First());
261220
}
262221

222+
[Fact]
223+
public void Convert_WithContentLengthHeader_ContentLengthHeaderIsNotAdded()
224+
{
225+
var request = new ProviderServiceRequest
226+
{
227+
Method = HttpVerb.Post,
228+
Path = "/events",
229+
Headers = new Dictionary<string, string>
230+
{
231+
{ "Content-Length", "100" }
232+
}
233+
};
234+
235+
var mapper = GetSubject();
236+
237+
_mockHttpMethodMapper.Convert(HttpVerb.Post).Returns(HttpMethod.Post);
238+
239+
var result = mapper.Convert(request);
240+
241+
Assert.Equal(0, result.Headers.Count());
242+
}
243+
263244
[Fact]
264245
public void Convert_WithBody_HttpContentMapperIsCalled()
265246
{
@@ -273,20 +254,13 @@ public void Convert_WithBody_HttpContentMapperIsCalled()
273254
}
274255
};
275256

276-
var mockHttpMethodMapper = Substitute.For<IHttpMethodMapper>();
277-
var mockHttpContentMapper = Substitute.For<IHttpContentMapper>();
278-
var mockHttpBodyContentMapper = Substitute.For<IHttpBodyContentMapper>();
279-
280-
mockHttpMethodMapper.Convert(HttpVerb.Get).Returns(HttpMethod.Get);
257+
var mapper = GetSubject();
281258

282-
IHttpRequestMessageMapper mapper = new HttpRequestMessageMapper(
283-
mockHttpMethodMapper,
284-
mockHttpContentMapper,
285-
mockHttpBodyContentMapper);
259+
_mockHttpMethodMapper.Convert(HttpVerb.Get).Returns(HttpMethod.Get);
286260

287261
mapper.Convert(request);
288262

289-
mockHttpBodyContentMapper.Received(1).Convert(request.Body, request.Headers);
263+
_mockHttpBodyContentMapper.Received(1).Convert(request.Body, request.Headers);
290264
}
291265

292266
[Fact]
@@ -315,18 +289,11 @@ public void Convert_WithTheWorks_CorrectlyMappedHttpRequestMessageIsReturned()
315289
};
316290
var httpBodyContent = new HttpBodyContent(bodyJson, contentTypeString, encoding);
317291

318-
var mockHttpMethodMapper = Substitute.For<IHttpMethodMapper>();
319-
var mockHttpContentMapper = Substitute.For<IHttpContentMapper>();
320-
var mockHttpBodyContentMapper = Substitute.For<IHttpBodyContentMapper>();
321-
322-
mockHttpMethodMapper.Convert(HttpVerb.Get).Returns(HttpMethod.Get);
323-
mockHttpContentMapper.Convert(httpBodyContent).Returns(new StringContent(bodyJson, encoding, contentTypeString));
324-
mockHttpBodyContentMapper.Convert(Arg.Any<object>(), request.Headers).Returns(httpBodyContent);
292+
var mapper = GetSubject();
325293

326-
IHttpRequestMessageMapper mapper = new HttpRequestMessageMapper(
327-
mockHttpMethodMapper,
328-
mockHttpContentMapper,
329-
mockHttpBodyContentMapper);
294+
_mockHttpMethodMapper.Convert(HttpVerb.Get).Returns(HttpMethod.Get);
295+
_mockHttpContentMapper.Convert(httpBodyContent).Returns(new StringContent(bodyJson, encoding, contentTypeString));
296+
_mockHttpBodyContentMapper.Convert(Arg.Any<object>(), request.Headers).Returns(httpBodyContent);
330297

331298
var result = mapper.Convert(request);
332299
var requestContent = result.Content.ReadAsStringAsync().Result;

PactNet/Mocks/MockHttpService/Mappers/HttpRequestMessageMapper.cs

+2-5
Original file line numberDiff line numberDiff line change
@@ -44,11 +44,8 @@ public HttpRequestMessage Convert(ProviderServiceRequest from)
4444
{
4545
foreach (var requestHeader in from.Headers)
4646
{
47-
//TODO: Check if there are any other headers which need special treatment
48-
//Handle the content-type header as little differently, as they need to be attached to the content when using a HttpRequestMessage
49-
//Strip the Content-Length header as is automatically attached to the request
50-
if (requestHeader.Key.Equals("Content-Type", StringComparison.InvariantCultureIgnoreCase) ||
51-
requestHeader.Key.Equals("Content-Length", StringComparison.InvariantCultureIgnoreCase))
47+
//Strip any Content- headers as they need to be attached to Request content when using a HttpRequestMessage
48+
if (requestHeader.Key.IndexOf("Content-", StringComparison.InvariantCultureIgnoreCase) == 0)
5249
{
5350
continue;
5451
}

0 commit comments

Comments
 (0)