コード例 #1
0
ファイル: ClientMessageHandler.cs プロジェクト: ciker/twino
        /// <summary>
        /// Processes the client message which has single receiver (message by unique id)
        /// </summary>
        private async Task ProcessSingleReceiverClientMessage(MqClient client, TmqMessage message)
        {
            //find the receiver
            MqClient other = _server.FindClient(message.Target);

            if (other == null)
            {
                await client.SendAsync(MessageBuilder.ResponseStatus(message, KnownContentTypes.NotFound));

                return;
            }

            //check sending message authority
            if (_server.Authorization != null)
            {
                bool grant = await _server.Authorization.CanMessageToPeer(client, message, other);

                if (!grant)
                {
                    await client.SendAsync(MessageBuilder.ResponseStatus(message, KnownContentTypes.Unauthorized));

                    return;
                }
            }

            //send the message
            await other.SendAsync(message);
        }
コード例 #2
0
        public async Task Handle(MqClient client, TmqMessage message)
        {
            //priority has no role in ack message.
            //we are using priority for helping receiver type recognization for better performance
            if (message.HighPriority)
            {
                //target should be client
                MqClient target = _server.FindClient(message.Target);
                if (target != null)
                {
                    await target.SendAsync(message);

                    return;
                }
            }

            //find channel and queue
            Channel channel = _server.FindChannel(message.Target);

            if (channel == null)
            {
                //if high prio, dont try to find client again
                if (!message.HighPriority)
                {
                    //target should be client
                    MqClient target = _server.FindClient(message.Target);
                    if (target != null)
                    {
                        await target.SendAsync(message);
                    }
                }

                return;
            }

            ChannelQueue queue = channel.FindQueue(message.ContentType);

            if (queue == null)
            {
                return;
            }

            await queue.AcknowledgeDelivered(client, message);
        }
コード例 #3
0
        public async Task Handle(MqClient sender, TmqMessage message)
        {
            //server does not care response messages
            //if receiver could be found, message is sent to it's receiver
            //if receiver isn't available, response will be thrown

            MqClient receiver = _server.FindClient(message.Target);

            if (receiver != null)
            {
                await receiver.SendAsync(message);
            }
        }
コード例 #4
0
        /// <summary>
        /// Called when a new client is connected via TMQ protocol
        /// </summary>
        public async Task <TmqServerSocket> Connected(ITwinoServer server, IConnectionInfo connection, ConnectionData data)
        {
            string clientId;
            bool   found = data.Properties.TryGetValue(TmqHeaders.CLIENT_ID, out clientId);

            if (!found || string.IsNullOrEmpty(clientId))
            {
                clientId = _server.ClientIdGenerator.Create();
            }

            //if another client with same unique id is online, do not accept new client
            MqClient foundClient = _server.FindClient(clientId);

            if (foundClient != null)
            {
                await connection.Socket.SendAsync(await _writer.Create(MessageBuilder.Busy()));

                return(null);
            }

            //creates new mq client object
            MqClient client = new MqClient(_server, connection, _server.MessageIdGenerator, _server.Options.UseMessageId);

            client.Data     = data;
            client.UniqueId = clientId.Trim();
            client.Token    = data.Properties.GetStringValue(TmqHeaders.CLIENT_TOKEN);
            client.Name     = data.Properties.GetStringValue(TmqHeaders.CLIENT_NAME);
            client.Type     = data.Properties.GetStringValue(TmqHeaders.CLIENT_TYPE);

            //connecting client is a MQ server
            string serverValue = data.Properties.GetStringValue(TmqHeaders.TWINO_MQ_SERVER);

            if (!string.IsNullOrEmpty(serverValue) && (serverValue.Equals("1") || serverValue.Equals("true", StringComparison.InvariantCultureIgnoreCase)))
            {
                if (_server.ServerAuthenticator == null)
                {
                    return(null);
                }

                bool accepted = await _server.ServerAuthenticator.Authenticate(_server, client);

                if (!accepted)
                {
                    return(null);
                }

                client.IsInstanceServer = true;
                _server.SlaveInstances.Add(new SlaveInstance
                {
                    ConnectedDate = DateTime.UtcNow,
                    Client        = client,
                    RemoteHost    = client.Info.Client.Client.RemoteEndPoint.ToString().Split(':')[0]
                });

                await client.SendAsync(MessageBuilder.Accepted(client.UniqueId));
            }

            //connecting client is a producer/consumer client
            else
            {
                //authenticates client
                if (_server.Authenticator != null)
                {
                    client.IsAuthenticated = await _server.Authenticator.Authenticate(_server, client);

                    if (!client.IsAuthenticated)
                    {
                        await client.SendAsync(MessageBuilder.Unauthorized());

                        return(null);
                    }
                }

                //client authenticated, add it into the connected clients list
                _server.AddClient(client);

                //send response message to the client, client should check unique id,
                //if client's unique id isn't permitted, server will create new id for client and send it as response
                await client.SendAsync(MessageBuilder.Accepted(client.UniqueId));

                if (_server.ClientHandler != null)
                {
                    await _server.ClientHandler.Connected(_server, client);
                }
            }

            return(client);
        }
コード例 #5
0
        /// <summary>
        /// Called when a new client is connected via TMQ protocol
        /// </summary>
        public async Task <TmqServerSocket> Connected(ITwinoServer server, IConnectionInfo connection, ConnectionData data)
        {
            string clientId;
            bool   found = data.Properties.TryGetValue(TmqHeaders.CLIENT_ID, out clientId);

            if (!found || string.IsNullOrEmpty(clientId))
            {
                clientId = _server.ClientIdGenerator.Create();
            }

            //if another client with same unique id is online, do not accept new client
            MqClient foundClient = _server.FindClient(clientId);

            if (foundClient != null)
            {
                await connection.Socket.SendAsync(await _writer.Create(MessageBuilder.Busy()));

                return(null);
            }

            if (_server.Options.ClientLimit > 0 && _server.GetOnlineClients() >= _server.Options.ClientLimit)
            {
                return(null);
            }

            //creates new mq client object
            MqClient client = new MqClient(_server, connection, _server.MessageIdGenerator, _server.Options.UseMessageId);

            client.Data     = data;
            client.UniqueId = clientId.Trim();
            client.Token    = data.Properties.GetStringValue(TmqHeaders.CLIENT_TOKEN);
            client.Name     = data.Properties.GetStringValue(TmqHeaders.CLIENT_NAME);
            client.Type     = data.Properties.GetStringValue(TmqHeaders.CLIENT_TYPE);

            //authenticates client
            if (_server.Authenticator != null)
            {
                client.IsAuthenticated = await _server.Authenticator.Authenticate(_server, client);

                if (!client.IsAuthenticated)
                {
                    await client.SendAsync(MessageBuilder.Unauthorized());

                    return(null);
                }
            }

            //client authenticated, add it into the connected clients list
            _server.AddClient(client);

            //send response message to the client, client should check unique id,
            //if client's unique id isn't permitted, server will create new id for client and send it as response
            await client.SendAsync(MessageBuilder.Accepted(client.UniqueId));

            if (_server.ClientHandler != null)
            {
                await _server.ClientHandler.Connected(_server, client);
            }

            return(client);
        }