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

Commit 57d027b

Browse files
committed
Add strong and weak ETag comparisons
1 parent e2a0e88 commit 57d027b

File tree

2 files changed

+65
-1
lines changed

2 files changed

+65
-1
lines changed

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

+19-1
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ public override bool Equals(object obj)
103103
}
104104

105105
// Since the tag is a quoted-string we treat it case-sensitive.
106-
return ((_isWeak == other._isWeak) && (string.CompareOrdinal(_tag, other._tag) == 0));
106+
return _isWeak == other._isWeak && string.Equals(_tag, other._tag);
107107
}
108108

109109
public override int GetHashCode()
@@ -112,6 +112,24 @@ public override int GetHashCode()
112112
return _tag.GetHashCode() ^ _isWeak.GetHashCode();
113113
}
114114

115+
public static bool CompareStrongly(EntityTagHeaderValue left, EntityTagHeaderValue right)
116+
{
117+
if (left == null || right == null)
118+
{
119+
return false;
120+
}
121+
return !left.IsWeak && !right.IsWeak && string.Equals(left.Tag, right.Tag);
122+
}
123+
124+
public static bool CompareWeakly(EntityTagHeaderValue left, EntityTagHeaderValue right)
125+
{
126+
if (left == null || right == null)
127+
{
128+
return false;
129+
}
130+
return string.Equals(left.Tag, right.Tag);
131+
}
132+
115133
public static EntityTagHeaderValue Parse(string input)
116134
{
117135
var index = 0;

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

+46
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,52 @@ public void Equals_UseSameAndDifferentETags_EqualOrNotEqualNoExceptions()
9999
Assert.True(etag1.Equals(etag5), "tag vs. tag..");
100100
}
101101

102+
[Fact]
103+
public void CompareStrongly_UseSameAndDifferentETags_EqualOrNotEqualNoExceptions()
104+
{
105+
var etag1 = new EntityTagHeaderValue("\"tag\"");
106+
var etag2 = new EntityTagHeaderValue("\"TAG\"");
107+
var etag3 = new EntityTagHeaderValue("\"tag\"", true);
108+
var etag4 = new EntityTagHeaderValue("\"tag1\"");
109+
var etag5 = new EntityTagHeaderValue("\"tag\"");
110+
var etag6 = EntityTagHeaderValue.Any;
111+
112+
Assert.False(EntityTagHeaderValue.CompareStrongly(etag1, etag2), "Different casing.");
113+
Assert.False(EntityTagHeaderValue.CompareStrongly(etag2, etag1), "Different casing.");
114+
Assert.False(EntityTagHeaderValue.CompareStrongly(etag1, null), "tag vs. <null>.");
115+
Assert.False(EntityTagHeaderValue.CompareStrongly(null, etag1), "<null> vs tag.");
116+
Assert.False(EntityTagHeaderValue.CompareStrongly(null, null), "<null> vs. <null>.");
117+
Assert.False(EntityTagHeaderValue.CompareStrongly(etag3, etag3), "weak vs. weak.");
118+
Assert.False(EntityTagHeaderValue.CompareStrongly(etag1, etag3), "strong vs. weak.");
119+
Assert.False(EntityTagHeaderValue.CompareStrongly(etag3, etag1), "weak vs. strong.");
120+
Assert.False(EntityTagHeaderValue.CompareStrongly(etag1, etag4), "tag vs. tag1.");
121+
Assert.False(EntityTagHeaderValue.CompareStrongly(etag1, etag6), "tag vs. *.");
122+
Assert.True(EntityTagHeaderValue.CompareStrongly(etag1, etag5), "tag vs. tag.");
123+
}
124+
125+
[Fact]
126+
public void CompareWeakly_UseSameAndDifferentETags_EqualOrNotEqualNoExceptions()
127+
{
128+
var etag1 = new EntityTagHeaderValue("\"tag\"");
129+
var etag2 = new EntityTagHeaderValue("\"TAG\"");
130+
var etag3 = new EntityTagHeaderValue("\"tag\"", true);
131+
var etag4 = new EntityTagHeaderValue("\"tag1\"");
132+
var etag5 = new EntityTagHeaderValue("\"tag\"");
133+
var etag6 = EntityTagHeaderValue.Any;
134+
135+
Assert.False(EntityTagHeaderValue.CompareWeakly(etag1, etag2), "Different casing.");
136+
Assert.False(EntityTagHeaderValue.CompareWeakly(etag2, etag1), "Different casing.");
137+
Assert.False(EntityTagHeaderValue.CompareWeakly(etag1, null), "tag vs. <null>.");
138+
Assert.False(EntityTagHeaderValue.CompareWeakly(null, etag1), "<null> vs tag.");
139+
Assert.False(EntityTagHeaderValue.CompareWeakly(null, null), "<null> vs. <null>.");
140+
Assert.True(EntityTagHeaderValue.CompareWeakly(etag3, etag3), "weak vs. weak.");
141+
Assert.True(EntityTagHeaderValue.CompareWeakly(etag1, etag3), "strong vs. weak.");
142+
Assert.True(EntityTagHeaderValue.CompareWeakly(etag3, etag1), "weak vs. strong.");
143+
Assert.False(EntityTagHeaderValue.CompareWeakly(etag1, etag4), "tag vs. tag1.");
144+
Assert.False(EntityTagHeaderValue.CompareWeakly(etag1, etag6), "tag vs. *.");
145+
Assert.True(EntityTagHeaderValue.CompareWeakly(etag1, etag5), "tag vs. tag.");
146+
}
147+
102148
[Fact]
103149
public void Parse_SetOfValidValueStrings_ParsedCorrectly()
104150
{

0 commit comments

Comments
 (0)