From 34598f4edf71979990330a8c9e2f7be6707a6d3c Mon Sep 17 00:00:00 2001 From: Tsirkin Evgeny Date: Fri, 25 May 2018 00:39:27 +0300 Subject: [PATCH] made http client work under full .net 46 (#367) * made http client work under full .net 46 * Changed the way the requests without body are checked & comments * fixed a type --- src/Ocelot/Requester/HttpClientBuilder.cs | 28 ++++++++++++++----- .../Requester/HttpClientHttpRequester.cs | 19 ++++++++++++- 2 files changed, 39 insertions(+), 8 deletions(-) diff --git a/src/Ocelot/Requester/HttpClientBuilder.cs b/src/Ocelot/Requester/HttpClientBuilder.cs index cb1fd6db..4b8fe530 100644 --- a/src/Ocelot/Requester/HttpClientBuilder.cs +++ b/src/Ocelot/Requester/HttpClientBuilder.cs @@ -42,15 +42,29 @@ namespace Ocelot.Requester { return httpClient; } - - var httpclientHandler = new HttpClientHandler + 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) { - AllowAutoRedirect = context.DownstreamReRoute.HttpHandlerOptions.AllowAutoRedirect, - UseCookies = context.DownstreamReRoute.HttpHandlerOptions.UseCookieContainer, - CookieContainer = new CookieContainer() - }; + 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, + }; + } - if(context.DownstreamReRoute.DangerousAcceptAnyServerCertificateValidator) + if (context.DownstreamReRoute.DangerousAcceptAnyServerCertificateValidator) { httpclientHandler.ServerCertificateCustomValidationCallback = (request, certificate, chain, errors) => true; diff --git a/src/Ocelot/Requester/HttpClientHttpRequester.cs b/src/Ocelot/Requester/HttpClientHttpRequester.cs index c7914c94..9fe5e74f 100644 --- a/src/Ocelot/Requester/HttpClientHttpRequester.cs +++ b/src/Ocelot/Requester/HttpClientHttpRequester.cs @@ -32,7 +32,24 @@ namespace Ocelot.Requester try { - var response = await httpClient.SendAsync(context.DownstreamRequest.ToHttpRequestMessage()); + 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); return new OkResponse(response); } catch (TimeoutRejectedException exception)