Browse Source

[system.net.http] Parsing of nested parens inside comment. Fixes #27036

Marek Safar 11 years ago
parent
commit
8157ba59ce

+ 10 - 0
mcs/class/System.Net.Http/System.Net.Http.Headers/Lexer.cs

@@ -232,10 +232,20 @@ namespace System.Net.Http.Headers
 				return false;
 			}
 
+			int parens = 1;
 			while (pos < s.Length) {
 				var ch = s[pos];
+				if (ch == '(') {
+					++parens;
+					++pos;
+					continue;
+				}
+
 				if (ch == ')') {
 					++pos;
+					if (--parens > 0)
+						continue;
+
 					var start = readToken.StartPosition;
 					value = s.Substring (start, pos - start);
 					return true;

+ 3 - 3
mcs/class/System.Net.Http/Test/System.Net.Http.Headers/ViaHeaderValueTest.cs

@@ -101,12 +101,12 @@ namespace MonoTests.System.Net.Http.Headers
 			Assert.AreEqual ("1.1", res.ProtocolVersion, "#3");
 			Assert.AreEqual ("1.1 nowhere.com", res.ToString (), "#4");
 
-			res = ViaHeaderValue.Parse ("foo / 1.1 nowhere.com:43   ( lalala ) ");
+			res = ViaHeaderValue.Parse ("foo / 1.1 nowhere.com:43   ( lal ( a ) la ) ");
 			Assert.AreEqual ("foo", res.ProtocolName, "#10");
 			Assert.AreEqual ("1.1", res.ProtocolVersion, "#11");
 			Assert.AreEqual ("nowhere.com:43", res.ReceivedBy, "#12");
-			Assert.AreEqual ("( lalala )", res.Comment, "#13");
-			Assert.AreEqual ("foo/1.1 nowhere.com:43 ( lalala )", res.ToString (), "#14");
+			Assert.AreEqual ("( lal ( a ) la )", res.Comment, "#13");
+			Assert.AreEqual ("foo/1.1 nowhere.com:43 ( lal ( a ) la )", res.ToString (), "#14");
 		}
 
 		[Test]