示例#1
0
文件: HmRpcClient.cs 项目: flwn/HmLib
        public async Task<Response> ExecuteRequest(Request request)
        {
            if (!_tcpClient.Connected)
            {
                throw new InvalidOperationException("Connect first.");
            }

            var converter = new MessageConverter();

            var requestBuffer = new MemoryStream();
            var streamWriter = new HmBinaryMessageWriter(requestBuffer);
            var requestReader = new MessageReader(request);
            converter.Convert(requestReader, streamWriter);


            var networkStream = _tcpClient.GetStream();
            requestBuffer.Position = 0;
            await requestBuffer.CopyToAsync(networkStream);

            await Task.Delay(100);

            //todo: implement buffered reader
            var streamReader = new HmBinaryMessageReader(networkStream);
            var responseBuilder = new MessageBuilder();

            converter.Convert(streamReader, responseBuilder);

            var response = (Response)responseBuilder.Result;

            return response;
        }
示例#2
0
        public Task HandleRequest(IRequestContext requestContext)
        {
            var converter = new MessageConverter();
            var messageBuilder = new MessageBuilder();
            converter.Convert(requestContext.Request, messageBuilder);

            var request = (Request)messageBuilder.Result;
            var response = HandleRequest(request);

            #if DEBUG
            System.Diagnostics.Debug.WriteLine(messageBuilder.Debug);
            Console.WriteLine(request);
            #endif

            var responseReader = new MessageReader(response);
            converter.Convert(responseReader, requestContext.Response);

            return Task.FromResult(0);
        }
示例#3
0
        private async void HandleMessage(RedisValue value)
        {
            try
            {
                Log.Debug("Handling Message " + value);
                string key           = "";
                var    messageObject = MessageConverter.Convert(value, out key);

                //get the type of the key
                var listenerType = (from l in Listeners where l.TypeKey.Equals(key, StringComparison.InvariantCultureIgnoreCase) select l).FirstOrDefault() as RedisListener;

                if (listenerType == null)
                {
                    //default functionality is to send to poison queue listener is not found
                    if (PoisonQueue != null)
                    {
                        Log.Warn("Listener type not found for message " + value);
                        SendToPoisonQueue(value);
                    }
                    else
                    {
                        throw new Exception("Listener for message not found");
                    }
                    return;
                }
                Log.Debug("Listener found for message " + value + " of type " + listenerType.TypeKey);
                await listenerType.InternalHandlerAsync(messageObject);
            }
            catch (Exception e)
            {
                Log.Error("Error handling message " + value.ToString(), e);
                HandleException(e, value);
            }
            finally
            {
                RemoveFromProcessingQueue(value);
            }
        }
        public void Convert_TemplateMessageWithButtonsTemplate_InstanceIsPreserved()
        {
            TemplateMessage message = new TemplateMessage()
            {
                AlternativeText = "Alternative",
                Template        = new ButtonsTemplate()
                {
                    ThumbnailUrl = new Uri("https://foo.bar"),
                    Title        = "ButtonsTitle",
                    Text         = "ButtonsText",
                    Actions      = new ITemplateAction[]
                    {
                        new PostbackAction()
                        {
                            Label = "PostbackLabel",
                            Text  = "PostbackText",
                            Data  = "PostbackData",
                        }
                    }
                }
            };

            ISendMessage[] messages = MessageConverter.Convert(new ISendMessage[] { message });

            Assert.AreEqual(1, messages.Length);

            ITemplateMessage templateMessage = messages[0] as ITemplateMessage;

            Assert.AreEqual(message, templateMessage);

            IButtonsTemplate buttonsTemplate = templateMessage.Template as IButtonsTemplate;

            Assert.AreEqual(message.Template, buttonsTemplate);

            ITemplateAction action = buttonsTemplate.Actions.First();

            Assert.AreEqual(action, ((ButtonsTemplate)message.Template).Actions.First());
        }
示例#5
0
        public void ShouldWriteRequestsCorrectly()
        {
            var testRequest = new Request()
            {
                Method     = "system.listMethods",
                Parameters = { "Bla" }
            };

            testRequest.SetAuthorization("wiki", "pedia");


            var output    = new MemoryStream();
            var converter = new MessageConverter();

            converter.Convert(new MessageReader(testRequest), new HmBinaryMessageWriter(output));

            var outputFormatted = BinaryUtils.FormatMemoryStream(output);

            var expected =
                "42696E400000002F000000010000000D417574686F72697A6174696F6E0000001642617369632064326C72615470775A57527059513D3D000000250000001273797374656D2E6C6973744D6574686F6473000000010000000300000003426C61";

            outputFormatted.ShouldBe(expected);
        }
