/// <summary> /// Parses the specified string into an header object. /// </summary> /// <param name="name">The header name.</param> /// <param name="value">The header value.</param> public void Parse(string name, string value) { string rest = ""; int index = 0; if (Address.Contains(name.ToLower())) { HeaderType = "address"; Address addr = new Address {MustQuote = true}; int count = addr.Parse(value); Value = addr; if (count < value.Length) rest = value.Substring(count, value.Length - count); if (rest.Length > 0) { foreach (string parm in rest.Split(';')) { if (parm.Contains('=')) { index = parm.IndexOf('='); string parmName = parm.Substring(0, index); string parmValue = parm.Substring(index + 1); Attributes.Add(parmName, parmValue); } } } } else if (!(Comma.Contains(name.ToLower())) && !(Unstructured.Contains(name.ToLower()))) { HeaderType = "standard"; if (!value.Contains(";lr>")) { if (value.Contains(';')) { index = value.IndexOf(';'); Value = value.Substring(0, index); string tempStr = value.Substring(index + 1).Trim(); foreach (string parm in tempStr.Split(';')) { if (parm.Contains('=')) { index = parm.IndexOf('='); string parmName = parm.Substring(0, index); string parmValue = parm.Substring(index + 1); Attributes.Add(parmName, parmValue); } } } else { Value = value; } } else { Value = value; } } if (Comma.Contains(name.ToLower())) { HeaderType = "comma"; if (value.Contains(' ')) { index = value.IndexOf(' '); AuthMethod = value.Substring(0, index).Trim(); Value = value.Substring(0, index).Trim(); string values = value.Substring(index + 1); foreach (string parm in values.Split(',')) { if (parm.Contains('=')) { index = parm.IndexOf('='); string parmName = parm.Substring(0, index); string parmValue = parm.Substring(index + 1); Attributes.Add(parmName, parmValue); } } } } else if (name.ToLower() == "cseq") { HeaderType = "unstructured"; string[] parts = value.Trim().Split(' '); int tempNumber = -1; int.TryParse(parts[0], out tempNumber); Number = tempNumber; Method = parts[1]; } if (Unstructured.Contains(name.ToLower()) && name.ToLower() != "cseq") { HeaderType = "unstructured"; Value = value; } if (name.ToLower() == "via") { string[] parts = value.Split(' '); string proto = parts[0]; string addr = parts[1].Split(';')[0]; string type = proto.Split('/')[2].ToLower(); ViaUri = new SIPURI("sip:" + addr + ";transport=" + type); if (ViaUri.Port == 0) { ViaUri.Port = 5060; } if (Attributes.Keys.Contains("rport")) { int tempPort = 5060; int.TryParse(Attributes["rport"], out tempPort); ViaUri.Port = tempPort; } if ((type != "tcp") && (type != "sctp") && (type != "tls")) { if (Attributes.Keys.Contains("maddr")) { ViaUri.Host = Attributes["maddr"]; } else if (Attributes.Keys.Contains("received")) { ViaUri.Host = Attributes["received"]; } } } }
/// <summary> /// Parses the specified string into an header object. /// </summary> /// <param name="name">The header name.</param> /// <param name="value">The header value.</param> public void Parse(string name, string value) { string rest = ""; int index = 0; if (Address.Contains(name.ToLower())) { HeaderType = "address"; Address addr = new Address { MustQuote = true }; int count = addr.Parse(value); Value = addr; if (count < value.Length) { rest = value.Substring(count, value.Length - count); } if (rest.Length > 0) { foreach (string parm in rest.Split(';')) { if (parm.Contains('=')) { index = parm.IndexOf('='); string parmName = parm.Substring(0, index); string parmValue = parm.Substring(index + 1); Attributes.Add(parmName, parmValue); } } } } else if (!(Comma.Contains(name.ToLower())) && !(Unstructured.Contains(name.ToLower()))) { HeaderType = "standard"; if (!value.Contains(";lr>")) { if (value.Contains(';')) { index = value.IndexOf(';'); Value = value.Substring(0, index); string tempStr = value.Substring(index + 1).Trim(); foreach (string parm in tempStr.Split(';')) { if (parm.Contains('=')) { index = parm.IndexOf('='); string parmName = parm.Substring(0, index); string parmValue = parm.Substring(index + 1); Attributes.Add(parmName, parmValue); } } } else { Value = value; } } else { Value = value; } } if (Comma.Contains(name.ToLower())) { HeaderType = "comma"; if (value.Contains(' ')) { index = value.IndexOf(' '); AuthMethod = value.Substring(0, index).Trim(); Value = value.Substring(0, index).Trim(); string values = value.Substring(index + 1); foreach (string parm in values.Split(',')) { if (parm.Contains('=')) { index = parm.IndexOf('='); string parmName = parm.Substring(0, index); string parmValue = parm.Substring(index + 1); Attributes.Add(parmName, parmValue); } } } } else if (name.ToLower() == "cseq") { HeaderType = "unstructured"; string[] parts = value.Trim().Split(' '); int tempNumber = -1; int.TryParse(parts[0], out tempNumber); Number = tempNumber; Method = parts[1]; } if (Unstructured.Contains(name.ToLower()) && name.ToLower() != "cseq") { HeaderType = "unstructured"; Value = value; } if (name.ToLower() == "via") { string[] parts = value.Split(' '); string proto = parts[0]; string addr = parts[1].Split(';')[0]; string type = proto.Split('/')[2].ToLower(); ViaUri = new SIPURI("sip:" + addr + ";transport=" + type); if (ViaUri.Port == 0) { ViaUri.Port = 5060; } if (Attributes.Keys.Contains("rport")) { int tempPort = 5060; int.TryParse(Attributes["rport"], out tempPort); ViaUri.Port = tempPort; } if ((type != "tcp") && (type != "sctp") && (type != "tls")) { if (Attributes.Keys.Contains("maddr")) { ViaUri.Host = Attributes["maddr"]; } else if (Attributes.Keys.Contains("received")) { ViaUri.Host = Attributes["received"]; } } } }