Merge pull request #901 from Blewzman/FixAggregateExceptionGetBaseException
[mono.git] / mcs / class / System.Net.Http / System.Net.Http.Headers / NameValueWithParametersHeaderValue.cs
index d65c62293490be1fb3048684dec707786073af7c..3d328341845b0c96f805bea2eff1da724fa2858b 100644 (file)
@@ -27,7 +27,6 @@
 //
 
 using System.Collections.Generic;
-using System.Linq;
 
 namespace System.Net.Http.Headers
 {
@@ -54,6 +53,11 @@ namespace System.Net.Http.Headers
                        }
                }
 
+               private NameValueWithParametersHeaderValue ()
+                       : base ()
+               {
+               }
+
                public ICollection<NameValueHeaderValue> Parameters {
                        get {
                                return parameters ?? (parameters = new List<NameValueHeaderValue> ());
@@ -71,7 +75,7 @@ namespace System.Net.Http.Headers
                        if (source == null)
                                return false;
 
-                       return base.Equals (obj) && Enumerable.SequenceEqual (source.parameters, parameters);
+                       return base.Equals (obj) && source.parameters.SequenceEqual (parameters);
                }
 
                public override int GetHashCode ()
@@ -88,9 +92,63 @@ namespace System.Net.Http.Headers
                        throw new FormatException (input);
                }
 
+               public override string ToString ()
+               {
+                       if (parameters == null || parameters.Count == 0)
+                               return base.ToString ();
+
+                       return base.ToString () + CollectionExtensions.ToString (parameters);
+               }
+
                public static bool TryParse (string input, out NameValueWithParametersHeaderValue parsedValue)
                {
-                       throw new NotImplementedException ();
+                       var lexer = new Lexer (input);
+                       Token token;
+                       if (TryParseElement (lexer, out parsedValue, out token) && token == Token.Type.End)
+                               return true;
+
+                       parsedValue = null;
+                       return false;
+               }
+
+               internal static bool TryParse (string input, int minimalCount, out List<NameValueWithParametersHeaderValue> result)
+               {
+                       return CollectionParser.TryParse (input, minimalCount, TryParseElement, out result);
+               }
+
+               static bool TryParseElement (Lexer lexer, out NameValueWithParametersHeaderValue parsedValue, out Token t)
+               {
+                       parsedValue = null;
+
+                       t = lexer.Scan ();
+                       if (t != Token.Type.Token)
+                               return false;
+
+                       parsedValue = new NameValueWithParametersHeaderValue () {
+                               Name = lexer.GetStringValue (t),
+                       };
+
+                       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;
+                               }
+                       }
+
+                       if (t == Token.Type.SeparatorSemicolon) {
+                               List<NameValueHeaderValue> result;
+                               if (!TryParseParameters (lexer,  out result, out t))
+                                       return false;
+
+                               parsedValue.parameters = result;
+                       }
+
+                       return true;
                }
        }
 }