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(); } } }