From a7d19e651ce08de869c68ba7cf0f4d66a82a780e Mon Sep 17 00:00:00 2001 From: Niels Basjes Date: Tue, 1 Aug 2023 12:09:30 +0200 Subject: [PATCH] fix: Fix string splitting bug and optimize performance. --- .../useragent/clienthints/ClientHintsAnalyzer.java | 13 ++++++++----- .../parse/useragent/utils/HostnameExtracter.java | 5 ++++- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/analyzer/src/main/java/nl/basjes/parse/useragent/clienthints/ClientHintsAnalyzer.java b/analyzer/src/main/java/nl/basjes/parse/useragent/clienthints/ClientHintsAnalyzer.java index 926b41bfd0..66c25bec02 100644 --- a/analyzer/src/main/java/nl/basjes/parse/useragent/clienthints/ClientHintsAnalyzer.java +++ b/analyzer/src/main/java/nl/basjes/parse/useragent/clienthints/ClientHintsAnalyzer.java @@ -39,6 +39,7 @@ import java.util.Optional; import java.util.Set; import java.util.TreeMap; +import java.util.regex.Pattern; import static java.lang.Boolean.TRUE; import static nl.basjes.parse.useragent.UserAgent.AGENT_CLASS; @@ -383,6 +384,8 @@ private boolean newVersionIsBetter(MutableAgentField currentVersion, String vers (versionHasMinor); } + private static final Pattern DOT_SPLITTER = Pattern.compile("\\."); + public void improveLayoutEngineAndAgentInfo(MutableUserAgent userAgent, ClientHints clientHints) { // Improve the Agent info. List versionList = clientHints.getFullVersionList(); @@ -401,7 +404,7 @@ public void improveLayoutEngineAndAgentInfo(MutableUserAgent userAgent, ClientHi Brand chromium = versionMap.get("Chromium"); if (chromium != null) { String version = chromium.getVersion(); - String[] versionSplits = version.split("\\."); + String[] versionSplits = DOT_SPLITTER.split(version); String majorVersion = versionSplits[0]; // Work around the major in minor hack/feature of Chrome ~v99 @@ -465,7 +468,7 @@ public void improveLayoutEngineAndAgentInfo(MutableUserAgent userAgent, ClientHi // So we have "Chrome" and nothing else MutableAgentField currentVersion = userAgent.get(AGENT_VERSION); String version = chrome.getVersion(); - String[] versionSplits = version.split("\\."); + String[] versionSplits = DOT_SPLITTER.split(version); String majorVersion = versionSplits[0]; // Work around the major in minor hack/feature of Chrome ~v99 @@ -500,7 +503,7 @@ public void improveLayoutEngineAndAgentInfo(MutableUserAgent userAgent, ClientHi if ("Opera".equals(currentAgent.getValue())) { String currentVersion = userAgent.get(AGENT_VERSION).getValue(); // We only consider the Client Hints if the version new enough. - String currentMajorVersion = currentVersion.substring(0, currentVersion.indexOf('.')); + String currentMajorVersion = DOT_SPLITTER.split(currentVersion, 2)[0]; int currentMajorVersionInt = Integer.parseInt(currentMajorVersion); if (currentMajorVersionInt < 98) { versionMap.remove("Opera"); @@ -556,11 +559,11 @@ public void improveLayoutEngineAndAgentInfo(MutableUserAgent userAgent, ClientHi // We only update the version if we have a better version number. // We always update the AgentName because I think the Client hints are always "better"... String newVersion = brand.getVersion(); - String newMajorVersion = newVersion.split("\\.")[0]; + String newMajorVersion = DOT_SPLITTER.split(newVersion, 2)[0]; // The values we are going to set at the end. String setVersion = versionFieldValue; - String setMajorVersion = versionFieldValue.split("\\.")[0]; + String setMajorVersion = DOT_SPLITTER.split(versionFieldValue, 2)[0]; // If the original is a major version only then the new one is better if (versionIsMajorVersionOnly) { diff --git a/analyzer/src/main/java/nl/basjes/parse/useragent/utils/HostnameExtracter.java b/analyzer/src/main/java/nl/basjes/parse/useragent/utils/HostnameExtracter.java index ebc4ba2d36..2c26d614e8 100644 --- a/analyzer/src/main/java/nl/basjes/parse/useragent/utils/HostnameExtracter.java +++ b/analyzer/src/main/java/nl/basjes/parse/useragent/utils/HostnameExtracter.java @@ -26,6 +26,7 @@ import java.util.List; import java.util.Locale; import java.util.Set; +import java.util.regex.Pattern; import static nl.basjes.parse.useragent.utils.publicsuffixlist.DomainType.ICANN; @@ -164,6 +165,8 @@ private static String extractCompanyFromSoftwareRepositoryUrl(String url) { return null; } + private static final Pattern DOT_SPLITTER = Pattern.compile("\\."); + private static String extractCompanyFromHostName(String hostname, Set blackList) { if (hostname == null) { return null; @@ -177,7 +180,7 @@ private static String extractCompanyFromHostName(String hostname, Set bl if (root == null) { return null; } - return Normalize.brand(root.split("\\.", 2)[0]); + return Normalize.brand(DOT_SPLITTER.split(root, 2)[0]); } }