[system.net.http] Add special handling for chunked transfer-encoding httpwebrequest...
authorMarek Safar <marek.safar@gmail.com>
Wed, 5 Aug 2015 08:10:53 +0000 (10:10 +0200)
committerMarek Safar <marek.safar@gmail.com>
Wed, 5 Aug 2015 08:10:53 +0000 (10:10 +0200)
mcs/class/System.Net.Http/System.Net.Http.Headers/HttpHeaders.cs
mcs/class/System.Net.Http/System.Net.Http/HttpClientHandler.cs
mcs/class/System.Net.Http/Test/System.Net.Http/HttpClientTest.cs

index abb05921042ee5a72d4f5c36457a64208cde3aa2..05b5fe62681f3f981b067777d1cb7a7f9f32a03b 100644 (file)
@@ -363,6 +363,10 @@ namespace System.Net.Http.Headers
                                first = false;
                        }
 
+                       // Return null for empty values list
+                       if (first)
+                               return null;
+
                        return sb.ToString ();
                }
 
index ccf9a808c25b9e005b32d1d846c0efa98ef9f8ca..087e62474d2f986c1b84228fb3a2e30201e4d952 100644 (file)
@@ -30,6 +30,7 @@ using System.Threading;
 using System.Threading.Tasks;
 using System.Collections.Specialized;
 using System.Net.Http.Headers;
+using System.Linq;
 
 namespace System.Net.Http
 {
@@ -274,7 +275,18 @@ namespace System.Net.Http
                        // Add request headers
                        var headers = wr.Headers;
                        foreach (var header in request.Headers) {
-                               headers.AddValue (header.Key, HttpRequestHeaders.GetSingleHeaderString (header.Key, header.Value));
+                               var values = header.Value;
+                               if (header.Key == "Transfer-Encoding") {
+                                       // Chunked Transfer-Encoding is never set for HttpWebRequest. It's detected
+                                       // from ContentLength by HttpWebRequest
+                                       values = values.Where (l => l != "chunked");
+                               }
+
+                               var values_formated = HttpRequestHeaders.GetSingleHeaderString (header.Key, values);
+                               if (values_formated == null)
+                                       continue;
+
+                               headers.AddValue (header.Key, values_formated);
                        }
                        
                        return wr;
index a6c69de2bb99e96640a181ab26b8ddef1712a130..ec049a932105ea973be9d262937694c89f83348e 100644 (file)
@@ -606,6 +606,62 @@ namespace MonoTests.System.Net.Http
                        }
                }
 
+               [Test]
+               public void Send_Transfer_Encoding_Chunked ()
+               {
+                       bool? failed = null;
+
+                       var listener = CreateListener (l => {
+                               var request = l.Request;
+
+                               try {
+                                       Assert.AreEqual (1, request.Headers.Count, "#1");
+                                       failed = false;
+                               } catch {
+                                       failed = true;
+                               }
+                       });
+
+                       try {
+                               var client = new HttpClient ();
+                               client.DefaultRequestHeaders.TransferEncodingChunked = true;
+
+                               client.GetAsync (LocalServer).Wait ();
+
+                               Assert.AreEqual (false, failed, "#102");
+                       } finally {
+                               listener.Abort ();
+                               listener.Close ();
+                       }
+               }
+
+               [Test]
+               public void Send_Transfer_Encoding_Custom ()
+               {
+                       bool? failed = null;
+
+                       var listener = CreateListener (l => {
+                               failed = true;
+                       });
+
+                       try {
+                               var client = new HttpClient ();
+                               client.DefaultRequestHeaders.TransferEncoding.Add (new TransferCodingHeaderValue ("chunked2"));
+
+                               var request = new HttpRequestMessage (HttpMethod.Get, LocalServer);
+
+                               try {
+                                       client.SendAsync (request, HttpCompletionOption.ResponseHeadersRead).Wait ();
+                                       Assert.Fail ("#1");
+                               } catch (AggregateException e) {
+                                       Assert.AreEqual (typeof (ProtocolViolationException), e.InnerException.GetType (), "#2");
+                               }
+                               Assert.IsNull (failed, "#102");
+                       } finally {
+                               listener.Abort ();
+                               listener.Close ();
+                       }
+               }
 
                [Test]
                public void Send_Complete_Content ()