Skip to content

Commit beeb475

Browse files
BornToBeRootclaude
andcommitted
Fix: IP Scanner: Title of web pages with a code page charset (R17)
Encoding.GetEncoding threw for charsets that are not built into .NET (windows-1252, iso-8859-2, shift_jis, gb2312, ...) because the CodePagesEncodingProvider was not registered - the page was decoded as UTF-8 (e.g. "B�ro-Drucker"). WebPageResolver registers it in its static constructor. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
1 parent fe2f58e commit beeb475

2 files changed

Lines changed: 30 additions & 0 deletions

File tree

‎Source/NETworkManager.Models/Network/WebPageResolver.cs‎

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,15 @@ public static partial class WebPageResolver
6868
DefaultRequestHeaders = { { "User-Agent", "NETworkManager" } }
6969
};
7070

71+
/// <summary>
72+
/// Registers the code page encodings (e.g. <c>windows-1252</c>, <c>iso-8859-2</c>, <c>shift_jis</c>) for
73+
/// <see cref="Decode" /> - .NET only knows UTF-8 / UTF-16 / UTF-32, ASCII and ISO-8859-1 without them.
74+
/// </summary>
75+
static WebPageResolver()
76+
{
77+
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
78+
}
79+
7180
[GeneratedRegex(@"<title[^>]*>(.*?)</title\s*>", RegexOptions.IgnoreCase | RegexOptions.Singleline)]
7281
private static partial Regex TitleRegex();
7382

‎Source/NETworkManager.Tests/Network/WebPageResolverTests.cs‎

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,27 @@ public void Decode_CharsetOfMetaTag()
9999
Assert.Equal(html, WebPageResolver.Decode(Encoding.Latin1.GetBytes(html), null));
100100
}
101101

102+
[Fact]
103+
public void Decode_CodePageCharset()
104+
{
105+
// "Büro-Drucker €" in windows-1252 (not built into .NET, registered by WebPageResolver)
106+
byte[] content =
107+
[.. Encoding.ASCII.GetBytes("<title>B"), 0xFC, .. Encoding.ASCII.GetBytes("ro-Drucker "), 0x80,
108+
.. Encoding.ASCII.GetBytes("</title>")];
109+
110+
Assert.Equal("<title>Büro-Drucker €</title>", WebPageResolver.Decode(content, "windows-1252"));
111+
}
112+
113+
[Fact]
114+
public void Decode_CodePageCharsetOfMetaTag()
115+
{
116+
byte[] content =
117+
[.. Encoding.ASCII.GetBytes("<meta charset=\"windows-1252\"><title>B"), 0xFC,
118+
.. Encoding.ASCII.GetBytes("ro</title>")];
119+
120+
Assert.Equal("<meta charset=\"windows-1252\"><title>Büro</title>", WebPageResolver.Decode(content, null));
121+
}
122+
102123
[Fact]
103124
public void Decode_UnknownCharset_UTF8()
104125
{

0 commit comments

Comments
 (0)