/// <summary> /// Parse a message value. /// </summary> /// <param name="name">Name of header being parsed.</param> /// <param name="reader">Reader containing the string that should be parsed.</param> /// <returns>Newly created header.</returns> /// <exception cref="ParseException">Header value is malformed.</exception> /// <example> /// Authorization: Digest username="******", /// realm="biloxi.com", /// nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093", /// uri="sip:[email protected]", /// qop=auth, /// nc=00000001, /// cnonce="0a4f113b", /// response="6629fae49393a05397450978507c4ef1", /// opaque="5ccc069c403ebaf9f0171e9517f40e41" /// </example> public IHeader Parse(string name, ITextReader reader) { reader.ConsumeWhiteSpaces(); string digest = reader.ReadWord().ToLower(); if (digest != "digest") throw new ParseException("Authorization header is not digest authentication"); reader.ConsumeWhiteSpaces(); var parameters = new KeyValueCollection(); UriParser.ParseParameters(parameters, reader, ','); var header = new Authorization(name) { UserName = parameters["username"], Realm = parameters["realm"], Nonce = parameters["nonce"], Qop = parameters["qop"], ClientNonce = parameters["cnonce"], Opaque = parameters["opaque"], Response = parameters["response"], Uri = UriParser.Parse(parameters["uri"]) }; try { header.NonceCounter = int.Parse(parameters["nc"]); } catch (Exception err) { throw new ParseException("Failed to parse 'nc' in Authorization header.", err); } return header; }
/// <summary> /// Parse parameters. /// </summary> /// <param name="reader">Parser containing buffer to parse.</param> /// <param name="delimiter">Parameter delimiter</param> /// <returns>A collection with all parameters (or just a empty collection).</returns> /// <exception cref="FormatException">Expected a value after equal sign.</exception> public static HeaderParameterCollection Parse(ITextReader reader, char delimiter) { if (reader.Current == delimiter) reader.Consume(); reader.ConsumeWhiteSpaces(); var collection = new HeaderParameterCollection(); string name = reader.ReadToEnd("=" + delimiter); while (name != string.Empty && !reader.EOF) { // got a parameter value if (reader.Current == '=') { reader.ConsumeWhiteSpaces('='); string value = reader.Current == '"' ? reader.ReadQuotedString() : reader.ReadToEnd(delimiter); reader.ConsumeWhiteSpaces(); if (value == string.Empty && reader.Current != delimiter) throw new FormatException("Expected a value after equal sign."); collection.Add(name, value); } else // got no value { collection.Add(name, string.Empty); } reader.ConsumeWhiteSpaces(delimiter); // consume delimiter and white spaces name = reader.ReadToEnd("=" + delimiter); } return collection; }
/// <summary> /// Parse a header /// </summary> /// <param name="name">Name of header.</param> /// <param name="reader">Reader containing value.</param> /// <returns>HTTP Header</returns> /// <exception cref="FormatException">Header value is not of the expected format.</exception> public IHeader Parse(string name, ITextReader reader) { //key: "value"; key: "value" var cookies = new RequestCookieCollection(); while (!reader.EOF) { // read name string cookieName = reader.ReadToEnd("=;"); // cookie with value? if (reader.Current == '=') { reader.Consume(); reader.ConsumeWhiteSpaces(); // is value quoted or not? string value = reader.Current == '"' ? reader.ReadQuotedString() : reader.ReadToEnd(";"); cookies.Add(new RequestCookie(cookieName, value)); } // consume whitespaces and cookie separator reader.ConsumeWhiteSpaces(';'); } return new CookieHeader(cookies); }
/// <summary> /// Parse a message value. /// </summary> /// <param name="name">Name of header being parsed.</param> /// <param name="reader">Reader containing the string that should be parsed.</param> /// <returns>Newly created header.</returns> /// <exception cref="ParseException">Header value is malformed.</exception> /// <example> /// Digest realm="atlanta.com", /// domain="sip:boxesbybob.com", qop="auth", /// nonce="f84f1cec41e6cbe5aea9c8e88d359", /// opaque="", stale=FALSE, algorithm=MD5 /// </example> public IHeader Parse(string name, ITextReader reader) { reader.ConsumeWhiteSpaces(); string digest = reader.ReadWord().ToLower(); if (digest != "digest") throw new ParseException("Authorization header is not digest authentication"); reader.ConsumeWhiteSpaces(); var parameters = new KeyValueCollection(); UriParser.ParseParameters(parameters, reader, ','); var header = new Authenticate(name) { Algortihm = parameters["algorithm"], Domain = UriParser.Parse(parameters["domain"]), Realm = parameters["realm"], Nonce = parameters["nonce"], Qop = parameters["qop"], Opaque = parameters["opaque"] }; try { header.Stale = bool.Parse(parameters["stale"]); } catch (Exception err) { throw new ParseException("Failed to parse 'stale' in WWW-Authenticate header.", err); } return header; }
/// <summary> /// Parse a header /// </summary> /// <param name="name">Name of header.</param> /// <param name="reader">Reader containing value.</param> /// <returns>HTTP Header</returns> /// <exception cref="FormatException">Header value is not of the expected format.</exception> public IHeader Parse(string name, ITextReader reader) { //key: "value"; key: "value" var cookies = new RequestCookieCollection(); while (!reader.EOF) { // read name string cookieName = reader.ReadToEnd("=;"); // cookie with value? if (reader.Current == '=') { reader.Consume(); reader.ConsumeWhiteSpaces(); // is value quoted or not? string value = reader.Current == '"' ? reader.ReadQuotedString() : reader.ReadToEnd(";"); cookies.Add(new RequestCookie(cookieName, value)); } //else // cookies.Add(new RequestCookie(cookieName, string.Empty)); // consume whitespaces and cookie separator reader.ConsumeWhiteSpaces(';'); } return(new CookieHeader(cookies)); }
public IHeader Parse(string name, ITextReader reader) { var header = new AuthorizationHeader(); reader.ConsumeWhiteSpaces(); header.Scheme = reader.ReadWord(); reader.ConsumeWhiteSpaces(); header.Data = reader.ReadToEnd(); return header; }
/// <summary> /// Parse a message value. /// </summary> /// <param name="name">Name of header being parsed.</param> /// <param name="reader">Reader containing the string that should be parsed.</param> /// <returns>Newly created header.</returns> /// <exception cref="ParseException">Header value is malformed.</exception> public IHeader Parse(string name, ITextReader reader) { reader.ConsumeWhiteSpaces(); string number = reader.ReadWord(); reader.ConsumeWhiteSpaces(); string method = reader.ReadWord(); int sequence; if (!int.TryParse(number, out sequence)) throw new ParseException("Sequence number in CSeq must only contain digits, invalid value: " + number); return new CSeq(sequence, method); }
/// <summary> /// Parse a message value. /// </summary> /// <param name="reader">Reader containing the string that should be parsed.</param> /// <returns>Newly created header.</returns> /// <exception cref="ParseException">Header value is malformed.</exception> /// <example> /// Contact: "Mr. Watson" <sip:[email protected]> /// ;q=0.7; expires=3600, /// "Mr. Watson" <mailto:[email protected]>;q=0.1 /// </example> public IHeader Parse(string name, ITextReader reader) { var contacts = new List <Contact>(); try { Contact item = UriParser.ParseContact(reader); contacts.Add(item); while (reader.Current == ',') { reader.ConsumeWhiteSpaces(','); if (!reader.EOF) { item = UriParser.ParseContact(reader); } contacts.Add(item); } } catch (FormatException err) { throw new ParseException("Failed to parse header '" + name + "'.", err); } return(new ContactHeader(name) { Contacts = contacts }); }
/// <summary> /// Parse a message value. /// </summary> /// <param name="name">Name of header being parsed.</param> /// <param name="reader">Reader containing the string that should be parsed.</param> /// <returns>Newly created header.</returns> /// <exception cref="ParseException">Header value is malformed.</exception> public IHeader Parse(string name, ITextReader reader) { ViaEntry entry = ParseEntry(reader); if (reader.Current != ',') { return new Via { entry } } ; var via = new Via { entry }; while (reader.Current == ',') { reader.ConsumeWhiteSpaces(','); entry = ParseEntry(reader); via.Add(entry); } return(via); } #endregion }
/// <summary> /// Parse a message value. /// </summary> /// <param name="name">Name of header being parsed.</param> /// <param name="reader">Reader containing the string that should be parsed.</param> /// <returns>Newly created header.</returns> /// <exception cref="ParseException">Header value is malformed.</exception> public IHeader Parse(string name, ITextReader reader) { var route = new Route(name); try { SipUri uri = UriParser.Parse(reader); route.Items.Add(new RouteEntry(name) { Uri = uri }); while (reader.Current == ',') { reader.ConsumeWhiteSpaces(','); if (!reader.EOF) { uri = UriParser.Parse(reader); } route.Items.Add(new RouteEntry(name) { Uri = uri }); } } catch (FormatException err) { throw new ParseException("Failed to parse header '" + name + "'.", err); } return(route); }
/// <summary> /// Parse a message value. /// </summary> /// <param name="name">Name of header being parsed.</param> /// <param name="reader">Reader containing the string that should be parsed.</param> /// <returns>Newly created header.</returns> /// <exception cref="ParseException">Header value is malformed.</exception> public IHeader Parse(string name, ITextReader reader) { reader.ConsumeWhiteSpaces(); string number = reader.ReadWord(); reader.ConsumeWhiteSpaces(); string method = reader.ReadWord(); int sequence; if (!int.TryParse(number, out sequence)) { throw new ParseException("Sequence number in CSeq must only contain digits, invalid value: " + number); } return(new CSeq(sequence, method)); }
/// <summary> /// Parse parameters. /// </summary> /// <param name="reader">Parser containing buffer to parse.</param> /// <param name="delimiter">Parameter delimiter</param> /// <returns>A collection with all parameters (or just a empty collection).</returns> /// <exception cref="FormatException">Expected a value after equal sign.</exception> public static HeaderParameterCollection Parse(ITextReader reader, char delimiter) { if (reader.Current == delimiter) { reader.Consume(); } reader.ConsumeWhiteSpaces(); var collection = new HeaderParameterCollection(); string name = reader.ReadToEnd("=" + delimiter); while (name != string.Empty && !reader.EOF) { // got a parameter value if (reader.Current == '=') { reader.ConsumeWhiteSpaces('='); string value = reader.Current == '"' ? reader.ReadQuotedString() : reader.ReadToEnd(delimiter); reader.ConsumeWhiteSpaces(); if (value == string.Empty && reader.Current != delimiter) { throw new FormatException("Expected a value after equal sign."); } collection.Add(name, value); } else // got no value { collection.Add(name, string.Empty); } reader.ConsumeWhiteSpaces(delimiter); // consume delimiter and white spaces name = reader.ReadToEnd("=" + delimiter); } return(collection); }
/// <summary> /// Parse a header /// </summary> /// <param name="name">Name of header.</param> /// <param name="reader">Reader containing value.</param> /// <returns>HTTP Header</returns> /// <exception cref="System.FormatException">Header value is not of the expected format.</exception> public IHeader Create(string name, ITextReader reader) { if (reader == null) return null; var cookies = new RequestCookieCollection(); while (!reader.Eof) { string cookieName = reader.ReadToEnd("=;"); if (reader.Current == '=') { reader.Consume(); reader.ConsumeWhiteSpaces(); string value = reader.Current == '"' ? reader.ReadQuotedString() : reader.ReadToEnd(";"); cookies.Add(cookieName, new RequestCookie(cookieName, value)); } reader.ConsumeWhiteSpaces(';'); } return new CookieHeader(cookies); }
/// <summary> /// Parse a message value. /// </summary> /// <param name="name">Name of header being parsed.</param> /// <param name="reader">Reader containing the string that should be parsed.</param> /// <returns>Newly created header.</returns> /// <exception cref="ParseException">Header value is malformed.</exception> /// <example> /// Authorization: Digest username="******", /// realm="biloxi.com", /// nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093", /// uri="sip:[email protected]", /// qop=auth, /// nc=00000001, /// cnonce="0a4f113b", /// response="6629fae49393a05397450978507c4ef1", /// opaque="5ccc069c403ebaf9f0171e9517f40e41" /// </example> public IHeader Parse(string name, ITextReader reader) { reader.ConsumeWhiteSpaces(); string digest = reader.ReadWord().ToLower(); if (digest != "digest") { throw new ParseException("Authorization header is not digest authentication"); } reader.ConsumeWhiteSpaces(); var parameters = new KeyValueCollection(); UriParser.ParseParameters(parameters, reader, ','); var header = new Authorization(name) { UserName = parameters["username"], Realm = parameters["realm"], Nonce = parameters["nonce"], Qop = parameters["qop"], ClientNonce = parameters["cnonce"], Opaque = parameters["opaque"], Response = parameters["response"], Uri = UriParser.Parse(parameters["uri"]) }; try { header.NonceCounter = int.Parse(parameters["nc"]); } catch (Exception err) { throw new ParseException("Failed to parse 'nc' in Authorization header.", err); } return(header); }
public static ViaEntry ParseEntry(ITextReader reader) { //SIP/2.0/UDP erlang.bell-telephone.com:5060;branch=z9hG4bK87asdks7 var entry = new ViaEntry(); // read SIP/ reader.ConsumeWhiteSpaces(); entry.Protocol = reader.ReadUntil("/ \t"); if (entry.Protocol == null) throw new FormatException("Expected Via header to start with 'SIP' or 'SIPS'."); reader.ConsumeWhiteSpaces('/'); // read 2.0/ entry.SipVersion = reader.ReadUntil("/ \t"); if (entry.SipVersion == null) throw new FormatException("Expected to find sip version in Via header."); reader.ConsumeWhiteSpaces('/'); // read UDP or TCP entry.Transport = reader.ReadWord(); if (entry.Transport == null) throw new FormatException("Expected to find transport protocol after sip version in Via header."); reader.ConsumeWhiteSpaces(); entry.Domain = reader.ReadUntil(";: \t"); if (entry.Domain == null) throw new FormatException("Failed to find domain in via header."); reader.ConsumeWhiteSpaces(); if (reader.Current == ':') { reader.Read(); reader.ConsumeWhiteSpaces(); string temp = reader.ReadToEnd("; \t"); reader.ConsumeWhiteSpaces(); int port; if (!int.TryParse(temp, out port)) throw new FormatException("Invalid port specified."); entry.Port = port; } UriParser.ParseParameters(entry.Parameters, reader); string rport = entry.Parameters["rport"]; if (!string.IsNullOrEmpty(rport)) //parameter can exist, but be empty. = rport requested. { int value; if (!int.TryParse(rport, out value)) throw new FormatException("RPORT is not a number."); entry.Rport = value; } return entry; }
/// <summary> /// Parse a message value. /// </summary> /// <param name="name">Name of header being parsed.</param> /// <param name="reader">Reader containing the string that should be parsed.</param> /// <returns>Newly created header.</returns> /// <exception cref="ParseException">Header value is malformed.</exception> /// <example> /// Digest realm="atlanta.com", /// domain="sip:boxesbybob.com", qop="auth", /// nonce="f84f1cec41e6cbe5aea9c8e88d359", /// opaque="", stale=FALSE, algorithm=MD5 /// </example> public IHeader Parse(string name, ITextReader reader) { reader.ConsumeWhiteSpaces(); string digest = reader.ReadWord().ToLower(); if (digest != "digest") { throw new ParseException("Authorization header is not digest authentication"); } reader.ConsumeWhiteSpaces(); var parameters = new KeyValueCollection(); UriParser.ParseParameters(parameters, reader, ','); var header = new Authenticate(name) { Algortihm = parameters["algorithm"], Domain = UriParser.Parse(parameters["domain"]), Realm = parameters["realm"], Nonce = parameters["nonce"], Qop = parameters["qop"], Opaque = parameters["opaque"] }; try { header.Stale = bool.Parse(parameters["stale"]); } catch (Exception err) { throw new ParseException("Failed to parse 'stale' in WWW-Authenticate header.", err); } return(header); }
/// <summary> /// Parse a message value. /// </summary> /// <param name="name">Name of header being parsed.</param> /// <param name="reader">Reader containing the string that should be parsed.</param> /// <returns>Newly created header.</returns> /// <exception cref="ParseException">Header value is malformed.</exception> public IHeader Parse(string name, ITextReader reader) { ViaEntry entry = ParseEntry(reader); if (reader.Current != ',') return new Via {entry}; var via = new Via {entry}; while (reader.Current == ',') { reader.ConsumeWhiteSpaces(','); entry = ParseEntry(reader); via.Add(entry); } return via; }
/// <summary> /// Parse a message value. /// </summary> /// <param name="name">Name of header being parsed.</param> /// <param name="reader">Reader containing the string that should be parsed.</param> /// <returns>Newly created header.</returns> /// <exception cref="ParseException">Header value is malformed.</exception> public IHeader Parse(string name, ITextReader reader) { var header = new MethodsHeader(name); string method = reader.ReadToEnd(','); do { header.Methods.Add(method.Trim()); if (reader.Current == ',') reader.Consume(); // eat the current comma reader.ConsumeWhiteSpaces(); // read next. method = reader.ReadToEnd(','); } while (!reader.EOF && reader.Current == ','); header.Methods.Add(method); return header; }
/// <summary> /// Parse a message value. /// </summary> /// <param name="reader">Reader containing the string that should be parsed.</param> /// <returns>Newly created header.</returns> /// <exception cref="ParseException">Header value is malformed.</exception> /// <example> /// Contact: "Mr. Watson" <sip:[email protected]> /// ;q=0.7; expires=3600, /// "Mr. Watson" <mailto:[email protected]>;q=0.1 /// </example> public IHeader Parse(string name, ITextReader reader) { var contacts = new List<Contact>(); try { Contact item = UriParser.ParseContact(reader); contacts.Add(item); while (reader.Current == ',') { reader.ConsumeWhiteSpaces(','); if (!reader.EOF) item = UriParser.ParseContact(reader); contacts.Add(item); } } catch (FormatException err) { throw new ParseException("Failed to parse header '" + name + "'.", err); } return new ContactHeader(name) {Contacts = contacts}; }
/// <summary> /// Parse a message value. /// </summary> /// <param name="name">Name of header being parsed.</param> /// <param name="reader">Reader containing the string that should be parsed.</param> /// <returns>Newly created header.</returns> /// <exception cref="ParseException">Header value is malformed.</exception> public IHeader Parse(string name, ITextReader reader) { var route = new Route(name); try { SipUri uri = UriParser.Parse(reader); route.Items.Add(new RouteEntry(name) {Uri = uri}); while (reader.Current == ',') { reader.ConsumeWhiteSpaces(','); if (!reader.EOF) uri = UriParser.Parse(reader); route.Items.Add(new RouteEntry(name) {Uri = uri}); } } catch (FormatException err) { throw new ParseException("Failed to parse header '" + name + "'.", err); } return route; }
/// <summary> /// Parse a message value. /// </summary> /// <param name="name">Name of header being parsed.</param> /// <param name="reader">Reader containing the string that should be parsed.</param> /// <returns>Newly created header.</returns> /// <exception cref="ParseException">Header value is malformed.</exception> public IHeader Parse(string name, ITextReader reader) { var header = new MethodsHeader(name); string method = reader.ReadToEnd(','); do { header.Methods.Add(method.Trim()); if (reader.Current == ',') { reader.Consume(); // eat the current comma } reader.ConsumeWhiteSpaces(); // read next. method = reader.ReadToEnd(','); } while (!reader.EOF && reader.Current == ','); header.Methods.Add(method); return(header); }
public static Contact ParseContact(ITextReader reader) { /* When the header field value contains a display name, the URI including all URI parameters is enclosed in "<" and ">". If no "<" and ">" are present, all parameters after the URI are header parameters, not URI parameters. The display name can be tokens, or a quoted string, if a larger character set is desired. */ reader.ConsumeWhiteSpaces(); string name; if (reader.Current == '\"') { name = reader.ReadQuotedString(); reader.Consume('\t', ' '); } else name = string.Empty; SipUri uri; bool isEnclosed = reader.Current == '<'; if (reader.Current != '<' && name != string.Empty) throw new FormatException("Expected to find '<' in contact."); reader.Consume(); string uriText = isEnclosed ? reader.ReadToEnd('>') : reader.ReadToEnd(';'); if (uriText == null) throw new FormatException("Failed to find '>' in contact."); try { uri = Parse(uriText); } catch (FormatException err) { throw new FormatException("Failed to parse uri in contact.", err); } reader.Consume('>', '\t', ' '); // Read parameters. var parameters = new KeyValueCollection(); ParseParameters(parameters, reader); return new Contact(parameters) {Name = name, Uri = uri}; }
public static ViaEntry ParseEntry(ITextReader reader) { //SIP/2.0/UDP erlang.bell-telephone.com:5060;branch=z9hG4bK87asdks7 var entry = new ViaEntry(); // read SIP/ reader.ConsumeWhiteSpaces(); entry.Protocol = reader.ReadUntil("/ \t"); if (entry.Protocol == null) { throw new FormatException("Expected Via header to start with 'SIP' or 'SIPS'."); } reader.ConsumeWhiteSpaces('/'); // read 2.0/ entry.SipVersion = reader.ReadUntil("/ \t"); if (entry.SipVersion == null) { throw new FormatException("Expected to find sip version in Via header."); } reader.ConsumeWhiteSpaces('/'); // read UDP or TCP entry.Transport = reader.ReadWord(); if (entry.Transport == null) { throw new FormatException("Expected to find transport protocol after sip version in Via header."); } reader.ConsumeWhiteSpaces(); entry.Domain = reader.ReadUntil(";: \t"); if (entry.Domain == null) { throw new FormatException("Failed to find domain in via header."); } reader.ConsumeWhiteSpaces(); if (reader.Current == ':') { reader.Read(); reader.ConsumeWhiteSpaces(); string temp = reader.ReadToEnd("; \t"); reader.ConsumeWhiteSpaces(); int port; if (!int.TryParse(temp, out port)) { throw new FormatException("Invalid port specified."); } entry.Port = port; } UriParser.ParseParameters(entry.Parameters, reader); string rport = entry.Parameters["rport"]; if (!string.IsNullOrEmpty(rport)) //parameter can exist, but be empty. = rport requested. { int value; if (!int.TryParse(rport, out value)) { throw new FormatException("RPORT is not a number."); } entry.Rport = value; } return(entry); }
public static Contact ParseContact(ITextReader reader) { /* * When the header field value contains a display name, the URI * including all URI parameters is enclosed in "<" and ">". If no "<" * and ">" are present, all parameters after the URI are header * parameters, not URI parameters. The display name can be tokens, or a * quoted string, if a larger character set is desired. */ reader.ConsumeWhiteSpaces(); string name; if (reader.Current == '\"') { name = reader.ReadQuotedString(); reader.Consume('\t', ' '); } else { name = string.Empty; } SipUri uri; bool isEnclosed = reader.Current == '<'; if (reader.Current != '<' && name != string.Empty) { throw new FormatException("Expected to find '<' in contact."); } reader.Consume(); string uriText = isEnclosed ? reader.ReadToEnd('>') : reader.ReadToEnd(';'); if (uriText == null) { throw new FormatException("Failed to find '>' in contact."); } try { uri = Parse(uriText); } catch (FormatException err) { throw new FormatException("Failed to parse uri in contact.", err); } reader.Consume('>', '\t', ' '); // Read parameters. var parameters = new KeyValueCollection(); ParseParameters(parameters, reader); return(new Contact(parameters) { Name = name, Uri = uri }); }