Inheritance: FrameContext, IFrameControl
        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"));
        }
示例#5
0
 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"));
        }
示例#9
0
 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);
        }
示例#11
0
 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;
     }
 }
示例#12
0
 private Task EmptyApp(Frame frame)
 {
     frame.ResponseHeaders.Clear();
     return Task.FromResult<object>(null);
 }
 public ServerRequest(Frame frame)
 {
     _frame = frame;
     _features = new FeatureCollection();
     PopulateFeatures();
 }
示例#14
0
        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);
        }
示例#15
0
        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);
                }
            }
        }
示例#16
0
        private void ApplyConnectionFilter()
        {
            var filteredStreamAdapter = new FilteredStreamAdapter(_filterContext.Connection, Memory2, Log, ThreadPool);

            SocketInput = filteredStreamAdapter.SocketInput;
            SocketOutput = filteredStreamAdapter.SocketOutput;

            _frame = CreateFrame();
            _frame.Start();
        }