Skip to content

Commit d562ced

Browse files
author
Bjarte K. Helland
committed
Add possibility to set Connection to Close ( request.Headers.ConnectionClose = ConnectionClose ) in order to prevent persistent connections.
1 parent 3ef6abd commit d562ced

10 files changed

+58
-7
lines changed

src/Ocelot/Configuration/Builder/DownstreamReRouteBuilder.cs

+9-1
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ public class DownstreamRouteBuilder
4444
private SecurityOptions _securityOptions;
4545
private string _downstreamHttpMethod;
4646
private Version _downstreamHttpVersion;
47+
private bool _connectionClose;
4748

4849
public DownstreamRouteBuilder()
4950
{
@@ -263,6 +264,12 @@ public DownstreamRouteBuilder WithDownstreamHttpVersion(Version downstreamHttpVe
263264
return this;
264265
}
265266

267+
public DownstreamRouteBuilder WithConnectionClose(bool connectionClose)
268+
{
269+
_connectionClose = connectionClose;
270+
return this;
271+
}
272+
266273
public DownstreamRoute Build()
267274
{
268275
return new DownstreamRoute(
@@ -299,7 +306,8 @@ public DownstreamRoute Build()
299306
_dangerousAcceptAnyServerCertificateValidator,
300307
_securityOptions,
301308
_downstreamHttpMethod,
302-
_downstreamHttpVersion);
309+
_downstreamHttpVersion,
310+
_connectionClose);
303311
}
304312
}
305313
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
using Ocelot.Configuration.File;
2+
3+
namespace Ocelot.Configuration.Creator
4+
{
5+
public class ConnectionCloseCreator : IConnectionCloseCreator
6+
{
7+
public bool Create(bool fileRouteConnectionClose, FileGlobalConfiguration globalConfiguration)
8+
{
9+
var globalConnectionClose = globalConfiguration.ConnectionClose;
10+
11+
return fileRouteConnectionClose || globalConnectionClose;
12+
}
13+
}
14+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
using Ocelot.Configuration.File;
2+
3+
namespace Ocelot.Configuration.Creator
4+
{
5+
public interface IConnectionCloseCreator
6+
{
7+
bool Create(bool fileRouteConnectionClose, FileGlobalConfiguration globalConfiguration);
8+
}
9+
}

src/Ocelot/Configuration/Creator/RoutesCreator.cs

+7-1
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ public class RoutesCreator : IRoutesCreator
2323
private readonly IRouteKeyCreator _routeKeyCreator;
2424
private readonly ISecurityOptionsCreator _securityOptionsCreator;
2525
private readonly IVersionCreator _versionCreator;
26+
private readonly IConnectionCloseCreator _connectionCloseCreator;
2627

2728
public RoutesCreator(
2829
IClaimsToThingCreator claimsToThingCreator,
@@ -39,7 +40,8 @@ public RoutesCreator(
3940
ILoadBalancerOptionsCreator loadBalancerOptionsCreator,
4041
IRouteKeyCreator routeKeyCreator,
4142
ISecurityOptionsCreator securityOptionsCreator,
42-
IVersionCreator versionCreator
43+
IVersionCreator versionCreator,
44+
IConnectionCloseCreator connectionCloseCreator
4345
)
4446
{
4547
_routeKeyCreator = routeKeyCreator;
@@ -58,6 +60,7 @@ IVersionCreator versionCreator
5860
_loadBalancerOptionsCreator = loadBalancerOptionsCreator;
5961
_securityOptionsCreator = securityOptionsCreator;
6062
_versionCreator = versionCreator;
63+
_connectionCloseCreator = connectionCloseCreator;
6164
}
6265

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

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

115+
var connectionClose = _connectionCloseCreator.Create(fileRoute.ConnectionClose, globalConfiguration);
116+
112117
var route = new DownstreamRouteBuilder()
113118
.WithKey(fileRoute.Key)
114119
.WithDownstreamPathTemplate(fileRoute.DownstreamPathTemplate)
@@ -145,6 +150,7 @@ private DownstreamRoute SetUpDownstreamRoute(FileRoute fileRoute, FileGlobalConf
145150
.WithSecurityOptions(securityOptions)
146151
.WithDownstreamHttpVersion(downstreamHttpVersion)
147152
.WithDownStreamHttpMethod(fileRoute.DownstreamHttpMethod)
153+
.WithConnectionClose(connectionClose)
148154
.Build();
149155

150156
return route;

src/Ocelot/Configuration/DownstreamRoute.cs

+5-2
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,8 @@ public DownstreamRoute(
4141
bool dangerousAcceptAnyServerCertificateValidator,
4242
SecurityOptions securityOptions,
4343
string downstreamHttpMethod,
44-
Version downstreamHttpVersion)
44+
Version downstreamHttpVersion,
45+
bool connectionClose)
4546
{
4647
DangerousAcceptAnyServerCertificateValidator = dangerousAcceptAnyServerCertificateValidator;
4748
AddHeadersToDownstream = addHeadersToDownstream;
@@ -77,6 +78,7 @@ public DownstreamRoute(
7778
SecurityOptions = securityOptions;
7879
DownstreamHttpMethod = downstreamHttpMethod;
7980
DownstreamHttpVersion = downstreamHttpVersion;
81+
ConnectionClose = connectionClose;
8082
}
8183

8284
public string Key { get; }
@@ -112,6 +114,7 @@ public DownstreamRoute(
112114
public bool DangerousAcceptAnyServerCertificateValidator { get; }
113115
public SecurityOptions SecurityOptions { get; }
114116
public string DownstreamHttpMethod { get; }
115-
public Version DownstreamHttpVersion { get; }
117+
public Version DownstreamHttpVersion { get; }
118+
public bool ConnectionClose { get; }
116119
}
117120
}

src/Ocelot/Configuration/File/FileGlobalConfiguration.cs

+3
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ public FileGlobalConfiguration()
99
LoadBalancerOptions = new FileLoadBalancerOptions();
1010
QoSOptions = new FileQoSOptions();
1111
HttpHandlerOptions = new FileHttpHandlerOptions();
12+
ConnectionClose = false;
1213
}
1314

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

3031
public string DownstreamHttpVersion { get; set; }
32+
33+
public bool ConnectionClose { get; set; }
3134
}
3235
}

