コード例 #1
0
ファイル: CookieParser.cs プロジェクト: sclcwwl/Gimela
    /// <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);
    }
コード例 #2
0
ファイル: UrlParser.cs プロジェクト: Kayomani/FAP
        /// <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;
        }
コード例 #3
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)
        {
            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));
        }
コード例 #4
0
        /// <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;
        }
コード例 #5
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)
        {
            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);
        }
コード例 #6
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)
        {
            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);
        }
コード例 #7
0
ファイル: UriParser.cs プロジェクト: jeoffman/SipSharp
        /// <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;
                }
            }
        }
コード例 #8
0
 /// <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()
     });
 }
コード例 #9
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));
        }
コード例 #10
0
ファイル: NumericHeaderParser.cs プロジェクト: sclcwwl/Gimela
 /// <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);
 }
コード例 #11
0
 /// <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};
 }
コード例 #12
0
 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;
 }
コード例 #13
0
ファイル: AuthorizationParser.cs プロジェクト: sclcwwl/Gimela
 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;
 }
コード例 #14
0
 /// <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);
 }
コード例 #15
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)
        {
            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));
        }
コード例 #16
0
        /// <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;
        }
コード例 #17
0
ファイル: ViaParser.cs プロジェクト: jgauffin/SipSharp
        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;
        }
コード例 #18
0
ファイル: MethodsParser.cs プロジェクト: jgauffin/SipSharp
        /// <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;
        }
コード例 #19
0
        /// <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);
        }
コード例 #20
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)
        {
            string value = reader.ReadToEnd();

            try
            {
                return new DateHeader(name, DateTime.Parse(value));
            }
            catch (FormatException err)
            {
                throw new FormatException("Failed to parse 'Date' header.", err);
            }
        }
コード例 #21
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="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);
        }
コード例 #22
0
ファイル: DateParser.cs プロジェクト: NyxStudios/HttpServer
        /// <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);
            }
        }
コード例 #23
0
ファイル: DateParser.cs プロジェクト: gmcclelland90/FAP
        /// <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);
            }
        }
コード例 #24
0
ファイル: DateParser.cs プロジェクト: RainsSoft/HttpWebServer
        /// <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);
            }
        }
コード例 #25
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)
        {
            string contentType = reader.ReadToEnd(';');

            // got parameters
            if (reader.Current == ';')
            {
                HeaderParameterCollection parameters = HeaderParameterCollection.Parse(reader);
                return new ContentTypeHeader(contentType, parameters);
            }

            return new ContentTypeHeader(contentType);
        }
コード例 #26
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)
        {
            string contentType = reader.ReadToEnd(';');

            // got parameters
            if (reader.Current == ';')
            {
                HeaderParameterCollection parameters = HeaderParameterCollection.Parse(reader);
                return(new ContentTypeHeader(contentType, parameters));
            }

            return(new ContentTypeHeader(contentType));
        }
コード例 #27
0
ファイル: MethodsParser.cs プロジェクト: jeoffman/SipSharp
        /// <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);
        }
コード例 #28
0
        /// <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
            });
        }
コード例 #29
0
        /// <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);
        }
コード例 #30
0
        /// <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);
        }
コード例 #31
0
ファイル: TagCloudRunner.cs プロジェクト: Rozentor/fp
        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);
            }
        }
コード例 #32
0
ファイル: StringParser.cs プロジェクト: sclcwwl/Gimela
 /// <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());
 }
コード例 #33
0
        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);
        }
コード例 #34
0
ファイル: UriParser.cs プロジェクト: jgauffin/SipSharp
        /// <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);
        }
コード例 #35
0
ファイル: UriParser.cs プロジェクト: jeoffman/SipSharp
        /// <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));
        }
コード例 #36
0
 /// <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);
 }
コード例 #37
0
ファイル: UriParser.cs プロジェクト: jeoffman/SipSharp
        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
            });
        }
コード例 #38
0
ファイル: StringParser.cs プロジェクト: wingcd/utnt
 /// <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()));
 }
コード例 #39
0
ファイル: UriParser.cs プロジェクト: jgauffin/SipSharp
        /// <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;
            }
        }
コード例 #40
0
 /// <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()};
 }
コード例 #41
0
ファイル: UriParser.cs プロジェクト: jgauffin/SipSharp
        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};
        }