Exemplo n.º 1
0
        public async Task TestSynchronousReadAsyncPushedBuffers(IEnumerable <byte[]> data)
        {
            var buffers        = data.Select(x => new ArraySegment <byte>(x, 6, x.Length - 12)).ToArray();
            var expectedResult = Merge(buffers);

            var stream   = new BufferQueueStream(null);
            var readTask = Task.Run(() => ReadSyncAndAssert(stream, expectedResult, 0));

            foreach (var buffer in buffers)
            {
                Assert.False(readTask.IsCompleted);
                await Task.Delay(WaitDelay);

                stream.PushBuffer(buffer);
            }

            await Task.Delay(WaitDelay);

            Assert.False(readTask.IsCompleted);
            stream.IsCompleted = true;

            await Task.Delay(WaitDelay);

            Assert.True(readTask.IsCompleted);
        }
Exemplo n.º 2
0
        private void ProcessRequest(BufferSegment buffer, bool isCompleted)
        {
            Logger.Debug("Request received (isCompleted = {isCompleted}), length = {length}",
                         isCompleted, buffer.Length);

            var headerLength = HttpFormatter.ParseRequest(buffer, out var request);

            Logger.Trace("Request: {@request}", request);

            var stream = new BufferQueueStream(_socket.BufferPool);

            request.Body = stream;

            stream.PushBuffer(new ArraySegment <byte>(buffer.Buffer, buffer.Offset + headerLength,
                                                      buffer.Length - headerLength));

            var requestId = int.Parse(request.Headers[MazeHeaders.MazeSocketRequestIdHeader]);
            var cancellationTokenSource = _cancellableRequests.GetOrAdd(requestId, i => new CancellationTokenSource());
            var token = cancellationTokenSource.Token;

            if (token.IsCancellationRequested)
            {
                cancellationTokenSource.Dispose();
                _cancellableRequests.TryRemove(requestId, out _);
                return;
            }

            if (isCompleted)
            {
                stream.IsCompleted = true;
            }
            else
            {
                if (_activeRequests.TryAdd(requestId, stream))
                {
                    Logger.Debug("Added request {requestId} to active requests", requestId);
                }
                else
                {
                    Logger.Error(
                        "Adding the request {requestId} to the active requests failed because it already exists.",
                        requestId);
                    throw new InvalidOperationException("The request already exists, duplicate request id deteceted.");
                }
            }

            var response = new DefaultMazeResponse(requestId);

            response.Headers.Add(MazeHeaders.MazeSocketRequestIdHeader, requestId.ToString());

            var rawStream = new HttpResponseStream(response, request, _socket, _packageBufferSize, _maxHeaderSize,
                                                   _bufferPool, token);

            response.HttpResponseStream = rawStream;
            response.Body = new BufferingWriteStream(rawStream, _packageBufferSize, _bufferPool);

            LogTaskError(Task.Run(() => RequestReceived?.Invoke(this, new MazeRequestReceivedEventArgs(request, response, token))));
        }
Exemplo n.º 3
0
        public async Task TestAsynchronousReadAllBuffersPushedAtBeginningWithSegmentation(IEnumerable <byte[]> data)
        {
            var buffers        = data.Select(x => new ArraySegment <byte>(x, 6, x.Length - 12)).ToArray();
            var expectedResult = Merge(buffers);

            var stream = new BufferQueueStream(null);

            foreach (var buffer in buffers)
            {
                stream.PushBuffer(buffer);
            }

            stream.IsCompleted = true;

            await ReadAsyncAndAssert(stream, expectedResult, 0);
        }
Exemplo n.º 4
0
        public void TestSynchronousReadAllBuffersPushedAtBeginningNoSegmentation(IEnumerable <byte[]> data)
        {
            var buffers        = data.Select(x => new ArraySegment <byte>(x)).ToArray();
            var expectedResult = Merge(buffers);

            var stream = new BufferQueueStream(null);

            foreach (var buffer in buffers)
            {
                stream.PushBuffer(buffer);
            }

            stream.IsCompleted = true;

            ReadSyncAndAssert(stream, expectedResult, 0);
        }
Exemplo n.º 5
0
        private void ProcessResponse(BufferSegment buffer, bool isCompleted)
        {
            Logger.LogDataPackage("Received Response", buffer.Buffer, buffer.Offset, buffer.Length);

            var headerLength  = HttpFormatter.ParseResponse(buffer, out var response, out var contentHeaders);
            var requestId     = int.Parse(response.Headers.GetValues(MazeHeaders.MazeSocketRequestIdHeader).Single());
            var bufferSegment =
                new ArraySegment <byte>(buffer.Buffer, buffer.Offset + headerLength, buffer.Length - headerLength);

            if (isCompleted)
            {
                response.Content = new RawStreamContent(new ArrayPoolMemoryStream(bufferSegment, _socket.BufferPool));
            }
            else
            {
                var stream = new BufferQueueStream(_socket.BufferPool);
                stream.PushBuffer(bufferSegment);
                if (_activeResponses.TryAdd(requestId, stream))
                {
                    Logger.Debug("Added response {requestId} to active responses", requestId);
                }
                else
                {
                    Logger.Error(
                        "Adding the response {requestId} to the active response failed because it already exists.",
                        requestId);
                    throw new InvalidOperationException("The response already exists, duplicate response id deteceted.");
                }

                response.Content = new RawStreamContent(stream);
            }

            foreach (var contentHeader in contentHeaders)
            {
                response.Content.Headers.Add(contentHeader.Key, (IEnumerable <string>)contentHeader.Value);
            }

            if (!_waitingRequests.TryRemove(requestId, out var taskCompletionSource))
            {
                Logger.Error("No TaskCompletionSource for request {requestId} found.", requestId);
                response.Dispose();
                return;
            }

            taskCompletionSource.SetResult(response);
        }