Skip to content

Commit 322637a

Browse files
authored
Case insensitive session keys JSON serializer (#540)
1 parent e8cd20e commit 322637a

File tree

2 files changed

+87
-1
lines changed

2 files changed

+87
-1
lines changed

src/Microsoft.AspNetCore.SystemWebAdapters.Abstractions/SessionState/Serialization/JsonSessionSerializerOptions.cs

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,31 @@ namespace Microsoft.AspNetCore.SystemWebAdapters.SessionState.Serialization;
1111
/// </summary>
1212
public class JsonSessionSerializerOptions
1313
{
14+
public JsonSessionSerializerOptions()
15+
{
16+
_keyComparer = StringComparer.Ordinal;
17+
KnownKeys = new Dictionary<string, Type>(_keyComparer);
18+
}
19+
20+
private IEqualityComparer<string> _keyComparer;
21+
22+
/// <summary>
23+
/// Gets or or sets the equality comparer for the known session keys.
24+
/// </summary>
25+
public IEqualityComparer<string> KeyComparer
26+
{
27+
get => _keyComparer;
28+
set
29+
{
30+
_keyComparer = value;
31+
KnownKeys = new Dictionary<string, Type>(KnownKeys, _keyComparer);
32+
}
33+
}
34+
1435
/// <summary>
1536
/// Gets the mapping of known session keys to types
1637
/// </summary>
17-
public IDictionary<string, Type> KnownKeys { get; } = new Dictionary<string, Type>();
38+
public IDictionary<string, Type> KnownKeys { get; private set; }
1839

1940
/// <summary>
2041
/// Registers a session key name to be of type <typeparamref name="T"/>

test/Microsoft.AspNetCore.SystemWebAdapters.CoreServices.Tests/SessionState/Serialization/JsonSessionKeySerializerTests.cs

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
// Licensed to the .NET Foundation under one or more agreements.
22
// The .NET Foundation licenses this file to you under the MIT license.
33

4+
using System;
45
using System.Globalization;
56
using System.Linq;
67
using System.Text;
@@ -293,6 +294,70 @@ public void PrimitiveNullableSerializer(int? primitive)
293294
Assert.Equal(primitive, deserialized);
294295
}
295296

297+
[Fact]
298+
public void CaseInsensitiveSessionKeys()
299+
{
300+
// Arrange
301+
var key1 = _fixture.Create<string>();
302+
var key2 = _fixture.Create<string>();
303+
304+
var options = new JsonSessionSerializerOptions
305+
{
306+
KeyComparer = StringComparer.OrdinalIgnoreCase,
307+
KnownKeys =
308+
{
309+
{ key1, typeof(Type1) },
310+
{ key2, typeof(int) },
311+
}
312+
};
313+
314+
// Act
315+
var result1 = options.KnownKeys.ContainsKey(key1.ToUpperInvariant());
316+
var result2 = options.KnownKeys.ContainsKey(key2);
317+
318+
// Assert
319+
Assert.True(result1);
320+
Assert.True(result2);
321+
}
322+
323+
[Fact]
324+
public void ChangeSessionKeysComparer()
325+
{
326+
// Arrange
327+
var key1 = _fixture.Create<string>();
328+
var key2 = _fixture.Create<string>();
329+
330+
var options = new JsonSessionSerializerOptions
331+
{
332+
KnownKeys =
333+
{
334+
{ key1, typeof(Type1) },
335+
{ key2, typeof(int) },
336+
}
337+
};
338+
339+
// Act
340+
var result1 = options.KnownKeys.ContainsKey(key1);
341+
var result2 = options.KnownKeys.ContainsKey(key2);
342+
var result3 = options.KnownKeys.ContainsKey(key2.ToUpperInvariant());
343+
344+
// Assert
345+
Assert.True(result1);
346+
Assert.True(result2);
347+
Assert.False(result3);
348+
349+
// Re-arrange
350+
options.KeyComparer = StringComparer.OrdinalIgnoreCase;
351+
352+
// Act
353+
result1 = options.KnownKeys.ContainsKey(key1);
354+
result2 = options.KnownKeys.ContainsKey(key2.ToUpperInvariant());
355+
356+
// Assert
357+
Assert.True(result1);
358+
Assert.True(result2);
359+
}
360+
296361
private sealed class Type1
297362
{
298363
}

0 commit comments

Comments
 (0)