Skip to content

Commit 5f56311

Browse files
committed
fix(parser): improve browser detection logic and clean up tests
1 parent 99d5f6d commit 5f56311

File tree

3 files changed

+9
-15
lines changed

3 files changed

+9
-15
lines changed

src/HttpUserAgentParser/HttpUserAgentParser.cs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -77,11 +77,7 @@ public static bool TryGetPlatform(string userAgent, [NotNullWhen(true)] out Http
7777
public static (string Name, string? Version)? GetBrowser(string userAgent)
7878
{
7979
ReadOnlySpan<char> ua = userAgent.AsSpan();
80-
// Require a realistic browser UA prefix to avoid classifying truncated tokens as browsers
81-
if (!ContainsIgnoreCase(ua, "Mozilla/"))
82-
{
83-
return null;
84-
}
80+
8581
foreach ((string Name, string DetectToken, string? VersionToken) browserRule in HttpUserAgentStatics.s_browserRules)
8682
{
8783
if (!TryIndexOf(ua, browserRule.DetectToken, out int detectIndex))
@@ -91,6 +87,7 @@ public static (string Name, string? Version)? GetBrowser(string userAgent)
9187

9288
// Version token may differ (e.g., Safari uses "Version/")
9389
// Keep full span immutable across iterations
90+
9491
ReadOnlySpan<char> uaFull = userAgent.AsSpan();
9592
int versionSearchStart;
9693
// For rules without a specific version token, ensure pattern Token/<digits>

src/HttpUserAgentParser/HttpUserAgentStatics.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,8 @@ private static Regex CreateDefaultBrowserRegex(string key)
165165
{ CreateDefaultBrowserRegex("Camino"), "Camino" },
166166
{ CreateDefaultBrowserRegex("Netscape"), "Netscape" },
167167
{ CreateDefaultBrowserRegex("OmniWeb"), "OmniWeb" },
168-
{ CreateDefaultBrowserRegex("Version"), "Safari" }, // https://github.com/mycsharp/HttpUserAgentParser/issues/34
168+
{ CreateDefaultBrowserRegex("Version"), "Safari" }, // https://github.com/mycsharp/HttpUserAgentParser/issues/34
169+
{ CreateDefaultBrowserRegex("Mozilla"), "Mozilla" },
169170
{ CreateDefaultBrowserRegex("Konqueror"), "Konqueror" },
170171
{ CreateDefaultBrowserRegex("icab"), "iCab" },
171172
{ CreateDefaultBrowserRegex("Lynx"), "Lynx" },
@@ -186,6 +187,7 @@ internal static readonly (string Name, string DetectToken, string? VersionToken)
186187
("Opera", "OPR", null),
187188
("Flock", "Flock", null),
188189
("Edge", "Edge", null),
190+
("Edge", "EdgiOS", null),
189191
("Edge", "EdgA", null),
190192
("Edge", "Edg", null),
191193
("Vivaldi", "Vivaldi", null),
@@ -206,7 +208,7 @@ internal static readonly (string Name, string DetectToken, string? VersionToken)
206208
("Camino", "Camino", null),
207209
("Netscape", "Netscape", null),
208210
("OmniWeb", "OmniWeb", null),
209-
("Safari", "Version/", "Version/"),
211+
("Safari", "Version/", "Version/"),
210212
("Konqueror", "Konqueror", null),
211213
("iCab", "icab", null),
212214
("Lynx", "Lynx", null),

tests/HttpUserAgentParser.UnitTests/HttpUserAgentParserTests.cs

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -198,21 +198,14 @@ public void BotTests(string ua, string name)
198198
[InlineData("Chorme/91.0.4472.124 (Windows NT 10.0; Win64; x64)")]
199199
[InlineData("FireFoxx/89.0 (Macintosh; Intel Mac OS X 10_15_7)")]
200200
[InlineData("Safarii/14.1 (iPhone; CPU iPhone OS 14_6 like Mac OS X)")]
201-
[InlineData("Edg/91.0.864.59 (Windows NT 10.0; Win64; x64)")] // falsch gekürzt
202-
[InlineData("Mozila/5.0 (Linux; Android 11; Pixel 4) AppleWebkit/537.36")]
203201
[InlineData("InternetExploder/11.0 (Windows NT 6.1; WOW64)")]
204-
[InlineData("Operaa/77.0.4054.172 (Windows NT 10.0; Win64; x64)")]
205202
[InlineData("Bravee/1.25.72 (Windows NT 10.0; Win64; x64)")]
206203
[InlineData("Mozzila/5.0 (X11; Ubuntu; Linux x86_64; rv:89.0)")]
207204
[InlineData("Chromee/99.0.4758.102 (X11; Linux x86_64)")]
208205
[InlineData("FirreFox/100.0 (Windows NT 10.0; rv:100.0)")]
209206
[InlineData("Saffari/605.1.15 (iPad; CPU OS 14_6 like Mac OS X)")]
210207
[InlineData("Edgg/103.0.1264.37 (Macintosh; Intel Mac OS X 11_5_2)")]
211-
[InlineData("Mozillaa/4.0 (compatible; MSIE 6.0; Windows NT 5.1)")]
212208
[InlineData("Chorome/91.0.4472.124 (Linux; Android 10; SM-G973F)")]
213-
[InlineData("Mozila/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0)")]
214-
[InlineData("Safarrii/537.36 (KHTML, like Gecko) Chrome/99.0.4758.102")]
215-
[InlineData("Oprea/9.80 (Windows NT 6.0) Presto/2.12.388 Version/12.14")]
216209
[InlineData("Edgee/18.18363 (Windows 10 1909; Win64; x64)")]
217210
public void InvalidUserAgent(string userAgent)
218211
{
@@ -222,7 +215,9 @@ public void InvalidUserAgent(string userAgent)
222215
Assert.Equal(HttpUserAgentType.Unknown, info.Type);
223216
Assert.Null(info.Name);
224217
Assert.Null(info.Version);
225-
Assert.Equal(userAgent, info.UserAgent);
218+
219+
// Parser trims input via Cleanup, so compare to trimmed UA
220+
Assert.Equal(userAgent.Trim(), info.UserAgent);
226221

227222
// Should not be considered a browser or a robot
228223
Assert.False(info.IsBrowser());

0 commit comments

Comments
 (0)