示例#1
0
        public void Protocol_Should_Handle_StreamItemMessage_With_ProtobufObject_Item_And_No_Header(string data)
        {
            var logger       = NullLogger <ProtobufHubProtocol> .Instance;
            var binder       = new Mock <IInvocationBinder>();
            var protobufType = new List <Type> {
                typeof(TestMessage)
            };

            var protobufHubProtocol = new ProtobufHubProtocol(protobufType, logger);
            var writer = new ArrayBufferWriter <byte>();
            var item   = new TestMessage {
                Data = data
            };
            var streamItemMessage = new StreamItemMessage(INVOCATION_ID, item);

            protobufHubProtocol.WriteMessage(streamItemMessage, writer);
            var encodedMessage = new ReadOnlySequence <byte>(writer.WrittenSpan.ToArray());
            var result         = protobufHubProtocol.TryParseMessage(ref encodedMessage, binder.Object, out var resultStreamItemMessage);

            Assert.True(result);
            Assert.NotNull(resultStreamItemMessage);
            Assert.IsType <StreamItemMessage>(resultStreamItemMessage);
            Assert.Equal(INVOCATION_ID, ((StreamItemMessage)resultStreamItemMessage).InvocationId);
            Assert.Equal(item, ((StreamItemMessage)resultStreamItemMessage).Item);
        }
示例#2
0
        public void Protocol_Should_Handle_StreamItemMessage_With_Headers(params string[] kvp)
        {
            var logger       = NullLogger <ProtobufHubProtocol> .Instance;
            var binder       = new Mock <IInvocationBinder>();
            var protobufType = Array.Empty <Type>();

            var protobufHubProtocol = new ProtobufHubProtocol(protobufType, logger);
            var writer = new ArrayBufferWriter <byte>();

            var headers           = Helpers.GetHeaders(kvp);
            var streamItemMessage = new StreamItemMessage(INVOCATION_ID, "foo")
            {
                Headers = headers
            };

            protobufHubProtocol.WriteMessage(streamItemMessage, writer);
            var encodedMessage = new ReadOnlySequence <byte>(writer.WrittenSpan.ToArray());
            var result         = protobufHubProtocol.TryParseMessage(ref encodedMessage, binder.Object, out var resultStreamItemMessage);

            Assert.True(result);
            Assert.NotNull(resultStreamItemMessage);
            Assert.IsType <StreamItemMessage>(resultStreamItemMessage);
            Assert.Equal(INVOCATION_ID, ((StreamItemMessage)resultStreamItemMessage).InvocationId);
            Assert.Equal("foo", ((StreamItemMessage)resultStreamItemMessage).Item);

            var resultHeaders = ((StreamItemMessage)resultStreamItemMessage).Headers;

            Assert.NotEmpty(resultHeaders);
            Assert.Equal(resultHeaders.Count, headers.Count);
            Assert.Equal(headers, resultHeaders);
        }
示例#3
0
 private void WriteStreamingItemMessage(StreamItemMessage message, ref MessagePackWriter writer)
 {
     writer.WriteArrayHeader(4);
     writer.Write(HubProtocolConstants.StreamItemMessageType);
     PackHeaders(message.Headers, ref writer);
     writer.Write(message.InvocationId);
     WriteArgument(message.Item, ref writer);
 }
示例#4
0
 private void WriteStreamItemMessage(StreamItemMessage message, JsonTextWriter writer)
 {
     writer.WriteStartObject();
     WriteHubInvocationMessageCommon(message, writer, HubProtocolConstants.StreamItemMessageType);
     writer.WritePropertyName(ItemPropertyName);
     PayloadSerializer.Serialize(writer, message.Item);
     writer.WriteEndObject();
 }
示例#5
0
 private void WriteStreamingItemMessage(StreamItemMessage streamItemMessage, Packer packer)
 {
     packer.PackArrayHeader(4);
     packer.Pack(HubProtocolConstants.StreamItemMessageType);
     packer.PackString(streamItemMessage.InvocationId);
     packer.PackObject(streamItemMessage.Metadata, SerializationContext);
     packer.PackObject(streamItemMessage.Item, SerializationContext);
 }
示例#6
0
        private Task ProcessStreamItem(HubConnectionContext connection, StreamItemMessage message)
        {
            if (!connection.StreamTracker.TryProcessItem(message, out var processTask))
            {
                Log.UnexpectedStreamItem(_logger);
                return(Task.CompletedTask);
            }

            Log.ReceivedStreamItem(_logger, message);
            return(processTask);
        }
