Exemple #1
0
    private static async Task <byte[]> GetLengthBytes(BufferStreamAsyncDelegate sourceStreamReader, CancellationToken cancellationToken)
    {
        var lengthBytes     = new List <byte>();
        var firstLengthByte = await sourceStreamReader(1, cancellationToken);

        lengthBytes.AddRange(firstLengthByte);
        var lengthByteValue = firstLengthByte[0] & LengthBitMask;

        if (lengthByteValue <= 125)
        {
            return(lengthBytes.ToArray());
        }
        switch (lengthByteValue)
        {
        case 126:
        {
            var secondLengthBytes = await sourceStreamReader(2, cancellationToken);

            lengthBytes.AddRange(secondLengthBytes);
            return(lengthBytes.ToArray());
        }

        case 127:
        {
            var secondLengthBytes = await sourceStreamReader(8, cancellationToken);

            lengthBytes.AddRange(secondLengthBytes);
            return(lengthBytes.ToArray());
        }

        default:
            throw new Exception($"Unexpected first length byte value: {lengthByteValue}");
        }
    }
Exemple #2
0
    private static async Task ListenForMessages(BufferStreamAsyncDelegate sourceStreamReader,
                                                WriteStreamAsyncDelegate destinationStreamWriter,
                                                CancellationToken cancellationToken)
    {
        var messageBuilder = new List <byte>();
        var firstByte      = await sourceStreamReader(1, cancellationToken);

        messageBuilder.AddRange(firstByte);
        var lengthBytes = await GetLengthBytes(sourceStreamReader, cancellationToken);

        messageBuilder.AddRange(lengthBytes);
        var isMaskBitSet = (lengthBytes[0] & MaskBitMask) != 0;
        var length       = GetMessageLength(lengthBytes);

        if (isMaskBitSet)
        {
            var maskBytes = await sourceStreamReader(4, cancellationToken);

            messageBuilder.AddRange(maskBytes);
        }
        var messagePayloadBytes = await sourceStreamReader(length, cancellationToken);

        messageBuilder.AddRange(messagePayloadBytes);
        await destinationStreamWriter(messageBuilder.ToArray(), 0, messageBuilder.Count, cancellationToken);
    }