示例#6
0
        public async Task <ActionResult <bool> > Send([FromBody] MessageDto message)
        {
            try
            {
                string id   = HttpContext.User.FindFirst(ClaimTypes.NameIdentifier).Value;
                User   user = await _context.Users.AsNoTracking().FirstOrDefaultAsync(x => x.Id == Guid.Parse(id));

                if (user == null)
                {
                    return(BadRequest());
                }
                message.UserId = Guid.Parse(id);
                var room = await _context.Rooms.AsNoTracking().Select(y => new
                {
                    Id      = y.Id,
                    UsersId = y.UserRoom.Select(z => z.UserId.ToString()).ToList()
                }).FirstOrDefaultAsync(x => x.Id == message.RoomId);

                if (room == null)
                {
                    return(BadRequest());
                }
                message.Date = DateTime.Now;
                await _hubContext.Clients.Users(room.UsersId.AsReadOnly()).SendAsync(
                    "Send", message);

                await _context.Messages.AddAsync(MessageConverter.Convert(message));

                await _context.SaveChangesAsync();

                return(true);
            }
            catch (Exception ex)
            {
                return(StatusCode(500, ex));
            }
        }
        public void Convert_TemplateMessageWithConfirmTemplate_InstanceIsPreserved()
        {
            TemplateMessage message = new TemplateMessage()
            {
                AlternativeText = "Alternative",
                Template        = new ConfirmTemplate()
                {
                    Text     = "ButtonsText",
                    OkAction = new MessageAction()
                    {
                        Label = "PostbackLabel",
                        Text  = "PostbackText"
                    },
                    CancelAction = new UriAction()
                    {
                        Label = "PostbackLabel",
                        Url   = new Uri("http://foo.bar")
                    }
                }
            };

            ISendMessage[] messages = MessageConverter.Convert(new ISendMessage[] { message });

            Assert.AreEqual(1, messages.Length);

            ITemplateMessage templateMessage = messages[0] as ITemplateMessage;

            Assert.AreEqual(message, templateMessage);

            IConfirmTemplate confirmTemplate = templateMessage.Template as IConfirmTemplate;

            Assert.AreEqual(message.Template, confirmTemplate);

            Assert.AreEqual(confirmTemplate.OkAction, ((ConfirmTemplate)message.Template).OkAction);
            Assert.AreEqual(confirmTemplate.CancelAction, ((ConfirmTemplate)message.Template).CancelAction);
        }
        public void Convert_TemplateMessageWithCarouselTemplateAndColumnActionsIsNull_ThrowsException()
        {
            TemplateMessage message = new TemplateMessage()
            {
                AlternativeText = "Alternative",
                Template        = new CarouselTemplate()
                {
                    Columns = new ICarouselColumn[]
                    {
                        new CarouselColumn()
                        {
                            ThumbnailUrl = new Uri("https://foo.bar"),
                            Title        = "CarouselTitle",
                            Text         = "CarouselText"
                        }
                    }
                }
            };

            ExceptionAssert.Throws <InvalidOperationException>("The actions cannot be null.", () =>
            {
                MessageConverter.Convert(new ISendMessage[] { message });
            });
        }
示例#9
0
        public async Task <List <MessageDto> > GetByItem(Guid id)
        {
            var messages = _context.Messages.AsNoTracking().ToList().FindAll(x => x.ItemId == id);

            return(MessageConverter.Convert(messages));
        }
示例#10
0
        public void StringResponsesAreWrittenCorrectly()
        {
            var input  = new MemoryStream();
            var writer = new HmBinaryMessageWriter(input);

            writer.BeginMessage(MessageType.Request);
            writer.BeginContent();
            writer.SetMethod("newDevices");
            writer.BeginArray(1);
            writer.BeginItem();

            //parameter 1
            writer.BeginArray(2);

            writer.BeginItem();
            writer.BeginStruct(2);
            writer.BeginItem();
            writer.WritePropertyName("CHILDREN");
            var items = 3;

            writer.BeginArray(items);
            for (; items > 0; items--)
            {
                writer.BeginItem();
                writer.WriteStringValue("value " + items);
                writer.EndItem();
            }
            writer.EndArray();
            writer.EndItem();
            writer.BeginItem();
            writer.WritePropertyName("FIRMWARE");
            writer.WriteStringValue("1.505");
            writer.EndItem();
            writer.EndStruct();
            writer.EndItem();

            writer.BeginItem();
            writer.BeginStruct(3);
            writer.BeginItem();
            writer.WritePropertyName("ADDRESS");
            writer.WriteStringValue("BidCoS-RF");
            writer.EndItem();
            writer.BeginItem();
            writer.WritePropertyName("CHILDREN");
            var items2 = 5;

            writer.BeginArray(items2);
            for (; items2 > 0; items2--)
            {
                writer.BeginItem();
                writer.WriteStringValue("value " + items2);
                writer.EndItem();
            }
            writer.EndArray();
            writer.EndItem();
            writer.BeginItem();
            writer.WritePropertyName("FIRMWARE");
            writer.WriteStringValue("1.505");
            writer.EndItem();
            writer.EndStruct();
            writer.EndItem();

            //end parameter 1
            writer.EndArray();
            writer.EndItem();

            //end params
            writer.EndArray();
            writer.EndContent();
            writer.EndMessage();
            var result = BinaryUtils.FormatMemoryStream(input);

            input.Seek(0, SeekOrigin.Begin);
            var converter    = new MessageConverter();
            var outputReader = new JsonMessageBuilder();

            converter.Convert(new HmBinaryMessageReader(input), outputReader);

            result.ShouldBe("42696E00000001180000000A6E6577446576696365730000000100000100000000020000010100000002000000084348494C4452454E0000010000000003000000030000000776616C75652033000000030000000776616C75652032000000030000000776616C75652031000000084649524D574152450000000300000005312E353035000001010000000300000007414444524553530000000300000009426964436F532D5246000000084348494C4452454E0000010000000005000000030000000776616C75652035000000030000000776616C75652034000000030000000776616C75652033000000030000000776616C75652032000000030000000776616C75652031000000084649524D574152450000000300000005312E353035");
        }