diff options
Diffstat (limited to 'mcs/class/System.Net.Http/System.Net.Http.Headers/NameValueHeaderValue.cs')
-rw-r--r-- | mcs/class/System.Net.Http/System.Net.Http.Headers/NameValueHeaderValue.cs | 89 |
1 files changed, 43 insertions, 46 deletions
diff --git a/mcs/class/System.Net.Http/System.Net.Http.Headers/NameValueHeaderValue.cs b/mcs/class/System.Net.Http/System.Net.Http.Headers/NameValueHeaderValue.cs index 906ab3aa65..e3766a4eb1 100644 --- a/mcs/class/System.Net.Http/System.Net.Http.Headers/NameValueHeaderValue.cs +++ b/mcs/class/System.Net.Http/System.Net.Http.Headers/NameValueHeaderValue.cs @@ -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; } } |