Пример #1
0
        private BlazeMessageData EncodeNotification(BlazeNotification notification)
        {
            _blazeTypeLookup.TryGetResponseComponentCommand(notification.GetType(), out var component, out var command);

            var header = new BlazeHeader
            {
                Component   = component,
                Command     = command,
                MessageId   = 0, //always 0
                MessageType = BlazeMessageType.Notification,
                ErrorCode   = notification.BlazeErrorCode
            };

            //TODO: remove stream
            var notificationOutput = new MemoryStream();

            _blazeSerializer.Serialize(notificationOutput, notification);
            var messageData = new BlazeMessageData
            {
                Header  = header,
                Payload = new ReadOnlySequence <byte>(notificationOutput.ToArray())
            };

            return(messageData);
        }
        public override async Task OnConnectedAsync(ConnectionContext connection)
        {
            Logger.Debug($"Redirecting to {_proxySettings.RedirectHost} {_proxySettings.RedirectIp}:{_proxySettings.LocalPort}");

            var blazeProtocol = new BlazeProxyProtocol();
            var localReader   = connection.CreateReader();
            var localWriter   = connection.CreateWriter();

            while (true)
            {
                try
                {
                    var result = await localReader.ReadAsync(blazeProtocol);

                    var message = result.Message;

                    if (message != null)
                    {
                        if (message.Header.Component == BlazeComponent.Redirector &&
                            message.Header.Command == (ushort)RedirectorCommand.ServerInfo)
                        {
                            var hostBytes = new List <byte>(Encoding.ASCII.GetBytes(_proxySettings.RedirectHost));
                            var payload   = new List <byte>();
                            payload.AddRange(new byte[] {
                                0x86, 0x49, 0x32, //ADDR
                                0xD0, 0x00,       //union(0)
                                0xDA, 0x1B, 0x35, //VALU
                                0x00,             //start struct
                                0xA2, 0xFC, 0xF4, //HOST
                            });
                            payload.AddRange(GetStringLengthBytes((uint)hostBytes.Count + 1));
                            payload.AddRange(hostBytes);
                            payload.AddRange(new byte[] {
                                0x00,             //endbyte for string
                                0xA7, 0x00, 0x00, //IP
                                0x74,             //uint32
                            });
                            var ipBytes = BitConverter.GetBytes(Convert.ToUInt32(IPAddress.Parse(_proxySettings.RedirectIp).Address));
                            Array.Reverse(ipBytes); //big endian
                            payload.AddRange(ipBytes);
                            payload.AddRange(new byte[] {
                                0xC2, 0xFC, 0xB4, //PORT
                                0x52,             //uint16
                            });
                            var portBytes = BitConverter.GetBytes(Convert.ToUInt16(_proxySettings.LocalPort));
                            Array.Reverse(portBytes); //big endian
                            payload.AddRange(portBytes);
                            payload.AddRange(new byte[] {
                                0x00,                   //end struct
                                0xCE, 0x58, 0xF5,       //SECU
                                0x21,                   //int8
                                0x00,                   //0
                                0xE2, 0x4B, 0xB3,       //XDNS
                                0x74,                   //uint32
                                0x00, 0x00, 0x00, 0x00, //0
                            });
                            var response = new BlazeMessageData
                            {
                                Header = new BlazeHeader
                                {
                                    Command     = message.Header.Command,
                                    Component   = message.Header.Component,
                                    MessageType = BlazeMessageType.Reply,
                                    MessageId   = message.Header.MessageId,
                                    ErrorCode   = 0
                                },
                                Payload = new ReadOnlySequence <byte>(payload.ToArray())
                            };
                            await localWriter.WriteAsync(blazeProtocol, response);
                        }
                    }

                    if (result.IsCompleted)
                    {
                        break;
                    }
                }
                finally
                {
                    localReader.Advance();
                }
            }
        }