[system.net.http] Apply custom to string formating to parsed values. Fixes #30897
authorMarek Safar <marek.safar@gmail.com>
Mon, 8 Jun 2015 15:38:49 +0000 (17:38 +0200)
committerMarek Safar <marek.safar@gmail.com>
Mon, 8 Jun 2015 15:40:31 +0000 (17:40 +0200)
mcs/class/System.Net.Http/System.Net.Http.Headers/HeaderInfo.cs
mcs/class/System.Net.Http/System.Net.Http.Headers/HttpHeaders.cs
mcs/class/System.Net.Http/Test/System.Net.Http/MultipartContentTest.cs

index ceddbfa125028204793ef5eb2a614c2e9a6d50ba..9ca277dbbcd3ed5f92ef9a04e09fa3b6b5cade31 100644 (file)
@@ -134,9 +134,11 @@ namespace System.Net.Http.Headers
                        this.HeaderKind = headerKind;
                }
 
-               public static HeaderInfo CreateSingle<T> (string name, TryParseDelegate<T> parser, HttpHeaderKind headerKind)
+               public static HeaderInfo CreateSingle<T> (string name, TryParseDelegate<T> parser, HttpHeaderKind headerKind, Func<object, string> toString = null)
                {
-                       return new HeaderTypeInfo<T, object> (name, parser, headerKind);
+                       return new HeaderTypeInfo<T, object> (name, parser, headerKind) {
+                               CustomToString = toString
+                       };
                }
 
                //
@@ -152,6 +154,10 @@ namespace System.Net.Http.Headers
                        return CreateCollection (headers, this);
                }
 
