public void InitialDictionaryContainsServerAndDate() { var connectionContext = new ConnectionContext { DateHeaderValueManager = new DateHeaderValueManager(), ServerAddress = ServerAddress.FromUrl("http://localhost:5000") }; var frame = new Frame<object>(application: null, context: connectionContext); IDictionary<string, StringValues> headers = frame.ResponseHeaders; Assert.Equal(2, headers.Count); StringValues serverHeader; Assert.True(headers.TryGetValue("Server", out serverHeader)); Assert.Equal(1, serverHeader.Count); Assert.Equal("Kestrel", serverHeader[0]); StringValues dateHeader; DateTime date; Assert.True(headers.TryGetValue("Date", out dateHeader)); Assert.Equal(1, dateHeader.Count); Assert.True(DateTime.TryParse(dateHeader[0], out date)); Assert.True(DateTime.Now - date <= TimeSpan.FromMinutes(1)); Assert.False(headers.IsReadOnly); }
private async Task AppChunked(Frame frame) { var data = new MemoryStream(); await frame.RequestBody.CopyToAsync(data); var bytes = data.ToArray(); frame.ResponseHeaders.Clear(); frame.ResponseHeaders["Content-Length"] = new[] { bytes.Length.ToString() }; await frame.ResponseBody.WriteAsync(bytes, 0, bytes.Length); }
public Connection(ListenerContext context, UvStreamHandle socket) : base(context) { _socket = socket; ConnectionControl = this; _connectionId = Interlocked.Increment(ref _lastConnectionId); SocketInput = new SocketInput(Memory2); SocketOutput = new SocketOutput(Thread, _socket, _connectionId, Log); _frame = new Frame(this); }
public void InitialEntriesCanBeCleared() { var frame = new Frame(new ConnectionContext { DateHeaderValueManager = new DateHeaderValueManager() }); Assert.True(frame.ResponseHeaders.Count > 0); frame.ResponseHeaders.Clear(); Assert.Equal(0, frame.ResponseHeaders.Count); Assert.False(frame.ResponseHeaders.ContainsKey("Server")); Assert.False(frame.ResponseHeaders.ContainsKey("Date")); }
private async Task App(Frame frame) { for (; ;) { var buffer = new byte[8192]; var count = await frame.RequestBody.ReadAsync(buffer, 0, buffer.Length); if (count == 0) { break; } await frame.ResponseBody.WriteAsync(buffer, 0, count); } }
public void Start() { Log.ConnectionStart(_connectionId); // Start socket prior to applying the ConnectionFilter _socket.ReadStart(_allocCallback, _readCallback, this); // Don't initialize _frame until SocketInput and SocketOutput are set to their final values. if (ConnectionFilter == null) { SocketInput = _rawSocketInput; SocketOutput = _rawSocketOutput; _frame = new Frame(this); _frame.Start(); } else { var libuvStream = new LibuvStream(_rawSocketInput, _rawSocketOutput); _filterContext = new ConnectionFilterContext { Connection = libuvStream, Address = ServerAddress }; ConnectionFilter.OnConnection(_filterContext).ContinueWith((task, state) => { var connection = (Connection)state; if (task.IsFaulted) { connection.Log.LogError("ConnectionFilter.OnConnection", task.Exception); ConnectionControl.End(ProduceEndType.SocketDisconnect); } else if (task.IsCanceled) { connection.Log.LogError("ConnectionFilter.OnConnection Canceled"); ConnectionControl.End(ProduceEndType.SocketDisconnect); } else { connection.ApplyConnectionFilter(); } }, this); } }
public void ResetResetsScheme() { // Arrange var connectionContext = new ConnectionContext() { DateHeaderValueManager = new DateHeaderValueManager(), ServerAddress = ServerAddress.FromUrl("http://localhost:5000") }; var frame = new Frame<object>(application: null, context: connectionContext); frame.Scheme = "https"; // Act frame.Reset(); // Assert Assert.Equal("http", ((IFeatureCollection)frame).Get<IHttpRequestFeature>().Scheme); }
public void InitialEntriesCanBeCleared() { var connectionContext = new ConnectionContext { DateHeaderValueManager = new DateHeaderValueManager(), ServerAddress = ServerAddress.FromUrl("http://localhost:5000") }; var frame = new Frame<object>(application: null, context: connectionContext); Assert.True(frame.ResponseHeaders.Count > 0); frame.ResponseHeaders.Clear(); Assert.Equal(0, frame.ResponseHeaders.Count); Assert.False(frame.ResponseHeaders.ContainsKey("Server")); Assert.False(frame.ResponseHeaders.ContainsKey("Date")); }
private async Task AppChunked(Frame frame) { var data = new MemoryStream(); for (; ;) { var buffer = new byte[8192]; var count = await frame.RequestBody.ReadAsync(buffer, 0, buffer.Length); if (count == 0) { break; } data.Write(buffer, 0, count); } var bytes = data.ToArray(); frame.ResponseHeaders["Content-Length"] = new[] { bytes.Length.ToString() }; await frame.ResponseBody.WriteAsync(bytes, 0, bytes.Length); }
public void InitialDictionaryContainsServerAndDate() { var frame = new Frame(new ConnectionContext { DateHeaderValueManager = new DateHeaderValueManager() }); IDictionary<string, StringValues> headers = frame.ResponseHeaders; Assert.Equal(2, headers.Count); StringValues serverHeader; Assert.True(headers.TryGetValue("Server", out serverHeader)); Assert.Equal(1, serverHeader.Count); Assert.Equal("Kestrel", serverHeader[0]); StringValues dateHeader; DateTime date; Assert.True(headers.TryGetValue("Date", out dateHeader)); Assert.Equal(1, dateHeader.Count); Assert.True(DateTime.TryParse(dateHeader[0], out date)); Assert.True(DateTime.Now - date <= TimeSpan.FromMinutes(1)); Assert.False(headers.IsReadOnly); }
void IConnectionControl.End(ProduceEndType endType) { switch (endType) { case ProduceEndType.SocketShutdownSend: KestrelTrace.Log.ConnectionWriteFin(_connectionId, 0); Thread.Post( x => { KestrelTrace.Log.ConnectionWriteFin(_connectionId, 1); var self = (Connection)x; var shutdown = new UvShutdownReq(); shutdown.Init(self.Thread.Loop); shutdown.Shutdown(self._socket, (req, status, state) => { KestrelTrace.Log.ConnectionWriteFin(_connectionId, 1); req.Dispose(); }, null); }, this); break; case ProduceEndType.ConnectionKeepAlive: KestrelTrace.Log.ConnectionKeepAlive(_connectionId); _frame = new Frame(this); Thread.Post( x => ((Frame)x).Consume(), _frame); break; case ProduceEndType.SocketDisconnect: KestrelTrace.Log.ConnectionDisconnect(_connectionId); Thread.Post( x => { KestrelTrace.Log.ConnectionStop(_connectionId); ((UvHandle)x).Dispose(); }, _socket); break; } }
private Task EmptyApp(Frame frame) { frame.ResponseHeaders.Clear(); return Task.FromResult<object>(null); }
public ServerRequest(Frame frame) { _frame = frame; _features = new FeatureCollection(); PopulateFeatures(); }
public void Start() { KestrelTrace.Log.ConnectionStart(_connectionId); SocketInput = new SocketInput(Memory); SocketOutput = new SocketOutput(Thread, _socket); _frame = new Frame(this); _socket.ReadStart(_allocCallback, _readCallback, this); }
public void Start() { Log.ConnectionStart(_connectionId); // Start socket prior to applying the ConnectionFilter _socket.ReadStart(_allocCallback, _readCallback, this); var tcpHandle = _socket as UvTcpHandle; if (tcpHandle != null) { _remoteEndPoint = tcpHandle.GetPeerIPEndPoint(); _localEndPoint = tcpHandle.GetSockIPEndPoint(); } // Don't initialize _frame until SocketInput and SocketOutput are set to their final values. if (ConnectionFilter == null) { SocketInput = _rawSocketInput; SocketOutput = _rawSocketOutput; _frame = CreateFrame(); _frame.Start(); } else { var libuvStream = new LibuvStream(_rawSocketInput, _rawSocketOutput); _filterContext = new ConnectionFilterContext { Connection = libuvStream, Address = ServerAddress }; try { ConnectionFilter.OnConnectionAsync(_filterContext).ContinueWith((task, state) => { var connection = (Connection)state; if (task.IsFaulted) { connection.Log.LogError("ConnectionFilter.OnConnection", task.Exception); connection.ConnectionControl.End(ProduceEndType.SocketDisconnect); } else if (task.IsCanceled) { connection.Log.LogError("ConnectionFilter.OnConnection Canceled"); connection.ConnectionControl.End(ProduceEndType.SocketDisconnect); } else { connection.ApplyConnectionFilter(); } }, this); } catch (Exception ex) { Log.LogError("ConnectionFilter.OnConnection", ex); ConnectionControl.End(ProduceEndType.SocketDisconnect); } } }
private void ApplyConnectionFilter() { var filteredStreamAdapter = new FilteredStreamAdapter(_filterContext.Connection, Memory2, Log, ThreadPool); SocketInput = filteredStreamAdapter.SocketInput; SocketOutput = filteredStreamAdapter.SocketOutput; _frame = CreateFrame(); _frame.Start(); }