From bebcb3fe258110e130d76c010a21b954430e84b9 Mon Sep 17 00:00:00 2001 From: Stephen Toub Date: Thu, 1 Feb 2018 20:15:16 -0500 Subject: [PATCH] Move ManagedHandler version/chunking validation earlier (dotnet/corefx#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. Commit migrated from https://github.com/dotnet/corefx/commit/bb738a07720a8c0888a088f2adb737d2cbe09ca2 --- .../src/System/Net/Http/Managed/HttpConnection.cs | 34 +++------------------- .../src/System/Net/Http/Managed/ManagedHandler.cs | 22 ++++++++++++++ 2 files changed, 26 insertions(+), 30 deletions(-) diff --git a/src/libraries/System.Net.Http/src/System/Net/Http/Managed/HttpConnection.cs b/src/libraries/System.Net.Http/src/System/Net/Http/Managed/HttpConnection.cs index cabd35f..3622876 100644 --- a/src/libraries/System.Net.Http/src/System/Net/Http/Managed/HttpConnection.cs +++ b/src/libraries/System.Net.Http/src/System/Net/Http/Managed/HttpConnection.cs @@ -206,38 +206,10 @@ namespace System.Net.Http Debug.Assert(!_canRetry); _canRetry = true; + // Send the request. + if (NetEventSource.IsEnabled) Trace($"Sending request: {request}"); try { - // Our max supported version is 1.1, so if Version > 1.1, degrade to 1.1. - Debug.Assert(request.Version.Major >= 0 && request.Version.Minor >= 0); // guaranteed by Version class - bool isHttp10 = false; - if (request.Version.Major == 0) - { - throw new NotSupportedException(SR.net_http_unsupported_version); - } - else if (request.Version.Major == 1 && request.Version.Minor == 0) - { - isHttp10 = true; - } - - // Send the request. - if (NetEventSource.IsEnabled) Trace($"Sending request: {request}"); - - // Add headers to define content transfer, if not present - if (request.Content != null && - (!request.HasHeaders || request.Headers.TransferEncodingChunked != true) && - request.Content.Headers.ContentLength == null) - { - // We have content, but neither Transfer-Encoding or Content-Length is set. - request.Headers.TransferEncodingChunked = true; - } - - if (isHttp10 && request.HasHeaders && request.Headers.TransferEncodingChunked == true) - { - // HTTP 1.0 does not support chunking - throw new NotSupportedException(SR.net_http_unsupported_chunking); - } - // Write request line await WriteStringAsync(request.Method.Method, cancellationToken).ConfigureAwait(false); await WriteByteAsync((byte)' ', cancellationToken).ConfigureAwait(false); @@ -253,6 +225,8 @@ namespace System.Net.Http await WriteStringAsync(request.RequestUri.PathAndQuery, cancellationToken).ConfigureAwait(false); // fall-back to 1.1 for all versions other than 1.0 + Debug.Assert(request.Version.Major >= 0 && request.Version.Minor >= 0); // guaranteed by Version class + bool isHttp10 = request.Version.Minor == 0 && request.Version.Major == 1; await WriteBytesAsync(isHttp10 ? s_spaceHttp10NewlineAsciiBytes : s_spaceHttp11NewlineAsciiBytes, cancellationToken).ConfigureAwait(false); diff --git a/src/libraries/System.Net.Http/src/System/Net/Http/Managed/ManagedHandler.cs b/src/libraries/System.Net.Http/src/System/Net/Http/Managed/ManagedHandler.cs index 328f616..e261a20 100644 --- a/src/libraries/System.Net.Http/src/System/Net/Http/Managed/ManagedHandler.cs +++ b/src/libraries/System.Net.Http/src/System/Net/Http/Managed/ManagedHandler.cs @@ -294,6 +294,28 @@ namespace System.Net.Http { CheckDisposed(); HttpMessageHandler handler = _handler ?? SetupHandlerChain(); + + if (request.Version.Major == 0) + { + return Task.FromException(new NotSupportedException(SR.net_http_unsupported_version)); + } + + // Add headers to define content transfer, if not present + if (request.Content != null && + (!request.HasHeaders || request.Headers.TransferEncodingChunked != true) && + request.Content.Headers.ContentLength == null) + { + // We have content, but neither Transfer-Encoding or Content-Length is set. + request.Headers.TransferEncodingChunked = true; + } + + if (request.Version.Minor == 0 && request.Version.Major == 1 && + request.HasHeaders && request.Headers.TransferEncodingChunked == true) + { + // HTTP 1.0 does not support chunking + return Task.FromException(new NotSupportedException(SR.net_http_unsupported_chunking)); + } + return handler.SendAsync(request, cancellationToken); } } -- 2.7.4