Skip to content

Commit 36b2a54

Browse files
Use OriginalString instead of AbsoluteUri for Uri serialization
Prevents the url being subtly changed e.g. http://domainonly -> http://domainonly/ (with trailing forward slash) Also allows relative urls to be persisted and loaded
1 parent 3535aeb commit 36b2a54

File tree

2 files changed

+19
-3
lines changed

2 files changed

+19
-3
lines changed

Bson/Serialization/Serializers/NetPrimitiveSerializers.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1883,7 +1883,7 @@ public override object Deserialize(
18831883
bsonReader.ReadNull();
18841884
return null;
18851885
case BsonType.String:
1886-
return new Uri(bsonReader.ReadString());
1886+
return new Uri(bsonReader.ReadString(), UriKind.RelativeOrAbsolute);
18871887
default:
18881888
var message = string.Format("Cannot deserialize Uri from BsonType {0}.", bsonType);
18891889
throw new FileFormatException(message);
@@ -1909,7 +1909,7 @@ public override void Serialize(
19091909
}
19101910
else
19111911
{
1912-
bsonWriter.WriteString(((Uri)value).AbsoluteUri);
1912+
bsonWriter.WriteString(((Uri)value).OriginalString);
19131913
}
19141914
}
19151915
}

BsonUnitTests/DefaultSerializer/Serializers/NetPrimitiveSerializerTests.cs

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1786,14 +1786,30 @@ public void TestHttp()
17861786
V = new Uri("http://www.cnn.com")
17871787
};
17881788
var json = obj.ToJson();
1789-
var expected = "{ 'V' : 'http://www.cnn.com/' }".Replace("'", "\"");
1789+
var expected = "{ 'V' : 'http://www.cnn.com' }".Replace("'", "\"");
17901790
Assert.AreEqual(expected, json);
17911791

17921792
var bson = obj.ToBson();
17931793
var rehydrated = BsonSerializer.Deserialize<TestClass>(bson);
17941794
Assert.IsTrue(bson.SequenceEqual(rehydrated.ToBson()));
17951795
}
17961796

1797+
[Test]
1798+
public void TestRelative()
1799+
{
1800+
var obj = new TestClass
1801+
{
1802+
V = new Uri("/relative/page.html", UriKind.RelativeOrAbsolute)
1803+
};
1804+
var json = obj.ToJson();
1805+
var expected = "{ 'V' : '/relative/page.html' }".Replace("'", "\"");
1806+
Assert.AreEqual(expected, json);
1807+
1808+
var bson = obj.ToBson();
1809+
var rehydrated = BsonSerializer.Deserialize<TestClass>(bson);
1810+
Assert.IsTrue(bson.SequenceEqual(rehydrated.ToBson()));
1811+
}
1812+
17971813
[Test]
17981814
public void TestMongoDB()
17991815
{

0 commit comments

Comments
 (0)