/// <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 query string /// </summary> /// <param name="reader">string to parse</param> /// <returns>A collection</returns> /// <exception cref="ArgumentNullException"><c>reader</c> is <c>null</c>.</exception> public static ParameterCollection Parse(ITextReader reader) { if (reader == null) throw new ArgumentNullException("reader"); var parameters = new ParameterCollection(); while (!reader.EOF) { string name = HttpUtility.UrlDecode(reader.ReadToEnd("&=")); char current = reader.Current; reader.Consume(); switch (current) { case '&': parameters.Add(name, string.Empty); break; case '=': { string value = reader.ReadToEnd("&"); reader.Consume(); parameters.Add(name, HttpUtility.UrlDecode(value)); } break; default: parameters.Add(name, string.Empty); break; } } return parameters; }
/// <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) { string typeStr = reader.ReadToEnd(",;"); if (reader.Current == ',') // to get rid of the TE header. { reader.ReadToEnd(';'); } ConnectionType type; try { type = (ConnectionType)Enum.Parse(typeof(ConnectionType), typeStr.Replace("-", string.Empty), true); } catch (ArgumentException err) { throw new FormatException("Unknown connection type '" + typeStr + "'.", err); } // got parameters if (reader.Current == ';') { HeaderParameterCollection parameters = HeaderParameterCollection.Parse(reader); return(new ConnectionHeader(type, parameters)); } return(new ConnectionHeader(type)); }
/// <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) { string typeStr = reader.ReadToEnd(",;"); if (reader.Current == ',') // to get rid of the TE header. reader.ReadToEnd(';'); ConnectionType type; try { type = (ConnectionType) Enum.Parse(typeof (ConnectionType), typeStr.Replace("-", string.Empty), true); } catch (ArgumentException err) { throw new FormatException("Unknown connection type '" + typeStr + "'.", err); } // got parameters if (reader.Current == ';') { HeaderParameterCollection parameters = HeaderParameterCollection.Parse(reader); return new ConnectionHeader(type, parameters); } return new ConnectionHeader(type); }
/// <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) { string value = reader.ReadToEnd(",;"); if (reader.Current == ',') // to get rid of the TE header. reader.ReadToEnd(';'); ConnectionType type; if (string.Compare(value, "close", true) == 0) type = ConnectionType.Close; else if (value.StartsWith("keep-alive", StringComparison.CurrentCultureIgnoreCase)) type = ConnectionType.KeepAlive; else if (value.StartsWith("te", StringComparison.CurrentCultureIgnoreCase)) type = ConnectionType.TransferEncoding; else throw new FormatException("Unknown connection type '" + value + "'."); // got parameters if (reader.Current == ';') { HeaderParameterCollection parameters = HeaderParameterCollection.Parse(reader); return new ConnectionHeader(type, parameters); } return new ConnectionHeader(type); }
/// <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 a message value. /// </summary> /// <param name="name">Header name</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) { return(new StringHeader(name) { Value = reader.ReadToEnd() }); }
/// <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) { string temp = reader.ReadToEnd(); int value; if (!int.TryParse(temp, out value)) throw new FormatException("Header '" + name + "' do not contain a numerical value ('" + temp + "')."); return new NumericHeader(name, value); }
/// <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) { string temp = reader.ReadToEnd(); int value; if (!int.TryParse(temp, out value)) throw new ParseException("Failed to convert '" + temp + "' to int."); return new NumericHeader(name) {Value = value}; }
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> /// Create a <see cref="NumericHeader"/> 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 Create(string name, ITextReader reader) { if (reader == null) return null; string temp = reader.ReadToEnd(); int value; if (!int.TryParse(temp, out value)) throw new FormatException(string.Format("Header '{0}' do not contain a numerical value ('{1}').", name, temp, CultureInfo.CurrentCulture)); return new NumericHeader(name, value); }
/// <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) { string temp = reader.ReadToEnd(); int value; if (!int.TryParse(temp, out value)) { throw new FormatException("Header '" + name + "' do not contain a numerical value ('" + temp + "')."); } return(new NumericHeader(name, value)); }
/// <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) { string type = reader.ReadUntil("/"); reader.Consume('/'); string subType = reader.ReadToEnd(';'); reader.Consume(';', ' ', '\t'); var contentType = new ContentType {SubType = subType, Type = type}; UriParser.ParseParameters(contentType.Parameters, reader); return contentType; }
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> 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 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) { string value = reader.ReadToEnd(); try { return new DateHeader(name, DateTime.Parse(value)); } catch (FormatException err) { throw new FormatException("Failed to parse 'Date' header.", err); } }
/// <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 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) { string value = reader.ReadToEnd(); try { return new DateHeader(name, DateTime.Parse(value, CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal)); } catch (FormatException err) { throw new BadRequestException("'" + name + "' do not contain a valid date", err); } }
/// <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) { string value = reader.ReadToEnd(); try { return(new DateHeader(name, DateTime.Parse(value, CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal))); } catch (FormatException err) { throw new BadRequestException("'" + name + "' do not contain a valid date", err); } }
/// <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) { string value = reader.ReadToEnd(); try { return(new DateHeader(name, DateTime.Parse(value))); } catch (FormatException err) { throw new FormatException("Failed to parse 'Date' header.", err); } }
/// <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) { string contentType = reader.ReadToEnd(';'); // got parameters if (reader.Current == ';') { HeaderParameterCollection parameters = HeaderParameterCollection.Parse(reader); return new ContentTypeHeader(contentType, parameters); } return new ContentTypeHeader(contentType); }
/// <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) { string contentType = reader.ReadToEnd(';'); // got parameters if (reader.Current == ';') { HeaderParameterCollection parameters = HeaderParameterCollection.Parse(reader); return(new ContentTypeHeader(contentType, parameters)); } return(new ContentTypeHeader(contentType)); }
/// <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="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) { string temp = reader.ReadToEnd(); int value; if (!int.TryParse(temp, out value)) { throw new ParseException("Failed to convert '" + temp + "' to int."); } return(new NumericHeader(name) { Value = value }); }
/// <summary> /// Parse a query string /// </summary> /// <param name="reader">string to parse</param> /// <returns>A collection</returns> /// <exception cref="ArgumentNullException"><c>reader</c> is <c>null</c>.</exception> public static ParameterCollection Parse(ITextReader reader) { if (reader == null) { throw new ArgumentNullException("reader"); } var parameters = new ParameterCollection(); while (!reader.EOF) { string name = HttpUtility.UrlDecode(reader.ReadToEnd("&=")); char current = reader.Current; reader.Consume(); switch (current) { case '&': parameters.Add(name, string.Empty); break; case '=': { string value = reader.ReadToEnd("&"); reader.Consume(); parameters.Add(name, HttpUtility.UrlDecode(value)); } break; default: parameters.Add(name, string.Empty); break; } } return(parameters); }
/// <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) { string type = reader.ReadUntil("/"); reader.Consume('/'); string subType = reader.ReadToEnd(';'); reader.Consume(';', ' ', '\t'); var contentType = new ContentType { SubType = subType, Type = type }; UriParser.ParseParameters(contentType.Parameters, reader); return(contentType); }
public void Run() { var words = wordReader .ReadToEnd(pathToWords); var filteredWords = wordFilter .FilterWords(words); var tags = tagReader .ReadTags(filteredWords) .OrderByDescending(item => item.FontSize) .ToList(); using (var picture = visualizer.CreatePictureWithItems(tags)) { if (File.Exists(pathToPicture)) { File.Delete(pathToPicture); } picture.Save(pathToPicture, format); } }
/// <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) { return new StringHeader(name, reader.ReadToEnd()); }
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="reader">Reader containing the string that should be parsed.</param> /// <returns>Newly created header.</returns> /// <exception cref="ParseException">Header value is malformed.</exception> /// <example> /// sip:[email protected]:5060 /// [email protected]:5060 /// jonas:[email protected] /// sip:[email protected] /// mailto:[email protected] /// </example> public static SipUri Parse(ITextReader reader) { string first = reader.ReadUntil("@:"); string scheme = null; string userName; string password = null; string domain; int port = 0; bool containsAt = reader.Contains('@'); // scheme:domain:port // scheme:domain // domain:port if (reader.Current == ':' && !containsAt) { reader.Consume(); //scheme:domain:port or scheme:domain if (IsValidScheme(first)) { scheme = first; domain = reader.ReadToEnd(":"); if (reader.EOF) return new SipUri(scheme, domain, 0); //scheme:domain:port reader.Consume(':'); first = reader.ReadToEnd(); } else // domain:port or just domain { domain = first; first = reader.ReadToEnd(":"); } if (!int.TryParse(first, out port)) throw new ParseException("Port is not a number: " + first); return new SipUri(scheme, domain, port); } // Can either be "scheme:username" // or "username:password" // or "scheme:username:password" else if (reader.Current == ':') { reader.Consume(); // Check if we got another colon (scheme:username:password) string second = reader.ReadUntil(":@"); if (reader.Current == ':') { scheme = first; userName = second; reader.Consume(); password = reader.ReadUntil('@'); } // it's "scheme:username" or "username:password" else { //TODO: Create a ProtocolProvider singleton if (first == "tel" || first == "sip" || first == "sips" || first == "mailto") { scheme = first; userName = second; } else { userName = first; password = second; } } } // only username else userName = first; reader.Consume(); // eat delimiter. domain = reader.ReadToEnd(":;"); if (reader.Current == '\r' || userName == null) return null; // domain was not specified. // We got a port. if (reader.Current == ':') { reader.Consume(); string portStr = reader.ReadToEnd(';'); if (portStr != null) { if (!int.TryParse(portStr, out port)) return null; } } // parse parameters var values = new KeyValueCollection(); if (reader.Current == ';') ParseParameters(values, reader); return new SipUri(scheme, userName, password, domain, port, values); }
/// <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> /// sip:[email protected]:5060 /// [email protected]:5060 /// jonas:[email protected] /// sip:[email protected] /// mailto:[email protected] /// </example> public static SipUri Parse(ITextReader reader) { string first = reader.ReadUntil("@:"); string scheme = null; string userName; string password = null; string domain; int port = 0; bool containsAt = reader.Contains('@'); // scheme:domain:port // scheme:domain // domain:port if (reader.Current == ':' && !containsAt) { reader.Consume(); //scheme:domain:port or scheme:domain if (IsValidScheme(first)) { scheme = first; domain = reader.ReadToEnd(":"); if (reader.EOF) { return(new SipUri(scheme, domain, 0)); } //scheme:domain:port reader.Consume(':'); first = reader.ReadToEnd(); } else // domain:port or just domain { domain = first; first = reader.ReadToEnd(":"); } if (!int.TryParse(first, out port)) { throw new ParseException("Port is not a number: " + first); } return(new SipUri(scheme, domain, port)); } // Can either be "scheme:username" // or "username:password" // or "scheme:username:password" else if (reader.Current == ':') { reader.Consume(); // Check if we got another colon (scheme:username:password) string second = reader.ReadUntil(":@"); if (reader.Current == ':') { scheme = first; userName = second; reader.Consume(); password = reader.ReadUntil('@'); } // it's "scheme:username" or "username:password" else { //TODO: Create a ProtocolProvider singleton if (first == "tel" || first == "sip" || first == "sips" || first == "mailto") { scheme = first; userName = second; } else { userName = first; password = second; } } } // only username else { userName = first; } reader.Consume(); // eat delimiter. domain = reader.ReadToEnd(":;"); if (reader.Current == '\r' || userName == null) { return(null); // domain was not specified. } // We got a port. if (reader.Current == ':') { reader.Consume(); string portStr = reader.ReadToEnd(';'); if (portStr != null) { if (!int.TryParse(portStr, out port)) { return(null); } } } // parse parameters var values = new KeyValueCollection(); if (reader.Current == ';') { ParseParameters(values, reader); } return(new SipUri(scheme, userName, password, domain, port, values)); }
/// <summary> /// Create a <see cref="StringHeader"/> 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 value = reader.ReadToEnd(); return new StringHeader(name, value); }
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 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) { return(new StringHeader(name, reader.ReadToEnd())); }
/// <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 a message value. /// </summary> /// <param name="name">Header name</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) { return new StringHeader(name) {Value = reader.ReadToEnd()}; }
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}; }