Skip to content

Commit 0f15027

Browse files
committed
default UrlEncoder escapes '@'
1 parent 16d146f commit 0f15027

File tree

1 file changed

+15
-4
lines changed

1 file changed

+15
-4
lines changed

src/WebSerializer/WebSerializerOptions.cs

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,12 @@ namespace Cysharp.Web;
88

99
public record WebSerializerOptions(IWebSerializerProvider Provider)
1010
{
11+
static readonly UrlEncoder defaultEncoder = CreateDefaultEncoderWithEncodeSemicolonAndAtmark();
12+
1113
public static WebSerializerOptions Default { get; } = new WebSerializerOptions(WebSerializerProvider.Default);
1214

1315
public CultureInfo? CultureInfo { get; init; }
14-
public UrlEncoder Encoder { get; init; } = CreateDefaultEncoderWithEncodeSemicolon();
16+
public UrlEncoder Encoder { get; init; } = defaultEncoder;
1517
public int MaxDepth { get; init; } = 64;
1618

1719
string? separator = null;
@@ -51,12 +53,21 @@ void Throw(Type type)
5153
throw new InvalidOperationException($"Type is not found in provider. Type:{type}");
5254
}
5355

54-
static UrlEncoder CreateDefaultEncoderWithEncodeSemicolon()
56+
static UrlEncoder CreateDefaultEncoderWithEncodeSemicolonAndAtmark()
5557
{
5658
// UrlEncoder.Default is UnicodeRanges.BasicLastin(\u0000 -> \u007F)
5759
// ; is U+003B so exclude in range
60+
// @ is U+0040 so exclude in range
61+
62+
// 0 -> ';'
5863
var first = UnicodeRange.Create('\u0000', (char)(';' - 1));
59-
var second = UnicodeRange.Create((char)(';' + 1), '\u007F');
60-
return UrlEncoder.Create(first, second);
64+
65+
// ';' -> '@'
66+
var second = UnicodeRange.Create((char)(';' + 1), (char)('@' - 1));
67+
68+
// '@' -> 7F
69+
var third = UnicodeRange.Create((char)('@' + 1), '\u007F');
70+
71+
return UrlEncoder.Create(first, second, third);
6172
}
6273
}

0 commit comments

Comments
 (0)