示例#1
0
        private async Task <bool> ConcatenateFragmentsIntoAsync(Stream dest)
        {
            while (true)
            {
                var frame = await WebSocketFrame.ReadAsync(_stream, true).ConfigureAwait(false);

                if (frame.IsFinal)
                {
                    /* FINAL */

                    // CONT
                    if (frame.IsContinuation)
                    {
                        dest.WriteBytes(frame.PayloadData.ApplicationData);
                        break;
                    }

                    // PING
                    if (frame.IsPing)
                    {
                        processPingFrame(frame);
                        continue;
                    }

                    // PONG
                    if (frame.IsPong)
                    {
                        processPongFrame(frame);
                        continue;
                    }

                    // CLOSE
                    if (frame.IsClose)
                    {
                        return(await ProcessCloseFrameAsync(frame).ConfigureAwait(false));
                    }
                }
                else
                {
                    /* MORE */

                    // CONT
                    if (frame.IsContinuation)
                    {
                        dest.WriteBytes(frame.PayloadData.ApplicationData);
                        continue;
                    }
                }

                // ?
                return(await ProcessUnsupportedFrameAsync(
                           frame,
                           CloseStatusCode.IncorrectData,
                           "An incorrect data has been received while receiving fragmented data.").ConfigureAwait(false));
            }

            return(true);
        }
示例#2
0
        private void startReceiving()
        {
            if (_messageEventQueue.Count > 0)
            {
                _messageEventQueue.Clear();
            }

            _exitReceiving = new AutoResetEvent(false);
            _receivePong   = new AutoResetEvent(false);

            Action receive = null;

            receive = async() => await WebSocketFrame.ReadAsync(
                _stream,
                true,
                async frame =>
            {
                if (await ProcessWebSocketFrameAsync(frame).ConfigureAwait(false) && _readyState != WebSocketState.Closed)
                {
                    receive();

                    if (!frame.IsData)
                    {
                        return;
                    }

                    await _forEvent.WaitAsync().ConfigureAwait(false);

                    try
                    {
                        var e = dequeueFromMessageEventQueue();
                        if (e != null && _readyState == WebSocketState.Open)
                        {
                            OnMessage.Emit(this, e);
                        }
                    }
                    catch (Exception ex)
                    {
                        await ProcessExceptionAsync(ex, "An exception has occurred while OnMessage.").ConfigureAwait(false);
                    }
                    finally
                    {
                        _forEvent.Release();
                    }
                }
                else if (_exitReceiving != null)
                {
                    _exitReceiving.Set();
                }
            },
                async ex => await ProcessExceptionAsync(ex, "An exception has occurred while receiving a message.")).ConfigureAwait(false);

            receive();
        }
示例#3
0
        private void startReceiving()
        {
            if (_messageEventQueue.Count > 0)
            {
                _messageEventQueue.Clear();
            }

            _exitReceiving = new AutoResetEvent(false);
            _receivePong   = new AutoResetEvent(false);

            Action receive = null;

            receive = () => WebSocketFrame.ReadAsync(
                _stream,
                true,
                frame =>
            {
                if (processWebSocketFrame(frame) && _readyState != WebSocketState.Closed)
                {
                    receive();

                    if (!frame.IsData)
                    {
                        return;
                    }

                    lock (_forEvent)
                    {
                        try
                        {
                            var e = dequeueFromMessageEventQueue();
                            if (e != null && _readyState == WebSocketState.Open)
                            {
                                OnMessage.Emit(this, e);
                            }
                        }
                        catch (Exception ex)
                        {
                            processException(ex, "An exception has occurred while OnMessage.");
                        }
                    }
                }
                else if (_exitReceiving != null)
                {
                    _exitReceiving.Set();
                }
            },
                ex => processException(ex, "An exception has occurred while receiving a message."));

            receive();
        }