Forráskód Böngészése

[System.Net.Http] Incomplete byte ranges parsing. Fixes #18494

Marek Safar 11 éve
szülő
commit
29d1e82bef

+ 10 - 2
mcs/class/System.Net.Http/System.Net.Http.Headers/RangeHeaderValue.cs

@@ -145,10 +145,9 @@ namespace System.Net.Http.Headers
 					switch (values.Length) {
 					switch (values.Length) {
 					case 1:
 					case 1:
 						t = lexer.Scan ();
 						t = lexer.Scan ();
+						from = number;
 						switch (t.Kind) {
 						switch (t.Kind) {
 						case Token.Type.SeparatorDash:
 						case Token.Type.SeparatorDash:
-							from = number;
-
 							t = lexer.Scan ();
 							t = lexer.Scan ();
 							if (t != Token.Type.Token) {
 							if (t != Token.Type.Token) {
 								token_read = true;
 								token_read = true;
@@ -162,6 +161,15 @@ namespace System.Net.Http.Headers
 							if (to < from)
 							if (to < from)
 								return false;
 								return false;
 
 
+							break;
+						case Token.Type.End:
+							if (s.Length > 0 && s [s.Length - 1] != '-')
+								return false;
+
+							token_read = true;
+							break;
+						case Token.Type.SeparatorComma:
+							token_read = true;
 							break;
 							break;
 						default:
 						default:
 							return false;
 							return false;

+ 14 - 0
mcs/class/System.Net.Http/Test/System.Net.Http.Headers/RangeHeaderValueTest.cs

@@ -102,6 +102,20 @@ namespace MonoTests.System.Net.Http.Headers
 			Assert.AreEqual (2, res.Ranges.First ().From, "#31");
 			Assert.AreEqual (2, res.Ranges.First ().From, "#31");
 			Assert.IsNull (res.Ranges.First ().To, "#32");
 			Assert.IsNull (res.Ranges.First ().To, "#32");
 			Assert.AreEqual ("ddd=2-, 1-4", res.ToString (), "#33");
 			Assert.AreEqual ("ddd=2-, 1-4", res.ToString (), "#33");
+
+			res = RangeHeaderValue.Parse ("bytes=0-");
+			Assert.AreEqual ("bytes", res.Unit, "#40");
+			Assert.AreEqual (0, res.Ranges.First ().From, "#41");
+			Assert.IsNull (res.Ranges.First ().To, "#42");
+			Assert.AreEqual ("bytes=0-", res.ToString (), "#43");
+
+			res = RangeHeaderValue.Parse ("bytes=0-,-9");
+			Assert.AreEqual ("bytes", res.Unit, "#50");
+			Assert.AreEqual (0, res.Ranges.First ().From, "#51");
+			Assert.IsNull (res.Ranges.First ().To, "#52");
+			Assert.IsNull (res.Ranges.Skip (1).First ().From, "#53");
+			Assert.AreEqual (9, res.Ranges.Skip (1).First ().To, "#54");
+			Assert.AreEqual ("bytes=0-, -9", res.ToString (), "#55");
 		}
 		}
 
 
 		[Test]
 		[Test]