示例#7
0
        public bool TryProcessItem(StreamItemMessage message, [NotNullWhen(true)] out Task?task)
        {
            if (TryGetConverter(message.InvocationId !, out var converter))
            {
                task = converter.WriteToStream(message.Item);
                return(true);
            }

            task = default;
            return(false);
        }
示例#8
0
        // This async void is GROSS but we need to dispatch asynchronously because we're writing to a Channel
        // and there's nobody to actually wait for us to finish.
        private async void DispatchInvocationStreamItemAsync(StreamItemMessage streamItem, InvocationRequest irq)
        {
            _logger.ReceivedStreamItem(streamItem.InvocationId);

            if (irq.CancellationToken.IsCancellationRequested)
            {
                _logger.CancelingStreamItem(irq.InvocationId);
            }
            else if (!await irq.StreamItem(streamItem.Item))
            {
                _logger.ReceivedStreamItemAfterClose(irq.InvocationId);
            }
        }
示例#9
0
    private void WriteStreamItemMessage(StreamItemMessage message, Utf8JsonWriter writer)
    {
        WriteInvocationId(message, writer);

        writer.WritePropertyName(ItemPropertyNameBytes);
        if (message.Item == null)
        {
            writer.WriteNullValue();
        }
        else
        {
            JsonSerializer.Serialize(writer, message.Item, message.Item.GetType(), _payloadSerializerOptions);
        }
    }
示例#10
0
        public void Setup()
        {
            var logger = NullLogger <ProtobufHubProtocol> .Instance;
            var types  = new[] { typeof(BenchMessage) };

            _hubProtocol = new ProtobufHubProtocol(types, logger);

            var data = new BenchMessage
            {
                Email  = "*****@*****.**",
                Data   = new string('@', 512),
                Length = 256,
                Price  = 23451.5436d,
                Time   = new Google.Protobuf.WellKnownTypes.Timestamp()
                {
                    Seconds = DateTime.UtcNow.Second
                }
            };

            switch (InputArgument)
            {
            case MessageArgument.IntArguments:
                _streamItemMessage = new StreamItemMessage("123", int.MinValue);
                break;

            case MessageArgument.DoubleArguments:
                _streamItemMessage = new StreamItemMessage("123", double.MaxValue);
                break;

            case MessageArgument.StringArguments:
                _streamItemMessage = new StreamItemMessage("123", new string('#', 512));
                break;

            case MessageArgument.ProtobufArguments:
                _streamItemMessage = new StreamItemMessage("123", data);
                break;

            case MessageArgument.LargeArguments:
                data.Data          = new string('@', 10240);
                _streamItemMessage = new StreamItemMessage("123", data);
                break;
            }

            _serializedMessageRef = _hubProtocol.GetMessageBytes(_streamItemMessage);
        }
        private void WriteItemMessage(StreamItemMessage streamItemMessage, IBufferWriter <byte> output)
        {
            var protobufStreamItemMessage = new StreamItemMessageProtobuf
            {
                InvocationId = streamItemMessage.InvocationId
            };

            if (streamItemMessage.Headers != null)
            {
                protobufStreamItemMessage.Headers.Add(streamItemMessage.Headers);
            }

            var item = _argumentSerializer.SerializeArgument(streamItemMessage.Item);

            var packedMessage = MessageDescriptor.PackMessage(HubProtocolConstants.StreamItemMessageType, protobufStreamItemMessage.ToByteArray(), new List <ArgumentDescriptor> {
                item
            });

            output.Write(packedMessage);
        }
