Browse Source

[system.net.http] Convert default request headers to string values using correct separator. Fixes #31336

Marek Safar 10 years ago
parent
commit
f8bfe04f86

+ 24 - 17
mcs/class/System.Net.Http/System.Net.Http.Headers/HttpHeaders.cs

@@ -343,29 +343,36 @@ namespace System.Net.Http.Headers
 			return true;
 		}
 
+		internal static string GetSingleHeaderString (string key, IEnumerable<string> values)
+		{
+			string separator = ",";
+			HeaderInfo headerInfo;
+			if (known_headers.TryGetValue (key, out headerInfo) && headerInfo.AllowsMany)
+				separator = headerInfo.Separator;
+
+			var sb = new StringBuilder ();
+			bool first = true;
+			foreach (var v in values) {
+				if (!first) {
+					sb.Append (separator);
+					if (separator != " ")
+						sb.Append (" ");
+				}
+
+				sb.Append (v);
+				first = false;
+			}
+
+			return sb.ToString ();
+		}
+
 		public override string ToString ()
 		{
 			var sb = new StringBuilder ();
 			foreach (var entry in this) {
 				sb.Append (entry.Key);
 				sb.Append (": ");
-
-				string separator = ",";
-				HeaderInfo headerInfo;
-				if (known_headers.TryGetValue (entry.Key, out headerInfo) && headerInfo.AllowsMany)
-					separator = headerInfo.Separator;
-
-				bool first = true;
-				foreach (var v in entry.Value) {
-					if (!first) {
-						sb.Append (separator);
-						sb.Append (" ");
-					}
-
-					sb.Append (v);
-					first = false;
-				}
-
+				sb.Append (GetSingleHeaderString (entry.Key, entry.Value));
 				sb.Append ("\r\n");
 			}
 

+ 1 - 3
mcs/class/System.Net.Http/System.Net.Http/HttpClientHandler.cs

@@ -274,9 +274,7 @@ namespace System.Net.Http
 			// Add request headers
 			var headers = wr.Headers;
 			foreach (var header in request.Headers) {
-				foreach (var value in header.Value) {
-					headers.AddValue (header.Key, value);
-				}
+				headers.AddValue (header.Key, HttpRequestHeaders.GetSingleHeaderString (header.Key, header.Value));
 			}
 			
 			return wr;

+ 35 - 0
mcs/class/System.Net.Http/Test/System.Net.Http/HttpClientTest.cs

@@ -572,6 +572,41 @@ namespace MonoTests.System.Net.Http
 			}
 		}
 
+		[Test]
+		public void Send_Complete_CustomHeaders_SpecialSeparators ()
+		{
+			bool? failed = null;
+
+			var listener = CreateListener (l => {
+				var request = l.Request;
+
+				try {
+					Assert.AreEqual ("MLK Android Phone 1.1.9", request.UserAgent, "#1");
+					failed = false;
+				} catch {
+					failed = true;
+				}
+			});
+
+			try {
+				var client = new HttpClient ();
+
+				client.DefaultRequestHeaders.Add("User-Agent", "MLK Android Phone 1.1.9");
+
+				var request = new HttpRequestMessage (HttpMethod.Get, LocalServer);
+
+				var response = client.SendAsync (request, HttpCompletionOption.ResponseHeadersRead).Result;
+
+				Assert.AreEqual ("", response.Content.ReadAsStringAsync ().Result, "#100");
+				Assert.AreEqual (HttpStatusCode.OK, response.StatusCode, "#101");
+				Assert.AreEqual (false, failed, "#102");
+			} finally {
+				listener.Abort ();
+				listener.Close ();
+			}
+		}
+
+
 		[Test]
 		public void Send_Complete_Content ()
 		{