Skip to content
This repository was archived by the owner on Jan 23, 2023. It is now read-only.

Commit bb738a0

Browse files
authored
Move ManagedHandler version/chunking validation earlier (#26766)
Move it to ManagedHandler.SendAsync rather than HttpConnection.SendAsync so that it happens before we even try to get a connection. A minor benefit of the change as well is that isHttp10 is no longer lifted to the state machine.
1 parent 2b4664a commit bb738a0

File tree

2 files changed

+26
-30
lines changed

2 files changed

+26
-30
lines changed

src/System.Net.Http/src/System/Net/Http/Managed/HttpConnection.cs

Lines changed: 4 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -206,38 +206,10 @@ public async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, Can
206206
Debug.Assert(!_canRetry);
207207
_canRetry = true;
208208

209+
// Send the request.
210+
if (NetEventSource.IsEnabled) Trace($"Sending request: {request}");
209211
try
210212
{
211-
// Our max supported version is 1.1, so if Version > 1.1, degrade to 1.1.
212-
Debug.Assert(request.Version.Major >= 0 && request.Version.Minor >= 0); // guaranteed by Version class
213-
bool isHttp10 = false;
214-
if (request.Version.Major == 0)
215-
{
216-
throw new NotSupportedException(SR.net_http_unsupported_version);
217-
}
218-
else if (request.Version.Major == 1 && request.Version.Minor == 0)
219-
{
220-
isHttp10 = true;
221-
}
222-
223-
// Send the request.
224-
if (NetEventSource.IsEnabled) Trace($"Sending request: {request}");
225-
226-
// Add headers to define content transfer, if not present
227-
if (request.Content != null &&
228-
(!request.HasHeaders || request.Headers.TransferEncodingChunked != true) &&
229-
request.Content.Headers.ContentLength == null)
230-
{
231-
// We have content, but neither Transfer-Encoding or Content-Length is set.
232-
request.Headers.TransferEncodingChunked = true;
233-
}
234-
235-
if (isHttp10 && request.HasHeaders && request.Headers.TransferEncodingChunked == true)
236-
{
237-
// HTTP 1.0 does not support chunking
238-
throw new NotSupportedException(SR.net_http_unsupported_chunking);
239-
}
240-
241213
// Write request line
242214
await WriteStringAsync(request.Method.Method, cancellationToken).ConfigureAwait(false);
243215
await WriteByteAsync((byte)' ', cancellationToken).ConfigureAwait(false);
@@ -253,6 +225,8 @@ public async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, Can
253225
await WriteStringAsync(request.RequestUri.PathAndQuery, cancellationToken).ConfigureAwait(false);
254226

255227
// fall-back to 1.1 for all versions other than 1.0
228+
Debug.Assert(request.Version.Major >= 0 && request.Version.Minor >= 0); // guaranteed by Version class
229+
bool isHttp10 = request.Version.Minor == 0 && request.Version.Major == 1;
256230
await WriteBytesAsync(isHttp10 ? s_spaceHttp10NewlineAsciiBytes : s_spaceHttp11NewlineAsciiBytes,
257231
cancellationToken).ConfigureAwait(false);
258232

src/System.Net.Http/src/System/Net/Http/Managed/ManagedHandler.cs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -294,6 +294,28 @@ protected internal override Task<HttpResponseMessage> SendAsync(
294294
{
295295
CheckDisposed();
296296
HttpMessageHandler handler = _handler ?? SetupHandlerChain();
297+
298+
if (request.Version.Major == 0)
299+
{
300+
return Task.FromException<HttpResponseMessage>(new NotSupportedException(SR.net_http_unsupported_version));
301+
}
302+
303+
// Add headers to define content transfer, if not present
304+
if (request.Content != null &&
305+
(!request.HasHeaders || request.Headers.TransferEncodingChunked != true) &&
306+
request.Content.Headers.ContentLength == null)
307+
{
308+
// We have content, but neither Transfer-Encoding or Content-Length is set.
309+
request.Headers.TransferEncodingChunked = true;
310+
}
311+
312+
if (request.Version.Minor == 0 && request.Version.Major == 1 &&
313+
request.HasHeaders && request.Headers.TransferEncodingChunked == true)
314+
{
315+
// HTTP 1.0 does not support chunking
316+
return Task.FromException<HttpResponseMessage>(new NotSupportedException(SR.net_http_unsupported_chunking));
317+
}
318+
297319
return handler.SendAsync(request, cancellationToken);
298320
}
299321
}

0 commit comments

Comments
 (0)