public DeviceInformation Collect(Message message)
        {
            var device = new DeviceInformation();

            if (message.Headers.ContainsKey("USN"))
            {
                device.UniqueId = message.Headers["USN"];
            }

            if (message.Headers.ContainsKey("LOCATION"))
            {
                device.Location = message.Headers["LOCATION"];
                Regex regex = new Regex(@"((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)");
                if (regex.IsMatch(device.Location))
                {
                    var m = regex.Match(device.Location);
                    device.HostAddress = m.Groups[0].Value;
                }

                HandleLocation(device);
            }

            if (message.Headers.ContainsKey("SERVER"))
            {
                device.PlatformName = message.Headers["SERVER"];
            }

            return device;
        }
        public Message Parse(string rawMessage)
        {
            Message message = new Message();
            using (var reader = new StringReader(rawMessage))
            {
                var line = reader.ReadLine();
                var lineIdx = 0;
                while (line != null)
                {
                    if (lineIdx == 0)
                    {
                        // request line %METHOD% %URI% HTTP/1.1\r\n
                        message.MessageLine = line;
                    }
                    else
                    {
                        // headers %KEY%:%VALUE%
                        var header = ParseHeader(line);
                        if (header.Key != string.Empty)
                        {
                            message.Headers.Add(header.Key.ToUpper(), header.Value);
                        }
                    }

                    lineIdx++;
                    line = reader.ReadLine();
                }
            }

            return message;
        }