From e55b27de0f4ec609edb76078c84f8d5f252bd4ed Mon Sep 17 00:00:00 2001 From: Tom Gardham-Pallister Date: Thu, 24 May 2018 22:56:08 +0100 Subject: [PATCH] bit of refactoring --- .../Request/Middleware/DownstreamRequest.cs | 16 +++++ src/Ocelot/Requester/HttpClientBuilder.cs | 62 ++++++++++++------- .../Requester/HttpClientHttpRequester.cs | 19 +----- 3 files changed, 56 insertions(+), 41 deletions(-) diff --git a/src/Ocelot/Request/Middleware/DownstreamRequest.cs b/src/Ocelot/Request/Middleware/DownstreamRequest.cs index 75070bfd..fc1feb8a 100644 --- a/src/Ocelot/Request/Middleware/DownstreamRequest.cs +++ b/src/Ocelot/Request/Middleware/DownstreamRequest.cs @@ -48,6 +48,22 @@ namespace Ocelot.Request.Middleware Scheme = Scheme }; + /** + * According to https://tools.ietf.org/html/rfc7231 + * GET,HEAD,DELETE,CONNECT,TRACE + * Can have body but server can reject the request. + * And MS HttpClient in Full Framework actually rejects it. + * see #366 issue + **/ +#if NET461 || NET462 || NET47 || NET471 || NET472 + if (_request.Method == HttpMethod.Get || + _request.Method == HttpMethod.Head || + _request.Method == HttpMethod.Delete || + _request.Method == HttpMethod.Trace) + { + _request.Content = null; + } +#endif _request.RequestUri = uriBuilder.Uri; return _request; } diff --git a/src/Ocelot/Requester/HttpClientBuilder.cs b/src/Ocelot/Requester/HttpClientBuilder.cs index 4b8fe530..1cada3d7 100644 --- a/src/Ocelot/Requester/HttpClientBuilder.cs +++ b/src/Ocelot/Requester/HttpClientBuilder.cs @@ -42,31 +42,12 @@ namespace Ocelot.Requester { return httpClient; } - bool useCookies = context.DownstreamReRoute.HttpHandlerOptions.UseCookieContainer; - HttpClientHandler httpclientHandler; - // Dont' create the CookieContainer if UseCookies is not set ot the HttpClient will complain - // under .Net Full Framework - if (useCookies) - { - httpclientHandler = new HttpClientHandler - { - AllowAutoRedirect = context.DownstreamReRoute.HttpHandlerOptions.AllowAutoRedirect, - UseCookies = context.DownstreamReRoute.HttpHandlerOptions.UseCookieContainer, - CookieContainer = new CookieContainer() - }; - } - else - { - httpclientHandler = new HttpClientHandler - { - AllowAutoRedirect = context.DownstreamReRoute.HttpHandlerOptions.AllowAutoRedirect, - UseCookies = context.DownstreamReRoute.HttpHandlerOptions.UseCookieContainer, - }; - } + + var handler = CreateHandler(context); if (context.DownstreamReRoute.DangerousAcceptAnyServerCertificateValidator) { - httpclientHandler.ServerCertificateCustomValidationCallback = (request, certificate, chain, errors) => true; + handler.ServerCertificateCustomValidationCallback = (request, certificate, chain, errors) => true; _logger .LogWarning($"You have ignored all SSL warnings by using DangerousAcceptAnyServerCertificateValidator for this DownstreamReRoute, UpstreamPathTemplate: {context.DownstreamReRoute.UpstreamPathTemplate}, DownstreamPathTemplate: {context.DownstreamReRoute.DownstreamPathTemplate}"); @@ -76,7 +57,7 @@ namespace Ocelot.Requester ? _defaultTimeout : TimeSpan.FromMilliseconds(context.DownstreamReRoute.QosOptions.TimeoutValue); - _httpClient = new HttpClient(CreateHttpMessageHandler(httpclientHandler, context.DownstreamReRoute)) + _httpClient = new HttpClient(CreateHttpMessageHandler(handler, context.DownstreamReRoute)) { Timeout = timeout }; @@ -86,6 +67,41 @@ namespace Ocelot.Requester return _client; } + private HttpClientHandler CreateHandler(DownstreamContext context) + { + // Dont' create the CookieContainer if UseCookies is not set or the HttpClient will complain + // under .Net Full Framework + bool useCookies = context.DownstreamReRoute.HttpHandlerOptions.UseCookieContainer; + + if (useCookies) + { + return UseCookiesHandler(context); + } + else + { + return UseNonCookiesHandler(context); + } + } + + private HttpClientHandler UseNonCookiesHandler(DownstreamContext context) + { + return new HttpClientHandler + { + AllowAutoRedirect = context.DownstreamReRoute.HttpHandlerOptions.AllowAutoRedirect, + UseCookies = context.DownstreamReRoute.HttpHandlerOptions.UseCookieContainer, + }; + } + + private HttpClientHandler UseCookiesHandler(DownstreamContext context) + { + return new HttpClientHandler + { + AllowAutoRedirect = context.DownstreamReRoute.HttpHandlerOptions.AllowAutoRedirect, + UseCookies = context.DownstreamReRoute.HttpHandlerOptions.UseCookieContainer, + CookieContainer = new CookieContainer() + }; + } + public void Save() { _cacheHandlers.Set(_cacheKey, _client, TimeSpan.FromHours(24)); diff --git a/src/Ocelot/Requester/HttpClientHttpRequester.cs b/src/Ocelot/Requester/HttpClientHttpRequester.cs index 9fe5e74f..c7914c94 100644 --- a/src/Ocelot/Requester/HttpClientHttpRequester.cs +++ b/src/Ocelot/Requester/HttpClientHttpRequester.cs @@ -32,24 +32,7 @@ namespace Ocelot.Requester try { - var message = context.DownstreamRequest.ToHttpRequestMessage(); - /** - * According to https://tools.ietf.org/html/rfc7231 - * GET,HEAD,DELETE,CONNECT,TRACE - * Can have body but server can reject the request. - * And MS HttpClient in Full Framework actually rejects it. - * see #366 issue - **/ - - if (message.Method == HttpMethod.Get || - message.Method == HttpMethod.Head || - message.Method == HttpMethod.Delete || - message.Method == HttpMethod.Trace) - { - message.Content = null; - } - _logger.LogDebug(string.Format("Sending {0}", message)); - var response = await httpClient.SendAsync(message); + var response = await httpClient.SendAsync(context.DownstreamRequest.ToHttpRequestMessage()); return new OkResponse(response); } catch (TimeoutRejectedException exception)