Skip to content

Commit

Permalink
Merge branch 'develop'
Browse files Browse the repository at this point in the history
  • Loading branch information
gingters committed Mar 23, 2021
2 parents 43f5e8f + fcf6ee4 commit 5fa8402
Show file tree
Hide file tree
Showing 28 changed files with 423 additions and 90 deletions.
2 changes: 2 additions & 0 deletions Documentation/de/3-installation.md
Original file line number Diff line number Diff line change
Expand Up @@ -169,6 +169,7 @@ Die Standardeinstellungen umfassen dabei:
<add key="SecureClientController" value="false" />
<add key="AccessTokenLifetime" value="365.00:00:00" />
<add key="LogSensitiveData" value="true" />
<add key="RequireLinkAvailability" value="false" />
<add key="LinkTokenRefreshWindow" value="00:01:00" />
<add key="LinkReconnectMinWaitTime" value="00:00:02" />
<add key="LinkReconnectMaxWaitTime" value="00:00:30" />
Expand Down Expand Up @@ -210,6 +211,7 @@ Die Standardeinstellungen umfassen dabei:
| SecureClientController | Legt fest, ob ein Client für jeden Request an den `/relay` Endpunkt einen gültigen AccessToken eines On-Premise Connectors / Links mitsenden muss (default false) |
| AccessTokenLifetime | Zeitspanne für die ein ausgestelltes AccesssToken für On-Premise Connectoren sowie Management Web Benutzer gültig ist (default 365 Tage) <br/> _Hinweis:_ Ein zu kleiner Wert schränkt die Benutzbarkeit des Management Webs ein |
| LogSensitiveData | Gibt an, ob sensitive Daten der Requests wie Werte von Http-Headern und Query-Parametern gelogged werden sollen (default true) |
| RequireLinkAvailability | Prüft beim Relayen ob eine Verbindung verfügbar ist und beendet die Anfrage mit HTTP Service Unavailable falls nicht (default false) |
| LinkTokenRefreshWindow | Default-Zeitspanne, in der ein On-Premise Connector vor dem ungültig werden seines AccessTokens ein neues anfordert (default 1 Minute). Dieser Wert kann pro Link überschrieben werden. |
| LinkReconnectMinWaitTime | Default-Zeitspanne, nachdem ein On-Premise Connector nach einem Verbindungsverlust die SignalR-Verbindung frühestens wieder aufzubauen versucht (default 2 Sekunden). Dieser Wert kann pro Link überschrieben werden. |
| LinkReconnectMaxWaitTime | Default-Zeitspanne, nachdem ein On-Premise Connector nach einem Verbindungsverlust die SignalR-Verbindung spätestens wieder aufzubauen versucht (default 30 Sekunden). Dieser Wert kann pro Link überschrieben werden. |
Expand Down
17 changes: 17 additions & 0 deletions Documentation/de/relayserver.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,23 @@

# Release Notes

## Version 2.4.0

* Schneller Abbruch

* Über eine neue Einstellung (`RequireLinkAvailability`) kann nun festgelegt werden, dass der RelayServer sofort mit einem `Service Unavailable` antwortet, wenn gerade kein Connector zu der angefragten LinkId verbunden ist.

* Allgemeine Verbesserungen

* Verbindungsabbrüche die beim Hochladen einer Response zum RelayServer passieren werden jetzt geloggt.
* Die Häufigkeit der Queue-Erstellung unter sehr hoher Last wurde reduziert.
* Das RabbitMQ Model wird nach einem Shutdown wiederhergestellt.
* Die Anzahl der Datenbankzugriffe pro Request wurde reduziert.

* Fehlerbehebungen

* Cookies die der Client mitschickt werden nun auch korrekt vom Connector weiter an das Web-target gesendet.

## Version 2.3.0

