Skip to content
This repository was archived by the owner on Nov 20, 2018. It is now read-only.

Commit 99ea4fe

Browse files
committed
#176 Add Clone() to MediaTypeHeaderValue and NameValueHeaderValue.
1 parent 54fbf51 commit 99ea4fe

File tree

4 files changed

+88
-0
lines changed

4 files changed

+88
-0
lines changed

src/Microsoft.Net.Http.Headers/MediaTypeHeaderValue.cs

+21
Original file line numberDiff line numberDiff line change
@@ -248,6 +248,27 @@ public bool IsSubsetOf(MediaTypeHeaderValue otherMediaType)
248248
return true;
249249
}
250250

251+
/// <summary>
252+
/// Performs a deep copy of this object and all of it's NameValueHeaderValue sub components,
253+
/// while avoiding the cost of revalidating the components.
254+
/// </summary>
255+
/// <returns>A deep copy.</returns>
256+
public MediaTypeHeaderValue Clone()
257+
{
258+
var other = new MediaTypeHeaderValue();
259+
other._mediaType = _mediaType;
260+
261+
if (_parameters != null)
262+
{
263+
other._parameters = new ObjectCollection<NameValueHeaderValue>();
264+
foreach (var pair in _parameters)
265+
{
266+
other._parameters.Add(pair.Clone());
267+
}
268+
}
269+
return other;
270+
}
271+
251272
public override string ToString()
252273
{
253274
return _mediaType + NameValueHeaderValue.ToString(_parameters, ';', true);

src/Microsoft.Net.Http.Headers/NameValueHeaderValue.cs

+13
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,19 @@ public string Value
5454
}
5555
}
5656

57+
/// <summary>
58+
/// Provides a copy of this object without the cost of re-validating the values.
59+
/// </summary>
60+
/// <returns>A copy.</returns>
61+
public NameValueHeaderValue Clone()
62+
{
63+
return new NameValueHeaderValue()
64+
{
65+
_name = _name,
66+
_value = _value
67+
};
68+
}
69+
5770
public override int GetHashCode()
5871
{
5972
Contract.Assert(_name != null);

test/Microsoft.Net.Http.Headers.Tests/MediaTypeHeaderValueTest.cs

+28
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,34 @@ public void Parameters_AddNull_Throw()
6464
Assert.Throws<ArgumentNullException>(() => mediaType.Parameters.Add(null));
6565
}
6666

67+
[Fact]
68+
public void Clone_SimpleMediaType_Copied()
69+
{
70+
var mediaType0 = new MediaTypeHeaderValue("text/plain");
71+
var mediaType1 = mediaType0.Clone();
72+
Assert.NotSame(mediaType0, mediaType1);
73+
Assert.Same(mediaType0.MediaType, mediaType1.MediaType);
74+
Assert.NotSame(mediaType0.Parameters, mediaType1.Parameters);
75+
Assert.Equal(mediaType0.Parameters.Count, mediaType1.Parameters.Count);
76+
}
77+
78+
[Fact]
79+
public void Clone_WithParameters_Copied()
80+
{
81+
var mediaType0 = new MediaTypeHeaderValue("text/plain");
82+
mediaType0.Parameters.Add(new NameValueHeaderValue("name", "value"));
83+
var mediaType1 = mediaType0.Clone();
84+
Assert.NotSame(mediaType0, mediaType1);
85+
Assert.Same(mediaType0.MediaType, mediaType1.MediaType);
86+
Assert.NotSame(mediaType0.Parameters, mediaType1.Parameters);
87+
Assert.Equal(mediaType0.Parameters.Count, mediaType1.Parameters.Count);
88+
var pair0 = mediaType0.Parameters.First();
89+
var pair1 = mediaType1.Parameters.First();
90+
Assert.NotSame(pair0, pair1);
91+
Assert.Same(pair0.Name, pair1.Name);
92+
Assert.Same(pair0.Value, pair1.Value);
93+
}
94+
6795
[Fact]
6896
public void MediaType_SetAndGetMediaType_MatchExpectations()
6997
{

test/Microsoft.Net.Http.Headers.Tests/NameValueHeaderValueTest.cs

+26
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,32 @@ public void Ctor_ValueValidFormat_SuccessfullyCreated()
5959
CheckValue("\"quoted string with quoted \\\" quote-pair\"");
6060
}
6161

62+
[Fact]
63+
public void Clone_NameOnly_SuccesfullyCopied()
64+
{
65+
var pair0 = new NameValueHeaderValue("name");
66+
var pair1 = pair0.Clone();
67+
Assert.NotSame(pair0, pair1);
68+
Assert.Same(pair0.Name, pair1.Name);
69+
Assert.Null(pair0.Value);
70+
Assert.Null(pair1.Value);
71+
}
72+
73+
[Fact]
74+
public void Clone_NameAndValue_SuccesfullyCopied()
75+
{
76+
var pair0 = new NameValueHeaderValue("name", "value");
77+
var pair1 = pair0.Clone();
78+
Assert.NotSame(pair0, pair1);
79+
Assert.Same(pair0.Name, pair1.Name);
80+
Assert.Same(pair0.Value, pair1.Value);
81+
82+
// Change one value and verify the other is unchanged.
83+
pair1.Value = "othervalue";
84+
Assert.Equal("value", pair0.Value);
85+
Assert.Equal("othervalue", pair1.Value);
86+
}
87+
6288
[Fact]
6389
public void Value_CallSetterWithInvalidValues_Throw()
6490
{

0 commit comments

Comments
 (0)