src/Ocelot/Configuration/File/FileRoute.cs

+3-1
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ public FileRoute()
2424
LoadBalancerOptions = new FileLoadBalancerOptions();
2525
SecurityOptions = new FileSecurityOptions();
2626
Priority = 1;
27+
ConnectionClose = false;
2728
}
2829

2930
public string DownstreamPathTemplate { get; set; }
@@ -56,6 +57,7 @@ public FileRoute()
5657
public int Timeout { get; set; }
5758
public bool DangerousAcceptAnyServerCertificateValidator { get; set; }
5859
public FileSecurityOptions SecurityOptions { get; set; }
59-
public string DownstreamHttpVersion { get; set; }
60+
public string DownstreamHttpVersion { get; set; }
61+
public bool ConnectionClose { get; set; }
6062
}
6163
}

src/Ocelot/DependencyInjection/OcelotBuilder.cs

+1
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ public OcelotBuilder(IServiceCollection services, IConfiguration configurationRo
7878
Services.TryAddSingleton<IAuthenticationOptionsCreator, AuthenticationOptionsCreator>();
7979
Services.TryAddSingleton<IUpstreamTemplatePatternCreator, UpstreamTemplatePatternCreator>();
8080
Services.TryAddSingleton<IRequestIdKeyCreator, RequestIdKeyCreator>();
81+
Services.TryAddSingleton<IConnectionCloseCreator, ConnectionCloseCreator>();
8182
Services.TryAddSingleton<IServiceProviderConfigurationCreator, ServiceProviderConfigurationCreator>();
8283
Services.TryAddSingleton<IQoSOptionsCreator, QoSOptionsCreator>();
8384
Services.TryAddSingleton<IRouteOptionsCreator, RouteOptionsCreator>();

src/Ocelot/Requester/HttpClientBuilder.cs

+2-1
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ public IHttpClient Create(DownstreamRoute downstreamRoute)
6262
Timeout = timeout
6363
};
6464

65-
_client = new HttpClientWrapper(_httpClient);
65+
_client = new HttpClientWrapper(_httpClient, downstreamRoute.ConnectionClose);
6666

6767
return _client;
6868
}
@@ -84,6 +84,7 @@ private HttpClientHandler UseNonCookiesHandler(DownstreamRoute downstreamRoute)
8484
UseCookies = downstreamRoute.HttpHandlerOptions.UseCookieContainer,
8585
UseProxy = downstreamRoute.HttpHandlerOptions.UseProxy,
8686
MaxConnectionsPerServer = downstreamRoute.HttpHandlerOptions.MaxConnectionsPerServer,
87+
8788
};
8889
}
8990

src/Ocelot/Requester/HttpClientWrapper.cs

+5-1
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,17 @@ public class HttpClientWrapper : IHttpClient
1111
{
1212
public HttpClient Client { get; }
1313

14-
public HttpClientWrapper(HttpClient client)
14+
public bool ConnectionClose { get; }
15+
16+
public HttpClientWrapper(HttpClient client, bool connectionClose = false)
1517
{
1618
Client = client;
19+
ConnectionClose = connectionClose;
1720
}
1821

1922
public Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken = default)
2023
{
24+
request.Headers.ConnectionClose = ConnectionClose;
2125
return Client.SendAsync(request, cancellationToken);
2226
}
2327
}

0 commit comments

Comments
 (0)