* RabbitMQ Verbesserungen
Expand Down
2 changes: 2 additions & 0 deletions Documentation/en/3-installation.md
Original file line number Diff line number Diff line change
Expand Up @@ -167,6 +167,7 @@ The default settings include:
<add key="SecureClientController" value="false" />
<add key="AccessTokenLifetime" value="365.00:00:00" />
<add key="LogSensitiveData" value="true" />
<add key="RequireLinkAvailability" value="false" />
<add key="LinkTokenRefreshWindow" value="00:01:00" />
<add key="LinkReconnectMinWaitTime" value="00:00:02" />
<add key="LinkReconnectMaxWaitTime" value="00:00:30" />
Expand Down Expand Up @@ -208,6 +209,7 @@ The default settings include:
| SecureClientController | When set, every request to the `/relay` endpoint must be authorized by a valid On-Premise Connector / Link access token (default false) |
| AccessTokenLifetime | Time span that an issued access token for On-Premise Connectors and Management Web users will be valid (default 365 days)<br /> _Note:_ If you set this value too short, usability of the Management Web will be affected |
| LogSensitiveData | Determines whether sensitive data like query parameter values or http header values should be written to the logs (default true) |
| RequireLinkAvailability | Checks for an available connection before relaying and returns a HTTP Service Unavailable when not available (default false) |
| LinkTokenRefreshWindow | Default time span, in which an On-Premise Connector will request a new access token, before the current one expires (default 1 minute). This value can be overriden per link. |
| LinkReconnectMinWaitTime | Default time span, after which an disconnected On-Premise Connector may reconnect to the RelayServer (default 2 seconds). This value can be overriden per link. |
| LinkReconnectMaxWaitTime | Default time span, after which an disconnected On-Premise Connector will reconnect at the latest (default 30 seconds). This value can be overriden per link. |
Expand Down
17 changes: 17 additions & 0 deletions Documentation/en/relayserver.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,23 @@ The goal of this list is to highlight companies who pay back to this open source

# Version history

## Version 2.4.0

* Fast abort

* With a new setting (`RequireLinkAvailability`) you can now configure that the RelayServer will immediately answer with a `Service Unavailable` when no connector currently is available for the requested link.

* General improvements

* A connection loss between connector and server happening when uploading a response to the RelayServer will now be logged.
* The frequence of queue generation under very high load was reduced.
* The RabbitMQ model will be restored after a shutdown.
* The amount of database queries for a request has been reduced.

* Bug fixes

* Cookies sent by the client will now be also sent correctly to the on-premise target.

## Version 2.3.0

* RabbitMQ Improvements
Expand Down
8 changes: 4 additions & 4 deletions Shared/AssemblyInfo.shared.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@

[assembly: AssemblyCompany("Thinktecture AG")]
[assembly: AssemblyProduct("Thinktecture RelayServer")]
[assembly: AssemblyCopyright("Copyright © Thinktecture AG 2015 - 2020. All rights reserved.")]
[assembly: AssemblyCopyright("Copyright © Thinktecture AG 2015 - 2021. All rights reserved.")]
[assembly: AssemblyTrademark("Thinktecture RelayServer")]

[assembly: AssemblyVersion("2.3.0.0")]
[assembly: AssemblyFileVersion("2.3.0.0")]
[assembly: AssemblyInformationalVersion("2.3.0.0")]
[assembly: AssemblyVersion("2.4.0.0")]
[assembly: AssemblyFileVersion("2.4.0.0")]
[assembly: AssemblyInformationalVersion("2.4.0.0")]
6 changes: 3 additions & 3 deletions Shared/ProjectProperties.shared.props
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
<Project>
<!-- WARNING: This file is shared between all RelayServer .NET Core library projects -->
<PropertyGroup>
<VersionPrefix>2.3.0</VersionPrefix>
<PackageVersion>2.3.0</PackageVersion>
<VersionPrefix>2.4.0</VersionPrefix>
<PackageVersion>2.4.0</PackageVersion>

