Skip to content

Commit

Permalink
Add possibility to set Connection to Close ( request.Headers.Connecti…
Browse files Browse the repository at this point in the history
…onClose = ConnectionClose ) in order to prevent persistent connections.
  • Loading branch information
Bjarte K. Helland committed Feb 22, 2021
1 parent 3ef6abd commit d562ced
Show file tree
Hide file tree
Showing 10 changed files with 58 additions and 7 deletions.
10 changes: 9 additions & 1 deletion src/Ocelot/Configuration/Builder/DownstreamReRouteBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ public class DownstreamRouteBuilder
private SecurityOptions _securityOptions;
private string _downstreamHttpMethod;
private Version _downstreamHttpVersion;
private bool _connectionClose;

public DownstreamRouteBuilder()
{
Expand Down Expand Up @@ -263,6 +264,12 @@ public DownstreamRouteBuilder WithDownstreamHttpVersion(Version downstreamHttpVe
return this;
}

public DownstreamRouteBuilder WithConnectionClose(bool connectionClose)
{
_connectionClose = connectionClose;
return this;
}

public DownstreamRoute Build()
{
return new DownstreamRoute(
Expand Down Expand Up @@ -299,7 +306,8 @@ public DownstreamRoute Build()
_dangerousAcceptAnyServerCertificateValidator,
_securityOptions,
_downstreamHttpMethod,
_downstreamHttpVersion);
_downstreamHttpVersion,
_connectionClose);
}
}
}
14 changes: 14 additions & 0 deletions src/Ocelot/Configuration/Creator/ConnectionCloseCreator.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
using Ocelot.Configuration.File;

namespace Ocelot.Configuration.Creator
{
public class ConnectionCloseCreator : IConnectionCloseCreator
{
public bool Create(bool fileRouteConnectionClose, FileGlobalConfiguration globalConfiguration)
{
var globalConnectionClose = globalConfiguration.ConnectionClose;

return fileRouteConnectionClose || globalConnectionClose;
}
}
}
9 changes: 9 additions & 0 deletions src/Ocelot/Configuration/Creator/IConnectionCloseCreator.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
using Ocelot.Configuration.File;

namespace Ocelot.Configuration.Creator
{
public interface IConnectionCloseCreator
{
bool Create(bool fileRouteConnectionClose, FileGlobalConfiguration globalConfiguration);
}
}
8 changes: 7 additions & 1 deletion src/Ocelot/Configuration/Creator/RoutesCreator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ public class RoutesCreator : IRoutesCreator
private readonly IRouteKeyCreator _routeKeyCreator;
private readonly ISecurityOptionsCreator _securityOptionsCreator;
private readonly IVersionCreator _versionCreator;
private readonly IConnectionCloseCreator _connectionCloseCreator;

public RoutesCreator(
IClaimsToThingCreator claimsToThingCreator,
Expand All @@ -39,7 +40,8 @@ public class RoutesCreator : IRoutesCreator
ILoadBalancerOptionsCreator loadBalancerOptionsCreator,
IRouteKeyCreator routeKeyCreator,
ISecurityOptionsCreator securityOptionsCreator,
IVersionCreator versionCreator
IVersionCreator versionCreator,
IConnectionCloseCreator connectionCloseCreator
)
{
_routeKeyCreator = routeKeyCreator;
Expand All @@ -58,6 +60,7 @@ IVersionCreator versionCreator
_loadBalancerOptionsCreator = loadBalancerOptionsCreator;
_securityOptionsCreator = securityOptionsCreator;
_versionCreator = versionCreator;
_connectionCloseCreator = connectionCloseCreator;
}

public List<Route> Create(FileConfiguration fileConfiguration)
Expand Down Expand Up @@ -109,6 +112,8 @@ private DownstreamRoute SetUpDownstreamRoute(FileRoute fileRoute, FileGlobalConf

var downstreamHttpVersion = _versionCreator.Create(fileRoute.DownstreamHttpVersion);

var connectionClose = _connectionCloseCreator.Create(fileRoute.ConnectionClose, globalConfiguration);

var route = new DownstreamRouteBuilder()
.WithKey(fileRoute.Key)
.WithDownstreamPathTemplate(fileRoute.DownstreamPathTemplate)
Expand Down Expand Up @@ -145,6 +150,7 @@ private DownstreamRoute SetUpDownstreamRoute(FileRoute fileRoute, FileGlobalConf
.WithSecurityOptions(securityOptions)
.WithDownstreamHttpVersion(downstreamHttpVersion)
.WithDownStreamHttpMethod(fileRoute.DownstreamHttpMethod)
.WithConnectionClose(connectionClose)
.Build();

return route;
Expand Down
7 changes: 5 additions & 2 deletions src/Ocelot/Configuration/DownstreamRoute.cs
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,8 @@ public class DownstreamRoute
bool dangerousAcceptAnyServerCertificateValidator,
SecurityOptions securityOptions,
string downstreamHttpMethod,
Version downstreamHttpVersion)
Version downstreamHttpVersion,
bool connectionClose)
{
DangerousAcceptAnyServerCertificateValidator = dangerousAcceptAnyServerCertificateValidator;
AddHeadersToDownstream = addHeadersToDownstream;
Expand Down Expand Up @@ -77,6 +78,7 @@ public class DownstreamRoute
SecurityOptions = securityOptions;
DownstreamHttpMethod = downstreamHttpMethod;
DownstreamHttpVersion = downstreamHttpVersion;
ConnectionClose = connectionClose;
}

