diff --git a/src/Microsoft.Net.Http.Headers/MediaTypeHeaderValue.cs b/src/Microsoft.Net.Http.Headers/MediaTypeHeaderValue.cs
index 968eb4c6cc..aebf80e00b 100644
--- a/src/Microsoft.Net.Http.Headers/MediaTypeHeaderValue.cs
+++ b/src/Microsoft.Net.Http.Headers/MediaTypeHeaderValue.cs
@@ -273,11 +273,6 @@ namespace Microsoft.Net.Http.Headers
/// A deep copy.
public MediaTypeHeaderValue Copy()
{
- if (IsReadOnly)
- {
- return this;
- }
-
var other = new MediaTypeHeaderValue();
other._mediaType = _mediaType;
diff --git a/src/Microsoft.Net.Http.Headers/NameValueHeaderValue.cs b/src/Microsoft.Net.Http.Headers/NameValueHeaderValue.cs
index c2e38e643c..f5b1c72435 100644
--- a/src/Microsoft.Net.Http.Headers/NameValueHeaderValue.cs
+++ b/src/Microsoft.Net.Http.Headers/NameValueHeaderValue.cs
@@ -64,11 +64,6 @@ namespace Microsoft.Net.Http.Headers
/// A copy.
public NameValueHeaderValue Copy()
{
- if (IsReadOnly)
- {
- return this;
- }
-
return new NameValueHeaderValue()
{
_name = _name,
diff --git a/test/Microsoft.Net.Http.Headers.Tests/MediaTypeHeaderValueTest.cs b/test/Microsoft.Net.Http.Headers.Tests/MediaTypeHeaderValueTest.cs
index cfd389e4d4..9ca74a3632 100644
--- a/test/Microsoft.Net.Http.Headers.Tests/MediaTypeHeaderValueTest.cs
+++ b/test/Microsoft.Net.Http.Headers.Tests/MediaTypeHeaderValueTest.cs
@@ -135,6 +135,29 @@ namespace Microsoft.Net.Http.Headers
Assert.Same(pair0.Value, pair1.Value);
}
+ [Fact]
+ public void CopyFromReadOnly_WithParameters_CopiedAsNonReadOnly()
+ {
+ var mediaType0 = new MediaTypeHeaderValue("text/plain");
+ mediaType0.Parameters.Add(new NameValueHeaderValue("name", "value"));
+ var mediaType1 = mediaType0.CopyAsReadOnly();
+ var mediaType2 = mediaType1.Copy();
+
+ Assert.NotSame(mediaType2, mediaType1);
+ Assert.Same(mediaType2.MediaType, mediaType1.MediaType);
+ Assert.True(mediaType1.IsReadOnly);
+ Assert.False(mediaType2.IsReadOnly);
+ Assert.NotSame(mediaType2.Parameters, mediaType1.Parameters);
+ Assert.Equal(mediaType2.Parameters.Count, mediaType1.Parameters.Count);
+ var pair2 = mediaType2.Parameters.First();
+ var pair1 = mediaType1.Parameters.First();
+ Assert.NotSame(pair2, pair1);
+ Assert.True(pair1.IsReadOnly);
+ Assert.False(pair2.IsReadOnly);
+ Assert.Same(pair2.Name, pair1.Name);
+ Assert.Same(pair2.Value, pair1.Value);
+ }
+
[Fact]
public void MediaType_SetAndGetMediaType_MatchExpectations()
{
diff --git a/test/Microsoft.Net.Http.Headers.Tests/NameValueHeaderValueTest.cs b/test/Microsoft.Net.Http.Headers.Tests/NameValueHeaderValueTest.cs
index a5bf8c9b66..46d1d30d75 100644
--- a/test/Microsoft.Net.Http.Headers.Tests/NameValueHeaderValueTest.cs
+++ b/test/Microsoft.Net.Http.Headers.Tests/NameValueHeaderValueTest.cs
@@ -127,6 +127,22 @@ namespace Microsoft.Net.Http.Headers
Assert.Throws(() => { pair1.Value = "othervalue"; });
}
+ [Fact]
+ public void CopyFromReadOnly_NameAndValue_CopiedAsNonReadOnly()
+ {
+ var pair0 = new NameValueHeaderValue("name", "value");
+ var pair1 = pair0.CopyAsReadOnly();
+ var pair2 = pair1.Copy();
+ Assert.NotSame(pair0, pair1);
+ Assert.Same(pair0.Name, pair1.Name);
+ Assert.Same(pair0.Value, pair1.Value);
+
+ // Change one value and verify the other is unchanged.
+ pair2.Value = "othervalue";
+ Assert.Equal("othervalue", pair2.Value);
+ Assert.Equal("value", pair1.Value);
+ }
+
[Fact]
public void Value_CallSetterWithInvalidValues_Throw()
{