Skip to content
This repository was archived by the owner on Dec 18, 2018. It is now read-only.

Commit a899549

Browse files
author
Cesar Blum Silveira
committed
PR feedback.
1 parent 9f82daa commit a899549

File tree

5 files changed

+45
-9
lines changed

5 files changed

+45
-9
lines changed

src/Microsoft.AspNetCore.Server.Kestrel/BadHttpRequestException.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,10 @@ internal static BadHttpRequestException GetException(RequestRejectionReason reas
103103
ex = new BadHttpRequestException($"Final transfer coding is not \"chunked\": \"{value}\"", 400);
104104
break;
105105
case RequestRejectionReason.LengthRequired:
106-
ex = new BadHttpRequestException($"{value} request contains no length indication (no Content-Length or Transfer-Encoding header)", 411);
106+
ex = new BadHttpRequestException($"{value} request contains no Content-Length or Transfer-Encoding header", 411);
107+
break;
108+
case RequestRejectionReason.LengthRequiredHttp10:
109+
ex = new BadHttpRequestException($"{value} request contains no Content-Length header", 400);
107110
break;
108111
default:
109112
ex = new BadHttpRequestException("Bad request.", 400);

src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/MessageBody.cs

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -270,22 +270,23 @@ public static MessageBody For(
270270
var unparsedContentLength = headers.HeaderContentLength;
271271
if (unparsedContentLength.Count > 0)
272272
{
273-
long contentLength;
274-
if (!long.TryParse(unparsedContentLength.ToString(), out contentLength) || contentLength < 0)
273+
try
275274
{
276-
context.RejectRequest(RequestRejectionReason.InvalidContentLength, unparsedContentLength);
275+
var contentLength = FrameHeaders.ParseContentLength(unparsedContentLength);
276+
return new ForContentLength(keepAlive, contentLength, context);
277277
}
278-
else
278+
catch (InvalidOperationException)
279279
{
280-
return new ForContentLength(keepAlive, contentLength, context);
280+
context.RejectRequest(RequestRejectionReason.InvalidContentLength, unparsedContentLength);
281281
}
282282
}
283283

284284
// If we got here, request contains no Content-Length or Transfer-Encoding header.
285285
// Reject with 411 Length Required.
286286
if (HttpMethods.IsPost(context.Method) || HttpMethods.IsPut(context.Method))
287287
{
288-
context.RejectRequest(RequestRejectionReason.LengthRequired, context.Method);
288+
var requestRejectionReason = httpVersion == HttpVersion.Http11 ? RequestRejectionReason.LengthRequired : RequestRejectionReason.LengthRequiredHttp10;
289+
context.RejectRequest(requestRejectionReason, context.Method);
289290
}
290291

291292
return new ForContentLength(keepAlive, 0, context);

src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/RequestRejectionReason.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ public enum RequestRejectionReason
2828
TooManyHeaders,
2929
RequestTimeout,
3030
FinalTransferCodingNotChunked,
31-
LengthRequired
31+
LengthRequired,
32+
LengthRequiredHttp10,
3233
}
3334
}

test/Microsoft.AspNetCore.Server.KestrelTests/BadHttpRequestTests.cs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,21 @@ public async Task BadRequestIfMethodRequiresLengthButNoContentLengthOrTransferEn
189189
}
190190
}
191191

192+
[Theory]
193+
[InlineData("POST")]
194+
[InlineData("PUT")]
195+
public async Task BadRequestIfMethodRequiresLengthButNoContentLengthInHttp10Request(string method)
196+
{
197+
using (var server = new TestServer(context => { return Task.FromResult(0); }))
198+
{
199+
using (var connection = server.CreateConnection())
200+
{
201+
await connection.SendEnd($"{method} / HTTP/1.0\r\n\r\n");
202+
await ReceiveBadRequestResponse(connection, "400 Bad Request", server.Context.DateHeaderValue);
203+
}
204+
}
205+
}
206+
192207
private async Task ReceiveBadRequestResponse(TestConnection connection, string expectedResponseStatusCode, string expectedDateHeaderValue)
193208
{
194209
await connection.ReceiveForcedEnd(

test/Microsoft.AspNetCore.Server.KestrelTests/MessageBodyTests.cs

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,23 @@ public void ForThrowsWhenMethodRequiresLengthButNoContentLengthOrTransferEncodin
215215
MessageBody.For(HttpVersion.Http11, new FrameRequestHeaders(), input.FrameContext));
216216

217217
Assert.Equal(411, ex.StatusCode);
218-
Assert.Equal($"{method} request contains no length indication (no Content-Length or Transfer-Encoding header)", ex.Message);
218+
Assert.Equal($"{method} request contains no Content-Length or Transfer-Encoding header", ex.Message);
219+
}
220+
}
221+
222+
[Theory]
223+
[InlineData("POST")]
224+
[InlineData("PUT")]
225+
public void ForThrowsWhenMethodRequiresLengthButNoContentLengthSetHttp10(string method)
226+
{
227+
using (var input = new TestInput())
228+
{
229+
input.FrameContext.Method = method;
230+
var ex = Assert.Throws<BadHttpRequestException>(() =>
231+
MessageBody.For(HttpVersion.Http10, new FrameRequestHeaders(), input.FrameContext));
232+
233+
Assert.Equal(400, ex.StatusCode);
234+
Assert.Equal($"{method} request contains no Content-Length header", ex.Message);
219235
}
220236
}
221237

0 commit comments

Comments
 (0)