Browse Source

[system.net.http] Escape more RFC5987 characters. Fixes #24785

Marek Safar 11 years ago
parent
commit
21ac07aa0a

+ 5 - 0
mcs/class/System.Net.Http/System.Net.Http.Headers/ContentDispositionHeaderValue.cs

@@ -257,6 +257,11 @@ namespace System.Net.Http.Headers
 					continue;
 				}
 
+				if (!Lexer.IsValidCharacter (ch) || ch == '*' || ch == '?' || ch == '%') {
+					sb.Append (Uri.HexEscape (ch));
+					continue;
+				}
+
 				sb.Append (ch);
 			}
 

+ 6 - 1
mcs/class/System.Net.Http/System.Net.Http.Headers/Lexer.cs

@@ -193,13 +193,18 @@ namespace System.Net.Http.Headers
 			//
 			for (; i < input.Length; ++i) {
 				char s = input[i];
-				if (s > last_token_char || !token_chars[s])
+				if (!IsValidCharacter (s))
 					return false;
 			}
 
 			return i > 0;
 		}
 
+		public static bool IsValidCharacter (char input)
+		{
+			return input <= last_token_char && token_chars[input];
+		}
+
 		public void EatChar ()
 		{
 			++pos;

+ 4 - 1
mcs/class/System.Net.Http/Test/System.Net.Http.Headers/ContentDispositionHeaderValueTest.cs

@@ -237,8 +237,11 @@ namespace MonoTests.System.Net.Http.Headers
 			value.FileNameStar = "č";
 			Assert.AreEqual ("č", value.FileNameStar, "#11");
 			Assert.AreEqual (new NameValueHeaderValue ("filename*", "utf-8''%C4%8D"), value.Parameters.First (), "#12");
-		}
 
+			value.FileNameStar = "@x*\\%?.txt";
+			Assert.AreEqual ("@x*\\%?.txt", value.FileNameStar, "#21");
+			Assert.AreEqual (new NameValueHeaderValue ("filename*", "utf-8''%40x%2A%5C%25%3F.txt"), value.Parameters.First (), "#22");
+		}
 
 		[Test]
 		public void Properties_Name ()