Merge pull request #1685 from esdrubal/touint64
[mono.git] / mcs / class / System.Net.Http / System.Net.Http.Headers / NameValueHeaderValue.cs
index 906ab3aa657fac2845c31f92c377980b68d8299c..e3766a4eb154b6e6e3e3a900985f50974ccded22 100644 (file)
@@ -32,7 +32,7 @@ namespace System.Net.Http.Headers
 {
        public class NameValueHeaderValue : ICloneable
        {
-               string value;
+               internal string value;
 
                public NameValueHeaderValue (string name)
                        : this (name, null)
@@ -53,11 +53,11 @@ namespace System.Net.Http.Headers
                        this.value = source.value;
                }
 
-               private NameValueHeaderValue ()
+               internal NameValueHeaderValue ()
                {
                }
 
-               public string Name { get; private set; }
+               public string Name { get; internal set; }
 
                public string Value {
                        get {
@@ -121,27 +121,22 @@ namespace System.Net.Http.Headers
                        throw new FormatException (input);
                }
 
-               internal static bool TryParseParameters (Lexer lexer, out List<NameValueHeaderValue> result)
+               internal static bool TryParsePragma (string input, int minimalCount, out List<NameValueHeaderValue> result)
                {
-                       return TryParseCollection (lexer, out result, Token.Type.SeparatorSemicolon);
+                       return CollectionParser.TryParse (input, minimalCount, TryParseElement, out result);
                }
 
-               internal static bool TryParsePragma (string input, out List<NameValueHeaderValue> result)
-               {                       
-                       return TryParseCollection (new Lexer (input), out result, Token.Type.SeparatorComma);
-               }
-
-               static bool TryParseCollection (Lexer lexer, out List<NameValueHeaderValue> result, Token.Type separator)
+               internal static bool TryParseParameters (Lexer lexer, out List<NameValueHeaderValue> result, out Token t)
                {               
                        var list = new List<NameValueHeaderValue> ();
                        result = null;
 
-                       Token t;
-
-                       do {
+                       while (true) {
                                var attr = lexer.Scan ();
-                               if (attr != Token.Type.Token)
+                               if (attr != Token.Type.Token) {
+                                       t = Token.Empty;
                                        return false;
+                               }
 
                                string value = null;
 
@@ -156,19 +151,17 @@ namespace System.Net.Http.Headers
                                        t = lexer.Scan ();
                                }
 
-                               if (t == separator|| t == Token.Type.End) {
-                                       list.Add (new NameValueHeaderValue () {
-                                               Name = lexer.GetStringValue (attr),
-                                               value = value
-                                       });
-                               } else {
-                                       return false;
-                               }
+                               list.Add (new NameValueHeaderValue () {
+                                       Name = lexer.GetStringValue (attr),
+                                       value = value
+                               });
 
-                       } while (t == separator);
+                               if (t == Token.Type.SeparatorSemicolon)
+                                       continue;
 
-                       result = list;
-                       return true;
+                               result = list;
+                               return true;
+                       }
                }
 
                public override string ToString ()
@@ -181,35 +174,39 @@ namespace System.Net.Http.Headers
 
                public static bool TryParse (string input, out NameValueHeaderValue parsedValue)
                {
-                       parsedValue = null;
-
                        var lexer = new Lexer (input);
-                       var t = lexer.Scan ();
-                       if (t != Token.Type.Token && t != Token.Type.QuotedString)
-                               return false;
+                       Token token;
+                       if (TryParseElement (lexer, out parsedValue, out token) && token == Token.Type.End)
+                               return true;
 
-                       string v = null;
-                       var token2 = lexer.Scan ();
-                       if (token2 != Token.Type.End) {
-                               if (token2 != Token.Type.SeparatorEqual)
-                                       return false;
-
-                               token2 = lexer.Scan ();
+                       parsedValue = null;
+                       return false;
+               }
 
-                               if (token2 == Token.Type.Token || token2 == Token.Type.QuotedString) {
-                                       v = lexer.GetStringValue (token2);
-                                       token2 = lexer.Scan ();
-                               }
+               static bool TryParseElement (Lexer lexer, out NameValueHeaderValue parsedValue, out Token t)
+               {
+                       parsedValue = null;
 
-                               if (token2 != Token.Type.End)
-                                       return false;
-                       }
+                       t = lexer.Scan ();
+                       if (t != Token.Type.Token)
+                               return false;
 
                        parsedValue = new NameValueHeaderValue () {
                                Name = lexer.GetStringValue (t),
-                               value = v
                        };
 
+                       t = lexer.Scan ();
+                       if (t == Token.Type.SeparatorEqual) {
+                               t = lexer.Scan ();
+
+                               if (t == Token.Type.Token || t == Token.Type.QuotedString) {
+                                       parsedValue.value = lexer.GetStringValue (t);
+                                       t = lexer.Scan ();
+                               } else {
+                                       return false;
+                               }
+                       }
+
                        return true;
                }
        }