public string Key { get; }
Expand Down Expand Up @@ -112,6 +114,7 @@ public class DownstreamRoute
public bool DangerousAcceptAnyServerCertificateValidator { get; }
public SecurityOptions SecurityOptions { get; }
public string DownstreamHttpMethod { get; }
public Version DownstreamHttpVersion { get; }
public Version DownstreamHttpVersion { get; }
public bool ConnectionClose { get; }
}
}
3 changes: 3 additions & 0 deletions src/Ocelot/Configuration/File/FileGlobalConfiguration.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ public FileGlobalConfiguration()
LoadBalancerOptions = new FileLoadBalancerOptions();
QoSOptions = new FileQoSOptions();
HttpHandlerOptions = new FileHttpHandlerOptions();
ConnectionClose = false;
}

public string RequestIdKey { get; set; }
Expand All @@ -28,5 +29,7 @@ public FileGlobalConfiguration()
public FileHttpHandlerOptions HttpHandlerOptions { get; set; }

public string DownstreamHttpVersion { get; set; }

public bool ConnectionClose { get; set; }
}
}
4 changes: 3 additions & 1 deletion src/Ocelot/Configuration/File/FileRoute.cs
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ public FileRoute()
LoadBalancerOptions = new FileLoadBalancerOptions();
SecurityOptions = new FileSecurityOptions();
Priority = 1;
ConnectionClose = false;
}

public string DownstreamPathTemplate { get; set; }
Expand Down Expand Up @@ -56,6 +57,7 @@ public FileRoute()
public int Timeout { get; set; }
public bool DangerousAcceptAnyServerCertificateValidator { get; set; }
public FileSecurityOptions SecurityOptions { get; set; }
public string DownstreamHttpVersion { get; set; }
public string DownstreamHttpVersion { get; set; }
public bool ConnectionClose { get; set; }
}
}
1 change: 1 addition & 0 deletions src/Ocelot/DependencyInjection/OcelotBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,7 @@ public OcelotBuilder(IServiceCollection services, IConfiguration configurationRo
Services.TryAddSingleton<IAuthenticationOptionsCreator, AuthenticationOptionsCreator>();
Services.TryAddSingleton<IUpstreamTemplatePatternCreator, UpstreamTemplatePatternCreator>();
Services.TryAddSingleton<IRequestIdKeyCreator, RequestIdKeyCreator>();
Services.TryAddSingleton<IConnectionCloseCreator, ConnectionCloseCreator>();
Services.TryAddSingleton<IServiceProviderConfigurationCreator, ServiceProviderConfigurationCreator>();
Services.TryAddSingleton<IQoSOptionsCreator, QoSOptionsCreator>();
Services.TryAddSingleton<IRouteOptionsCreator, RouteOptionsCreator>();
Expand Down
3 changes: 2 additions & 1 deletion src/Ocelot/Requester/HttpClientBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ public IHttpClient Create(DownstreamRoute downstreamRoute)
Timeout = timeout
};

_client = new HttpClientWrapper(_httpClient);
_client = new HttpClientWrapper(_httpClient, downstreamRoute.ConnectionClose);

return _client;
}
Expand All @@ -84,6 +84,7 @@ private HttpClientHandler UseNonCookiesHandler(DownstreamRoute downstreamRoute)
UseCookies = downstreamRoute.HttpHandlerOptions.UseCookieContainer,
UseProxy = downstreamRoute.HttpHandlerOptions.UseProxy,
MaxConnectionsPerServer = downstreamRoute.HttpHandlerOptions.MaxConnectionsPerServer,

};
}

Expand Down
6 changes: 5 additions & 1 deletion src/Ocelot/Requester/HttpClientWrapper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,17 @@ public class HttpClientWrapper : IHttpClient
{
public HttpClient Client { get; }

public HttpClientWrapper(HttpClient client)
public bool ConnectionClose { get; }

public HttpClientWrapper(HttpClient client, bool connectionClose = false)
{
Client = client;
ConnectionClose = connectionClose;
}

public Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken = default)
{
request.Headers.ConnectionClose = ConnectionClose;
return Client.SendAsync(request, cancellationToken);
}
}
Expand Down

0 comments on commit d562ced

Please sign in to comment.