public async Task GetDateHeaderValue_ReturnsUpdatedValueAfterIdle() { var now = DateTimeOffset.UtcNow; var future = now.AddSeconds(10); var systemClock = new MockSystemClock { UtcNow = now }; var timeWithoutRequestsUntilIdle = TimeSpan.FromMilliseconds(50); var timerInterval = TimeSpan.FromMilliseconds(10); var dateHeaderValueManager = new DateHeaderValueManager(systemClock, timeWithoutRequestsUntilIdle, timerInterval); string result1; string result2; try { result1 = dateHeaderValueManager.GetDateHeaderValue(); systemClock.UtcNow = future; // Wait for twice the idle timeout to ensure the timer is stopped await Task.Delay(timeWithoutRequestsUntilIdle.Add(timeWithoutRequestsUntilIdle)); result2 = dateHeaderValueManager.GetDateHeaderValue(); } finally { dateHeaderValueManager.Dispose(); } Assert.Equal(now.ToString(Constants.RFC1123DateFormat), result1); Assert.Equal(future.ToString(Constants.RFC1123DateFormat), result2); Assert.True(systemClock.UtcNowCalled >= 2); }
public void GetDateHeaderValue_ReturnsCachedValueBetweenTimerTicks() { var now = DateTimeOffset.UtcNow; var future = now.AddSeconds(10); var systemClock = new MockSystemClock { UtcNow = now }; var timeWithoutRequestsUntilIdle = TimeSpan.FromSeconds(1); var timerInterval = TimeSpan.FromSeconds(10); var dateHeaderValueManager = new DateHeaderValueManager(systemClock, timeWithoutRequestsUntilIdle, timerInterval); string result1; string result2; try { result1 = dateHeaderValueManager.GetDateHeaderValue(); systemClock.UtcNow = future; result2 = dateHeaderValueManager.GetDateHeaderValue(); } finally { dateHeaderValueManager.Dispose(); } Assert.Equal(now.ToString(Constants.RFC1123DateFormat), result1); Assert.Equal(now.ToString(Constants.RFC1123DateFormat), result2); Assert.Equal(1, systemClock.UtcNowCalled); }
public void ResetResponseHeaders() { _responseHeaders.Reset(); _responseHeaders.SetRawDate( DateHeaderValueManager.GetDateHeaderValue(), DateHeaderValueManager.GetDateHeaderValueBytes()); _responseHeaders.SetRawServer( "Kestrel", _bytesServer); }
public void GetDateHeaderValue_ReturnsDateValueInRFC1123Format() { var now = DateTimeOffset.UtcNow; var systemClock = new MockSystemClock { UtcNow = now }; var timeWithoutRequestsUntilIdle = TimeSpan.FromSeconds(1); var timerInterval = TimeSpan.FromSeconds(10); var dateHeaderValueManager = new DateHeaderValueManager(systemClock, timeWithoutRequestsUntilIdle, timerInterval); string result; try { result = dateHeaderValueManager.GetDateHeaderValue(); } finally { dateHeaderValueManager.Dispose(); } Assert.Equal(now.ToString(Constants.RFC1123DateFormat), result); }
public void ResetResponseHeaders() { _responseHeaders.Reset(); _responseHeaders.HeaderServer = "Kestrel"; _responseHeaders.HeaderDate = DateHeaderValueManager.GetDateHeaderValue(); }
public void GetDateHeaderValue_ReturnsDateValueAfterDisposed() { var now = DateTimeOffset.UtcNow; var future = now.AddSeconds(10); var systemClock = new MockSystemClock { UtcNow = now }; var timeWithoutRequestsUntilIdle = TimeSpan.FromSeconds(1); var timerInterval = TimeSpan.FromSeconds(10); var dateHeaderValueManager = new DateHeaderValueManager(systemClock, timeWithoutRequestsUntilIdle, timerInterval); var result1 = dateHeaderValueManager.GetDateHeaderValue(); dateHeaderValueManager.Dispose(); systemClock.UtcNow = future; var result2 = dateHeaderValueManager.GetDateHeaderValue(); Assert.Equal(now.ToString(Constants.RFC1123DateFormat), result1); Assert.Equal(future.ToString(Constants.RFC1123DateFormat), result2); }
public IDisposable Start(IFeatureCollection serverFeatures, Func<IFeatureCollection, Task> application) { var disposables = new Stack<IDisposable>(); var disposer = new Disposable(() => { foreach (var disposable in disposables) { disposable.Dispose(); } }); try { var information = (KestrelServerInformation)serverFeatures.Get<IKestrelServerInformation>(); var dateHeaderValueManager = new DateHeaderValueManager(); var engine = new KestrelEngine(_libraryManager, new ServiceContext { AppShutdown = _appShutdownService, Log = new KestrelTrace(_logger), DateHeaderValueManager = dateHeaderValueManager }); disposables.Push(engine); disposables.Push(dateHeaderValueManager); if (information.ThreadCount < 0) { throw new ArgumentOutOfRangeException(nameof(information.ThreadCount), information.ThreadCount, "ThreadCount cannot be negative"); } engine.Start(information.ThreadCount == 0 ? 1 : information.ThreadCount); bool atLeastOneListener = false; foreach (var address in information.Addresses) { var parsedAddress = ServerAddress.FromUrl(address); if (parsedAddress == null) { throw new FormatException("Unrecognized listening address: " + address); } else { atLeastOneListener = true; disposables.Push(engine.CreateServer( parsedAddress.Scheme, parsedAddress.Host, parsedAddress.Port, async frame => { var request = new ServerRequest(frame); await application.Invoke(request.Features).ConfigureAwait(false); })); } } if (!atLeastOneListener) { throw new InvalidOperationException("No recognized listening addresses were configured."); } return disposer; } catch { disposer.Dispose(); throw; } }