/// <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)); }
/// <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 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 all semicolon separated parameters. /// </summary> /// <param name="parameters">String containing all parameters to parse</param> /// <param name="delimiter">Delimiter separating parameters.</param> /// <example> /// <code> /// KeyValueCollection parameters = new KeyValueCollection(); /// UriParser.ParseParameters(parameters, "hej=hello,welcome=now", ','); /// </code> /// </example> /// <remarks> /// Parameter names are converted to lower case. /// </remarks> public static void ParseParameters(IKeyValueCollection <string, string> parameters, ITextReader reader, char delimiter) { reader.Consume(' ', '\t'); while (!reader.EOF) { if (reader.Current == delimiter) { reader.Consume(); } if (reader.EOF) { return; } reader.Consume(' ', '\t'); string name = reader.ReadToEnd("=" + delimiter); if (name == null) { break; } name = name.ToLower(); // No semicolon after last parameter. if (reader.EOF) { parameters.Add(name, string.Empty); return; } if (reader.Current == delimiter) { parameters.Add(name, string.Empty); continue; } reader.Consume(' ', '\t', '='); string value = reader.Current == '"' ? reader.ReadQuotedString() : reader.ReadToEnd(" \t" + delimiter); // no value if (value == null) { parameters.Add(name, string.Empty); continue; } parameters.Add(name, value); reader.Consume(' ', '\t'); if (reader.Current != delimiter) { break; } } }
/// <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); }
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 }); }
/// <summary> /// Parse all semicolon separated parameters. /// </summary> /// <param name="parameters">String containing all parameters to parse</param> /// <param name="delimiter">Delimiter separating parameters.</param> /// <example> /// <code> /// KeyValueCollection parameters = new KeyValueCollection(); /// UriParser.ParseParameters(parameters, "hej=hello,welcome=now", ','); /// </code> /// </example> /// <remarks> /// Parameter names are converted to lower case. /// </remarks> public static void ParseParameters(IKeyValueCollection<string, string> parameters, ITextReader reader, char delimiter) { reader.Consume(' ', '\t'); while (!reader.EOF) { if (reader.Current == delimiter) reader.Consume(); if (reader.EOF) return; reader.Consume(' ', '\t'); string name = reader.ReadToEnd("=" + delimiter); if (name == null) break; name = name.ToLower(); // No semicolon after last parameter. if (reader.EOF) { parameters.Add(name, string.Empty); return; } if (reader.Current == delimiter) { parameters.Add(name, string.Empty); continue; } reader.Consume(' ', '\t', '='); string value = reader.Current == '"' ? reader.ReadQuotedString() : reader.ReadToEnd(" \t" + delimiter); // no value if (value == null) { parameters.Add(name, string.Empty); continue; } parameters.Add(name, value); reader.Consume(' ', '\t'); if (reader.Current != delimiter) break; } }
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}; }