Skip to content

BrowserDetails parsing fails for duckduckgo userAgent used from Android #21546

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
bwajtr opened this issue May 27, 2025 · 1 comment
Open

Comments

@bwajtr
Copy link
Contributor

bwajtr commented May 27, 2025

Description of the bug

We detected the following error in our production server logs:

ERROR [com.vaadin.flow.shared.BrowserDetails] (http-nio-8080-exec-150,user=,reqId=365337) OS major version parsing failed for: "api 33"  
With userAgent: duckduckgo/5 (com.duckduckgo.mobile.android; android api 33)

the relevant stack trace is attached below.
To be honest, I have no idea what this is. Probably some DuckDuckGo bot trying to index Vaadin Flow page?
In any case, I do not think that BrowserDetails parser should produce errors like this -> the parser is obviously expecting some "userAgent format", but as far as I know there is nothing like that... and the userAgent string can be actually anything.

at java.lang.Thread.getStackTrace(Thread.java:1619)
    at ch.qos.logback.core.UnsynchronizedAppenderBase.doAppend(UnsynchronizedAppenderBase.java:85)
    at ch.qos.logback.core.spi.AppenderAttachableImpl.appendLoopOnAppenders(AppenderAttachableImpl.java:51)
    at ch.qos.logback.classic.Logger.appendLoopOnAppenders(Logger.java:272)
    at ch.qos.logback.classic.Logger.callAppenders(Logger.java:259)
    at ch.qos.logback.classic.Logger.buildLoggingEventAndAppend(Logger.java:426)
    at ch.qos.logback.classic.Logger.filterAndLog_0_Or3Plus(Logger.java:386)
    at ch.qos.logback.classic.Logger.error(Logger.java:527)
    at com.vaadin.flow.server.WebBrowser$1.log(WebBrowser.java:73)
    at com.vaadin.flow.shared.BrowserDetails.parseVersionPart(BrowserDetails.java:466)
    at com.vaadin.flow.shared.BrowserDetails.parseOsVersion(BrowserDetails.java:399)
    at com.vaadin.flow.shared.BrowserDetails.parseAndroidVersion(BrowserDetails.java:379)
    at com.vaadin.flow.shared.BrowserDetails.<init>(BrowserDetails.java:260)
    at com.vaadin.flow.server.WebBrowser$1.<init>(WebBrowser.java:70)
    at com.vaadin.flow.server.WebBrowser.<init>(WebBrowser.java:70)
    at com.vaadin.flow.server.VaadinService.createAndRegisterSession(VaadinService.java:1015)
    at com.vaadin.flow.server.VaadinService.doFindOrCreateVaadinSession(VaadinService.java:979)
    at com.vaadin.flow.server.VaadinService.findOrCreateVaadinSession(VaadinService.java:921)
    at com.vaadin.flow.server.VaadinService.findVaadinSession(VaadinService.java:760)
    at com.vaadin.flow.server.VaadinService.handleRequest(VaadinService.java:1658)
    at com.vaadin.flow.server.VaadinServlet.service(VaadinServlet.java:398)
    at com.vaadin.flow.spring.SpringServlet.service(SpringServlet.java:106)
    at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)
    at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:612)
    at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:394)
    at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:323)
    at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:268)
    at org.springframework.web.servlet.mvc.ServletForwardingController.handleRequestInternal(ServletForwardingController.java:142)
    at org.springframework.web.servlet.mvc.AbstractController.handleRequest(AbstractController.java:178)
    at org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle(SimpleControllerHandlerAdapter.java:51)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903)

Expected behavior

I'd expect that BrowserDetails makes no expectations on userAgent string and that BrowserDetails does not produce any errors.
If userAgent is in "unknown" format, then I'd expect BrowserDetails to be simply empty.

Minimal reproducible example

  1. Use Chrome Dev Tools to set custom user agent to duckduckgo/5 (com.duckduckgo.mobile.android; android api 33)
  2. Visit any Vaadin Flow app
  3. There is an error in the console

Versions

  • Vaadin / Flow version: 24.6.6
  • Java version: 17
  • OS version: macOs 15.5 (24F74)
@caalador
Copy link
Contributor

caalador commented Jun 3, 2025

The exception and stack trace is just there so we can get any new unknown agents and handle them.
In this case the major version should be set to -1 and other parts should have probably parsed as expected.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
Status: 🔖 Low Priority (P3)
Development

No branches or pull requests

3 participants