Beispiel #1
0
        protected override void Dispose(bool disposing)
        {
            if (UnderlyingHolder != null)
            {
                UnderlyingHolder.Dispose();
                UnderlyingHolder = null;
            }

            base.Dispose(disposing);
        }
Beispiel #2
0
        public static async Task <object> ReadFrameGroupLockAcquired(Synchronized <Stream> .LockHolder streamHolder, Func <ControlFrame, Task> controlFrameHandler, CancellationToken token, bool loop = true)
        {
            var stream        = streamHolder.LockedObject;
            var textFragments = new List <byte[]>(1);

            do
            {
                var header = await ReadFrameHeader(stream, token);

                switch (header.Opcode)
                {
                case FrameOpcode.Binary:
                    if (textFragments.Count > 0)
                    {
                        throw new InvalidDataException();
                    }
                    return(new WebSocketInputStream(header, streamHolder));

                case FrameOpcode.Continuation:
                // we don't have to expect that the client breaks the protocol
                // if this continues binary, we already returned the stream
                case FrameOpcode.Text:
                    var streamAfterMasking = header.IsMasked ? new MaskingStream(stream, header.MaskData) : stream;
                    var buffer             = await streamAfterMasking.ReadAllBytesAsync(header.PayloadLength, token);

                    textFragments.Add(buffer);
                    if (header.GroupIsComplete)
                    {
                        if (textFragments.Count == 1)
                        {
                            streamHolder.Dispose();
                            return(Encoding.UTF8.GetString(buffer));
                        }

                        var finalBuffer = new byte[textFragments.Sum(array => array.Length)];
                        int offset      = 0;
                        foreach (var part in textFragments)
                        {
                            Buffer.BlockCopy(part, 0, finalBuffer, offset, part.Length);
                            offset += part.Length;
                        }

                        streamHolder.Dispose();
                        return(Encoding.UTF8.GetString(finalBuffer));
                    }

                    break;

                case FrameOpcode.Ping:
                case FrameOpcode.Pong:
                case FrameOpcode.Close:
                    await HandleControlFrame(header, stream, controlFrameHandler, token);

                    if (header.Opcode == FrameOpcode.Close)
                    {
                        return(null);
                    }
                    break;

                default:
                    throw new InvalidDataException("unknown opcode");
                }
            } while (loop);
            streamHolder.Dispose();
            return(null);
        }