Exemple #1
0
        /// <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));
        }
Exemple #2
0
    /// <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;
        }
Exemple #4
0
        /// <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);
        }
Exemple #7
0
        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
            });
        }
Exemple #8
0
        /// <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;
            }
        }
Exemple #9
0
        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};
        }