<Copyright>Copyright © Thinktecture AG 2015 - 2020. All rights reserved.</Copyright>
<Copyright>Copyright © Thinktecture AG 2015 - 2021. All rights reserved.</Copyright>
<PackageTags>thinktecture;relayserver</PackageTags>
<PackageIcon>Logo_T_Nontransparent.png</PackageIcon>
<PackageProjectUrl>https://github.com/thinktecture/relayserver</PackageProjectUrl>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@ public class HttpClientFactory : IHttpClientFactory
public HttpClient CreateClient(string name)
{
return (name == "FollowRedirectsWebTarget")
? new HttpClient()
: new HttpClient(new HttpClientHandler() { AllowAutoRedirect = false, });
? new HttpClient(new HttpClientHandler() { UseCookies = false, })
: new HttpClient(new HttpClientHandler() { UseCookies = false, AllowAutoRedirect = false, });
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
using Moq;
using Serilog;
using Thinktecture.Relay.Server.Communication;
using Thinktecture.Relay.Server.Config;
using Thinktecture.Relay.Server.Diagnostics;
using Thinktecture.Relay.Server.Dto;
using Thinktecture.Relay.Server.Helper;
Expand All @@ -33,6 +34,7 @@ public class ClientControllerTest
private readonly Mock<ITraceManager> _traceManagerMock;
private readonly Mock<IInterceptorManager> _interceptorManagerMock;
private readonly Mock<IPostDataTemporaryStore> _postDataTemporaryStoreMock;
private readonly IConfiguration _configuration;

private class FakePrincipal : IPrincipal
{
Expand Down Expand Up @@ -67,12 +69,13 @@ public ClientControllerTest()
_traceManagerMock = new Mock<ITraceManager>();
_interceptorManagerMock = new Mock<IInterceptorManager>();
_postDataTemporaryStoreMock = new Mock<IPostDataTemporaryStore>();
_configuration = new ConfigurationDummy();
}

private ClientController CreateClientController()
{
return new ClientController(_backendCommunicationMock.Object, _loggerMock.Object, _relayRepositoryMock.Object, _requestLoggerMock.Object,
_clientRequestBuilderMock.Object, _pathSplitterMock.Object, _traceManagerMock.Object, _interceptorManagerMock.Object,
_clientRequestBuilderMock.Object, _pathSplitterMock.Object, _configuration, _traceManagerMock.Object, _interceptorManagerMock.Object,
_postDataTemporaryStoreMock.Object);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ public class ConfigurationDummy : IConfiguration
public bool SecureClientController { get; set; }
public TimeSpan AccessTokenLifetime { get; set; }
public bool LogSensitiveData { get; set; }
public Boolean RequireLinkAvailability { get; set; }

// Default settings for links
public TimeSpan LinkTokenRefreshWindow { get; set; }
Expand Down
1 change: 1 addition & 0 deletions Thinktecture.Relay.Server/App.config
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@
<add key="SecureClientController" value="false" />
<add key="AccessTokenLifetime" value="365.00:00:00" />
<add key="LogSensitiveData" value="true" />
<add key="RequireLinkAvailability" value="false" />

<!-- Default for all links -->
<add key="LinkTokenRefreshWindow" value="00:01:00" />
Expand Down
18 changes: 15 additions & 3 deletions Thinktecture.Relay.Server/Communication/BackendCommunication.cs
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ internal class BackendCommunication : IBackendCommunication, IDisposable
private readonly IOnPremiseConnectorCallbackFactory _requestCallbackFactory;
private readonly ILogger _logger;
private readonly ILinkRepository _linkRepository;
private readonly TimeSpan _lastActivityDbUpdateDelay;

private readonly ConcurrentDictionary<string, IOnPremiseConnectorCallback> _requestCompletedCallbacks;
private readonly ConcurrentDictionary<string, IOnPremiseConnectionContext> _connectionContexts;
Expand All @@ -46,6 +47,7 @@ public BackendCommunication(IConfiguration configuration, IMessageDispatcher mes
_requestSubscriptions = new Dictionary<string, IDisposable>(StringComparer.OrdinalIgnoreCase);
_cts = new CancellationTokenSource();
_cancellationToken = _cts.Token;
_lastActivityDbUpdateDelay = new TimeSpan(_configuration.ActiveConnectionTimeout.Ticks / 5);
OriginId = persistedSettings?.OriginId ?? throw new ArgumentNullException(nameof(persistedSettings));

_logger?.Verbose("Creating backend communication. origin-id={OriginId}", OriginId);
Expand Down Expand Up @@ -167,17 +169,27 @@ public async Task AcknowledgeOnPremiseConnectorRequestAsync(Guid originId, strin

public async Task RenewLastActivityAsync(string connectionId)
{
var now = DateTime.UtcNow;

if (_connectionContexts.TryGetValue(connectionId, out var connectionContext))
{
connectionContext.LastLocalActivity = DateTime.UtcNow;
connectionContext.LastLocalActivity = now;

if (!connectionContext.IsActive)
{
connectionContext.LastDbActivity = now;
await RegisterOnPremiseAsync(connectionContext);
}
else if (connectionContext.LastDbActivity + _lastActivityDbUpdateDelay < now)
{
connectionContext.LastDbActivity = now;
await _linkRepository.RenewActiveConnectionAsync(connectionId);
}
}
else
{
await _linkRepository.RenewActiveConnectionAsync(connectionId);
}

await _linkRepository.RenewActiveConnectionAsync(connectionId);
}

public void SendOnPremiseTargetResponse(Guid originId, IOnPremiseConnectorResponse response)
Expand Down
Loading

0 comments on commit 5fa8402

Please sign in to comment.