Skip to content

Commit 79e2b95

Browse files
Bjarte K.  Hellandraman-m
authored andcommitted
Add possibility to set Connection to Close ( request.Headers.ConnectionClose = ConnectionClose ) in order to prevent persistent connections.
1 parent 433dfca commit 79e2b95

File tree

9 files changed

+49
-6
lines changed

9 files changed

+49
-6
lines changed
Lines changed: 14 additions & 0 deletions
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+
}
Lines changed: 9 additions & 0 deletions
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

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ public class RoutesCreator : IRoutesCreator
2626
private readonly IRouteKeyCreator _routeKeyCreator;
2727
private readonly ISecurityOptionsCreator _securityOptionsCreator;
2828
private readonly IVersionCreator _versionCreator;
29+
private readonly IConnectionCloseCreator _connectionCloseCreator;
2930

3031
public RoutesCreator(
3132
IClaimsToThingCreator claimsToThingCreator,
@@ -42,7 +43,8 @@ public RoutesCreator(
4243
ILoadBalancerOptionsCreator loadBalancerOptionsCreator,
4344
IRouteKeyCreator routeKeyCreator,
4445
ISecurityOptionsCreator securityOptionsCreator,
45-
IVersionCreator versionCreator
46+
IVersionCreator versionCreator,
47+
IConnectionCloseCreator connectionCloseCreator
4648
)
4749
{
4850
_routeKeyCreator = routeKeyCreator;
@@ -61,6 +63,7 @@ IVersionCreator versionCreator
6163
_loadBalancerOptionsCreator = loadBalancerOptionsCreator;
6264
_securityOptionsCreator = securityOptionsCreator;
6365
_versionCreator = versionCreator;
66+
_connectionCloseCreator = connectionCloseCreator;
6467
}
6568

6669
public List<Route> Create(FileConfiguration fileConfiguration)
@@ -112,6 +115,8 @@ private DownstreamRoute SetUpDownstreamRoute(FileRoute fileRoute, FileGlobalConf
112115

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

118+
var connectionClose = _connectionCloseCreator.Create(fileRoute.ConnectionClose, globalConfiguration);
119+
115120
var route = new DownstreamRouteBuilder()
116121
.WithKey(fileRoute.Key)
117122
.WithDownstreamPathTemplate(fileRoute.DownstreamPathTemplate)
@@ -148,6 +153,7 @@ private DownstreamRoute SetUpDownstreamRoute(FileRoute fileRoute, FileGlobalConf
148153
.WithSecurityOptions(securityOptions)
149154
.WithDownstreamHttpVersion(downstreamHttpVersion)
150155
.WithDownStreamHttpMethod(fileRoute.DownstreamHttpMethod)
156+
.WithConnectionClose(connectionClose)
151157
.Build();
152158

153159
return route;

src/Ocelot/Configuration/DownstreamRoute.cs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,8 @@ public DownstreamRoute(
4343
bool dangerousAcceptAnyServerCertificateValidator,
4444
SecurityOptions securityOptions,
4545
string downstreamHttpMethod,
46-
Version downstreamHttpVersion)
46+
Version downstreamHttpVersion,
47+
bool connectionClose)
4748
{
4849
DangerousAcceptAnyServerCertificateValidator = dangerousAcceptAnyServerCertificateValidator;
4950
AddHeadersToDownstream = addHeadersToDownstream;
@@ -79,6 +80,7 @@ public DownstreamRoute(
7980
SecurityOptions = securityOptions;
8081
DownstreamHttpMethod = downstreamHttpMethod;
8182
DownstreamHttpVersion = downstreamHttpVersion;
83+
ConnectionClose = connectionClose;
8284
}
8385

8486
public string Key { get; }
@@ -114,6 +116,7 @@ public DownstreamRoute(
114116
public bool DangerousAcceptAnyServerCertificateValidator { get; }
115117
public SecurityOptions SecurityOptions { get; }
116118
public string DownstreamHttpMethod { get; }
117-
public Version DownstreamHttpVersion { get; }
119+
public Version DownstreamHttpVersion { get; }
120+
public bool ConnectionClose { get; }
118121
}
119122
}

src/Ocelot/Configuration/File/FileGlobalConfiguration.cs

Lines changed: 3 additions & 0 deletions
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

Lines changed: 3 additions & 1 deletion
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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@ public OcelotBuilder(IServiceCollection services, IConfiguration configurationRo
100100
Services.TryAddSingleton<IAuthenticationOptionsCreator, AuthenticationOptionsCreator>();
101101
Services.TryAddSingleton<IUpstreamTemplatePatternCreator, UpstreamTemplatePatternCreator>();
102102
Services.TryAddSingleton<IRequestIdKeyCreator, RequestIdKeyCreator>();
103+
Services.TryAddSingleton<IConnectionCloseCreator, ConnectionCloseCreator>();
103104
Services.TryAddSingleton<IServiceProviderConfigurationCreator, ServiceProviderConfigurationCreator>();
104105
Services.TryAddSingleton<IQoSOptionsCreator, QoSOptionsCreator>();
105106
Services.TryAddSingleton<IRouteOptionsCreator, RouteOptionsCreator>();

src/Ocelot/Requester/HttpClientBuilder.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ public IHttpClient Create(DownstreamRoute downstreamRoute)
6565
Timeout = timeout,
6666
};
6767

68-
_client = new HttpClientWrapper(_httpClient);
68+
_client = new HttpClientWrapper(_httpClient, downstreamRoute.ConnectionClose);
6969

7070
return _client;
7171
}
@@ -87,6 +87,7 @@ private static HttpClientHandler UseNonCookiesHandler(DownstreamRoute downstream
8787
UseCookies = downstreamRoute.HttpHandlerOptions.UseCookieContainer,
8888
UseProxy = downstreamRoute.HttpHandlerOptions.UseProxy,
8989
MaxConnectionsPerServer = downstreamRoute.HttpHandlerOptions.MaxConnectionsPerServer,
90+
9091
};
9192
}
9293

src/Ocelot/Requester/HttpClientWrapper.cs

Lines changed: 5 additions & 1 deletion
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)