示例#12
0
        private HubMessage ParseMessage(string message)
        {
            ReceivedMessage receivedMessage;

            try
            {
                receivedMessage = JsonConvert.DeserializeObject <ReceivedMessage>(message, PayloadSerializerSettings);
                if (receivedMessage.Type == null ||
                    receivedMessage.Type < HubProtocolConstants.InvocationMessageType ||
                    receivedMessage.Type > HubProtocolConstants.CloseMessageType)
                {
                    throw new JsonSerializationException($"type:{receivedMessage.Type}");
                }
            }
            catch (JsonSerializationException)
            {
                Log.Debug("客户端与服务器的协议不一致");
                throw;
            }
            HubMessage hubMessage = null;

            switch (receivedMessage.Type)
            {
            case HubProtocolConstants.InvocationMessageType:
            {
                try
                {
                    InvocationMessage invocation = JsonConvert.DeserializeObject <InvocationMessage>(message, PayloadSerializerSettings);
                    hubMessage = invocation;
                }
                catch (JsonSerializationException)
                {
                    Log.Debug($"客户端与服务器的协议不一致。消息类型:{HubProtocolConstants.InvocationMessageType.ToString()}");
                    throw;
                }
            }
            break;

            case HubProtocolConstants.StreamItemMessageType:
            {
                try
                {
                    StreamItemMessage streamItem = JsonConvert.DeserializeObject <StreamItemMessage>(message, PayloadSerializerSettings);
                    hubMessage = streamItem;
                }
                catch (JsonSerializationException)
                {
                    Log.Debug($"客户端与服务器的协议不一致。消息类型:{HubProtocolConstants.StreamItemMessageType.ToString()}");
                    throw;
                }
            }
            break;

            case HubProtocolConstants.CompletionMessageType:
            {
                try
                {
                    CompletionMessage completion = JsonConvert.DeserializeObject <CompletionMessage>(message, PayloadSerializerSettings);
                    if (completion.Result != null)
                    {
                        completion.HasResult = true;
                    }
                    hubMessage = completion;
                }
                catch (JsonSerializationException)
                {
                    Log.Debug($"客户端与服务器的协议不一致。消息类型:{HubProtocolConstants.CompletionMessageType.ToString()}");
                    throw;
                }
            }
            break;

            case HubProtocolConstants.StreamInvocationMessageType:
            {
                try
                {
                    StreamInvocationMessage streamInvocation = JsonConvert.DeserializeObject <StreamInvocationMessage>(message, PayloadSerializerSettings);
                    hubMessage = streamInvocation;
                }
                catch (JsonSerializationException)
                {
                    Log.Debug($"客户端与服务器的协议不一致。消息类型:{HubProtocolConstants.StreamInvocationMessageType.ToString()}");
                    throw;
                }
            }
            break;

            case HubProtocolConstants.CancelInvocationMessageType:
            {
                try
                {
                    CancelInvocationMessage cancelInvocation = JsonConvert.DeserializeObject <CancelInvocationMessage>(message, PayloadSerializerSettings);
                    hubMessage = cancelInvocation;
                }
                catch (JsonSerializationException)
                {
                    Log.Debug($"客户端与服务器的协议不一致。消息类型:{HubProtocolConstants.CancelInvocationMessageType.ToString()}");
                    throw;
                }
            }
            break;

            case HubProtocolConstants.PingMessageType:
            {
                hubMessage = PingMessage.Instance;
            }
            break;

            case HubProtocolConstants.CloseMessageType:
            {
                try
                {
                    CloseMessage close = JsonConvert.DeserializeObject <CloseMessage>(message, PayloadSerializerSettings);
                    hubMessage = close;
                }
                catch (JsonSerializationException)
                {
                    Log.Debug($"客户端与服务器的协议不一致。消息类型:{HubProtocolConstants.CloseMessageType.ToString()}");
                    throw;
                }
            }
            break;

            default:
            {
                Log.Debug("客户端与服务器的协议不一致。未知的消息类型!");
            }
            break;
            }

            return(hubMessage);
        }
示例#13
0
 private bool StreamItemMessagesEqual(StreamItemMessage x, StreamItemMessage y)
 {
     return(SequenceEqual(x.Headers, y.Headers) &&
            string.Equals(x.InvocationId, y.InvocationId, StringComparison.Ordinal) &&
            (Equals(x.Item, y.Item) || SequenceEqual(x.Item, y.Item)));
 }
示例#14
0
 public Task ProcessItem(StreamItemMessage message)
 {
     return(TryGetConverter(message.InvocationId).WriteToStream(message.Item));
 }
示例#15
0
 private Task ProcessStreamItem(HubConnectionContext connection, StreamItemMessage message)
 {
     Log.ReceivedStreamItem(_logger, message);
     return(connection.StreamTracker.ProcessItem(message));
 }
 public static void ReceivedStreamItem(ILogger logger, StreamItemMessage message)
 {
     _receivedStreamItem(logger, message.InvocationId, null);
 }
示例#17
0
 public static void ReceivedStreamItem(ILogger logger, StreamItemMessage message)
 => ReceivedStreamItem(logger, message.InvocationId);
示例#18
0
 private void WriteStreamItemMessage(StreamItemMessage message, JsonTextWriter writer)
 {
     WriteInvocationId(message, writer);
     writer.WritePropertyName(ItemPropertyName);
     PayloadSerializer.Serialize(writer, message.Item);
 }