Ejemplo n.º 1
0
        public override async Task SendMessageAsync(Stream stream, Message message,
                                                    CancellationToken cancellationToken)
        {
            using (var memory = new MemoryStream())
                using (var writer = new BinaryWriter(memory, Encoding.UTF8))
                {
                    // TODO: Remove this magic in V2, only for handshake
                    writer.Write(_magic);
                    writer.Write((byte)message.Command);

                    if (message is ICarryPayload messageWithPayload)
                    {
                        message.Flags |= MessageFlags.WithPayload;
                        byte[] payloadBuffer = _serializer.Serialize(messageWithPayload.Payload);

                        if (payloadBuffer.Length > 100)
                        {
                            using (MemoryStream ms = new MemoryStream())
                            {
                                using (GZipStream gzip = new GZipStream(ms, CompressionLevel.Fastest, true))
                                    gzip.Write(payloadBuffer, 0, payloadBuffer.Length);

                                if (payloadBuffer.Length > ms.Length)
                                {
                                    payloadBuffer  = ms.ToArray();
                                    message.Flags |= MessageFlags.Compressed;
                                }
                            }
                        }

                        writer.Write((byte)message.Flags);
                        writer.Write((uint)payloadBuffer.Length);
                        writer.Write(payloadBuffer);
                    }
                    else
                    {
                        message.Flags &= ~MessageFlags.WithPayload;
                        writer.Write((byte)message.Flags);
                    }

                    writer.Flush();

                    var buffer = memory.ToArray();
                    await stream.WriteAsync(buffer, 0, buffer.Length, cancellationToken);
                }
        }
Ejemplo n.º 2
0
        public override async Task SendMessageAsync(Stream stream, Message message,
                                                    CancellationToken cancellationToken)
        {
            using (var memory = new MemoryStream())
                using (var writer = new BinaryWriter(memory, Encoding.UTF8))
                {
                    writer.Write(_magic);
                    writer.Write(Encoding.UTF8.GetBytes(message.Command.ToString().PadRight(12, ' ')));

                    var payloadBuffer = message is ICarryPayload messageWithPayload
                    ? _serializer.Serialize(messageWithPayload.Payload)
                    : new byte[0];

                    writer.Write(payloadBuffer.Length);
                    writer.Write(CalculateChecksum(payloadBuffer));
                    writer.Write(payloadBuffer);
                    writer.Flush();

                    var buffer = memory.ToArray();
                    await stream.WriteAsync(buffer, 0, buffer.Length, cancellationToken);
                }
        }