public async Task TransferZeroBytesDoesNotReleaseReadAsync()
        {
            var testInput = new TestInput();
            var context = new ConnectionContext();
            context.SocketInput = new SocketInput(new MemoryPool());

            var exchanger = new MessageBodyExchanger(testInput.FrameContext);

            var buffer1 = new byte[1024];
            var buffer2 = new byte[1024];
            var task1 = exchanger.ReadAsync(new ArraySegment<byte>(buffer1));
            var task2 = exchanger.ReadAsync(new ArraySegment<byte>(buffer2));

            Assert.False(task1.IsCompleted);
            Assert.False(task2.IsCompleted);

            testInput.Add("Hello");

            exchanger.Transfer(3, false);

            var count1 = await task1;

            Assert.True(task1.IsCompleted);
            Assert.False(task2.IsCompleted);
            AssertASCII("Hel", new ArraySegment<byte>(buffer1, 0, count1));

            exchanger.Transfer(0, false);

            Assert.True(task1.IsCompleted);
            Assert.False(task2.IsCompleted);
        }
예제 #2
0
 public Frame(ConnectionContext context) : base(context)
 {
     FrameControl = this;
     StatusCode = 200;
     RequestHeaders = new Dictionary<string, string[]>(StringComparer.OrdinalIgnoreCase);
     ResponseHeaders = new Dictionary<string, string[]>(StringComparer.OrdinalIgnoreCase);
 }
        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);
        }
예제 #4
0
 public Frame(ConnectionContext context) : base(context)
 {
     FrameControl = this;
     StatusCode = 200;
     RequestHeaders = _requestHeaders;
     ResponseHeaders = _responseHeaders;
 }
예제 #5
0
        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"));
        }
        public async Task TransferFinFirstDoesReturnsCompletedReadAsyncs()
        {

            var testInput = new TestInput();
            var context = new ConnectionContext();
            context.SocketInput = new SocketInput(new MemoryPool());

            var exchanger = new MessageBodyExchanger(testInput.FrameContext);

            testInput.Add("Hello");

            exchanger.Transfer(5, true);

            var buffer1 = new byte[1024];
            var buffer2 = new byte[1024];
            var task1 = exchanger.ReadAsync(new ArraySegment<byte>(buffer1));
            var task2 = exchanger.ReadAsync(new ArraySegment<byte>(buffer2));

            Assert.True(task1.IsCompleted);
            Assert.True(task2.IsCompleted);

            var count1 = await task1;
            var count2 = await task2;

            AssertASCII("Hello", new ArraySegment<byte>(buffer1, 0, count1));
            Assert.Equal(0, count2);
        }
예제 #8
0
 public Frame(ConnectionContext context) : base(context)
 {
     FrameControl = this;
     Reset();
 }
예제 #9
0
        public FrameContext(ConnectionContext context) : base(context)
        {

        }
예제 #10
0
 public ConnectionContext(ConnectionContext context)
     : base(context)
 {
     SocketInput = context.SocketInput;
     SocketOutput = context.SocketOutput;
     ConnectionControl = context.ConnectionControl;
 }
예제 #11
0
        public Frame(ConnectionContext context,
                     IPEndPoint remoteEndPoint,
                     IPEndPoint localEndPoint,
                     Action<IFeatureCollection> prepareRequest)
            : base(context)
        {
            _remoteEndPoint = remoteEndPoint;
            _localEndPoint = localEndPoint;
            _prepareRequest = prepareRequest;
            _pathBase = context.ServerAddress.PathBase;
            if (ReuseStreams)
            {
                _requestBody = new FrameRequestStream();
                _responseBody = new FrameResponseStream(this);
                _duplexStream = new FrameDuplexStream(_requestBody, _responseBody);
            }

            FrameControl = this;
            Reset();
        }
예제 #12
0
 public Frame(ConnectionContext context)
     : this(context, remoteEndPoint: null, localEndPoint: null, prepareRequest: null)
 {
 }