+               public Func<object, string> CustomToString {
+                       get; private set;
+               }
+
                public virtual string Separator {
                        get {
                                // Needed for AllowsMany only
index 8fdb011cd51fa6833db66e62c5f45ad0a32afd63..9a7248582a1a0ff88cb46cc9df3410785acc4551 100644 (file)
@@ -48,7 +48,7 @@ namespace System.Net.Http.Headers
 
                        public readonly Func<object, string> CustomToString;
 
-                       public HeaderBucket (object parsed, Func<object, string> converter = null)
+                       public HeaderBucket (object parsed, Func<object, string> converter)
                        {
                                this.Parsed = parsed;
                                this.CustomToString = converter;
@@ -104,18 +104,18 @@ namespace System.Net.Http.Headers
                                HeaderInfo.CreateSingle<byte[]> ("Content-MD5", Parser.MD5.TryParse, HttpHeaderKind.Content),
                                HeaderInfo.CreateSingle<ContentRangeHeaderValue> ("Content-Range", ContentRangeHeaderValue.TryParse, HttpHeaderKind.Content),
                                HeaderInfo.CreateSingle<MediaTypeHeaderValue> ("Content-Type", MediaTypeHeaderValue.TryParse, HttpHeaderKind.Content),
-                               HeaderInfo.CreateSingle<DateTimeOffset> ("Date", Parser.DateTime.TryParse, HttpHeaderKind.Request | HttpHeaderKind.Response),
+                               HeaderInfo.CreateSingle<DateTimeOffset> ("Date", Parser.DateTime.TryParse, HttpHeaderKind.Request | HttpHeaderKind.Response, Parser.DateTime.ToString),
                                HeaderInfo.CreateSingle<EntityTagHeaderValue> ("ETag", EntityTagHeaderValue.TryParse, HttpHeaderKind.Response),
                                HeaderInfo.CreateMulti<NameValueWithParametersHeaderValue> ("Expect", NameValueWithParametersHeaderValue.TryParse, HttpHeaderKind.Request),
-                               HeaderInfo.CreateSingle<DateTimeOffset> ("Expires", Parser.DateTime.TryParse, HttpHeaderKind.Content),
+                               HeaderInfo.CreateSingle<DateTimeOffset> ("Expires", Parser.DateTime.TryParse, HttpHeaderKind.Content, Parser.DateTime.ToString),
                                HeaderInfo.CreateSingle<string> ("From", Parser.EmailAddress.TryParse, HttpHeaderKind.Request),
                                HeaderInfo.CreateSingle<string> ("Host", Parser.Host.TryParse, HttpHeaderKind.Request),
                                HeaderInfo.CreateMulti<EntityTagHeaderValue> ("If-Match", EntityTagHeaderValue.TryParse, HttpHeaderKind.Request),
-                               HeaderInfo.CreateSingle<DateTimeOffset> ("If-Modified-Since", Parser.DateTime.TryParse, HttpHeaderKind.Request),
+                               HeaderInfo.CreateSingle<DateTimeOffset> ("If-Modified-Since", Parser.DateTime.TryParse, HttpHeaderKind.Request, Parser.DateTime.ToString),
                                HeaderInfo.CreateMulti<EntityTagHeaderValue> ("If-None-Match", EntityTagHeaderValue.TryParse, HttpHeaderKind.Request),
                                HeaderInfo.CreateSingle<RangeConditionHeaderValue> ("If-Range", RangeConditionHeaderValue.TryParse, HttpHeaderKind.Request),
-                               HeaderInfo.CreateSingle<DateTimeOffset> ("If-Unmodified-Since", Parser.DateTime.TryParse, HttpHeaderKind.Request),
-                               HeaderInfo.CreateSingle<DateTimeOffset> ("Last-Modified", Parser.DateTime.TryParse, HttpHeaderKind.Content),
+                               HeaderInfo.CreateSingle<DateTimeOffset> ("If-Unmodified-Since", Parser.DateTime.TryParse, HttpHeaderKind.Request, Parser.DateTime.ToString),
+                               HeaderInfo.CreateSingle<DateTimeOffset> ("Last-Modified", Parser.DateTime.TryParse, HttpHeaderKind.Content, Parser.DateTime.ToString),
                                HeaderInfo.CreateSingle<Uri> ("Location", Parser.Uri.TryParse, HttpHeaderKind.Response),
                                HeaderInfo.CreateSingle<int> ("Max-Forwards", Parser.Int.TryParse, HttpHeaderKind.Request),
                                HeaderInfo.CreateMulti<NameValueHeaderValue> ("Pragma", NameValueHeaderValue.TryParsePragma, HttpHeaderKind.Request | HttpHeaderKind.Response),
@@ -198,18 +198,18 @@ namespace System.Net.Http.Headers
 
                                        if (headerInfo.AllowsMany) {
                                                if (bucket == null)
-                                                       bucket = new HeaderBucket (headerInfo.CreateCollection (this));
+                                                       bucket = new HeaderBucket (headerInfo.CreateCollection (this), headerInfo.CustomToString);
 
                                                headerInfo.AddToCollection (bucket.Parsed, parsed_value);
                                        } else {
                                                if (bucket != null)
                                                        throw new FormatException ();
 
-                                               bucket = new HeaderBucket (parsed_value);
+                                               bucket = new HeaderBucket (parsed_value, headerInfo.CustomToString);
                                        }
                                } else {
                                        if (bucket == null)
-                                               bucket = new HeaderBucket (null);
+                                               bucket = new HeaderBucket (null, null);
 
                                        bucket.Values.Add (value ?? string.Empty);
                                }
@@ -466,7 +466,7 @@ namespace System.Net.Http.Headers
 
                        if (!headers.TryGetValue (name, out value)) {
                                var hinfo = known_headers[name];
-                               value = new HeaderBucket (new HttpHeaderValueCollection<T> (this, hinfo));
+                               value = new HeaderBucket (new HttpHeaderValueCollection<T> (this, hinfo), hinfo.CustomToString);
                                headers.Add (name, value);
                        }
 
index 177df39d5b695e4a803d3676610aaf9f79b11cf7..9a1333cbb5db8a5b54400d94f458a989e503193a 100644 (file)
@@ -133,6 +133,16 @@ namespace MonoTests.System.Net.Http
                        Assert.AreEqual (other, m.First (), "#4");
                }
 
+               [Test]
+               public void Add_ParseCustomToString ()
+               {
+                       var m = new MultipartContent ("a", "b");
+
+                       m.Headers.Add ("Expires", "Mon,   30 Nov 2020   19:55:22    GMT");
+
+                       Assert.AreEqual ("Mon, 30 Nov 2020 19:55:22 GMT", m.Headers.Skip (1).First().Value.First ());
+               }
+
                [Test]
                public void Add_Resursive ()
                {