danhuawang opened a new issue, #11029:
URL: https://github.com/apache/gravitino/issues/11029

   ### Version
   
   main branch
   
   ### Describe what's wrong
   
   `WebUIFilter.doFilter()` throws a `NullPointerException` when 
`httpRequest.getRequestURI()` returns `null`. The filter directly calls 
`path.lastIndexOf("/")` without a null check, causing the request to fail with 
a 500 error.
   
   
   
   ### Error message and/or stacktrace
   
   ```
   2026-05-10 19:15:10.373 INFO [main] 
[org.apache.gravitino.job.BuiltInJobTemplateEventListener.lambda$reconcileBuiltInJobTemplates$10(BuiltInJobTemplateEventListener.java:275)]
 - Built-in job template builtin-iceberg-update-stats under metalake metalake_a 
is up to date
   2026-05-10 19:15:10.374 INFO [main] 
[org.apache.gravitino.listener.EventListenerPluginWrapper.start(EventListenerPluginWrapper.java:56)]
 - Start event listener builtin-job-template.
   2026-05-10 19:15:10.378 INFO [main] 
[org.eclipse.jetty.server.Server.doStart(Server.java:375)] - 
jetty-9.4.58.v20250814; built: 2025-08-14T02:28:49.637Z; git: 
8f1440587e9e4ae7db3d74cf205643f3d707148d; jvm 17.0.16+8
   2026-05-10 19:15:14.785 INFO [main] 
[org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:921)]
 - Started o.e.j.s.ServletContextHandler@77cc6a28{/,null,AVAILABLE}
   2026-05-10 19:15:14.886 INFO [main] 
[org.eclipse.jetty.server.AbstractConnector.doStart(AbstractConnector.java:333)]
 - Started ServerConnector@55c46ec1{HTTP/1.1, (http/1.1)}{0.0.0.0:9001}
   2026-05-10 19:15:14.887 INFO [main] 
[org.eclipse.jetty.server.Server.doStart(Server.java:415)] - Started @27200ms
   2026-05-10 19:15:14.888 WARN [main] 
[org.apache.gravitino.server.web.JettyServer.start(JettyServer.java:206)] - 
Users would better use HTTPS to avoid token data leak.
   2026-05-10 19:15:14.888 INFO [main] 
[org.apache.gravitino.server.web.JettyServer.start(JettyServer.java:209)] - 
iceberg-rest web server started on host 0.0.0.0 port 9001.
   2026-05-10 19:15:14.888 INFO [main] 
[org.apache.gravitino.iceberg.RESTService.serviceStart(RESTService.java:191)] - 
Iceberg REST service started
   2026-05-10 19:15:14.889 INFO [main] 
[org.eclipse.jetty.server.Server.doStart(Server.java:375)] - 
jetty-9.4.58.v20250814; built: 2025-08-14T02:28:49.637Z; git: 
8f1440587e9e4ae7db3d74cf205643f3d707148d; jvm 17.0.16+8
   2026-05-10 19:15:15.579 INFO [main] 
[org.eclipse.jetty.webapp.StandardDescriptorProcessor.visitServlet(StandardDescriptorProcessor.java:277)]
 - NO JSP Support for /, did not find org.eclipse.jetty.jsp.JettyJspServlet
   2026-05-10 19:15:15.591 INFO [main] 
[org.eclipse.jetty.server.session.DefaultSessionIdManager.doStart(DefaultSessionIdManager.java:334)]
 - DefaultSessionIdManager workerName=node0
   2026-05-10 19:15:15.592 INFO [main] 
[org.eclipse.jetty.server.session.DefaultSessionIdManager.doStart(DefaultSessionIdManager.java:339)]
 - No SessionScavenger set, using defaults
   2026-05-10 19:15:15.594 INFO [main] 
[org.eclipse.jetty.server.session.HouseKeeper.startScavenging(HouseKeeper.java:132)]
 - node0 Scavenging every 600000ms
   2026-05-10 19:15:18.672 INFO [main] 
[org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:921)]
 - Started 
o.e.j.w.WebAppContext@50734cea{gravitino-web,/,jar:file:///opt/gravitino/web-v2/gravitino-web-1.3.0-SNAPSHOT-1.0.0-SNAPSHOT.war!/,AVAILABLE}{/opt/gravitino/web-v2/gravitino-web-1.3.0-SNAPSHOT-1.0.0-SNAPSHOT.war}
   2026-05-10 19:15:18.674 INFO [main] 
[org.eclipse.jetty.server.AbstractConnector.doStart(AbstractConnector.java:333)]
 - Started ServerConnector@4e6280de{HTTP/1.1, (http/1.1)}{0.0.0.0:8090}
   2026-05-10 19:15:18.674 INFO [main] 
[org.eclipse.jetty.server.Server.doStart(Server.java:415)] - Started @30988ms
   2026-05-10 19:15:18.675 WARN [main] 
[org.apache.gravitino.server.web.JettyServer.start(JettyServer.java:206)] - 
Users would better use HTTPS to avoid token data leak.
   2026-05-10 19:15:18.675 INFO [main] 
[org.apache.gravitino.server.web.JettyServer.start(JettyServer.java:209)] - 
Gravitino-webserver web server started on host 0.0.0.0 port 8090.
   2026-05-10 19:15:18.676 INFO [main] 
[org.apache.gravitino.server.DatastratoGravitinoServer.main(DatastratoGravitinoServer.java:37)]
 - Done, Datastrato Gravitino server started.
   2026-05-10 19:20:01.085 INFO [RelationalBackend-Garbage-Collector] 
[org.apache.gravitino.storage.relational.RelationalGarbageCollector.collectAndClean(RelationalGarbageCollector.java:94)]
 - Start to collect and delete old version data by thread 23
   2026-05-10 19:30:30.474 WARN [Gravitino-webserver-44] 
[org.eclipse.jetty.server.HttpChannel.handleException(HttpChannel.java:776)] - 
null
   java.lang.NullPointerException: Cannot invoke "String.lastIndexOf(String)" 
because "path" is null
        at 
org.apache.gravitino.server.web.ui.WebUIFilter.doFilter(WebUIFilter.java:39) 
~[gravitino-server-1.3.0-SNAPSHOT-1.0.0-SNAPSHOT.jar:?]
        at 
org.eclipse.jetty.servlet.FilterHolder.doFilter(FilterHolder.java:193) 
~[jetty-servlet-9.4.58.v20250814.jar:9.4.58.v20250814]
        at 
org.eclipse.jetty.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1626)
 ~[jetty-servlet-9.4.58.v20250814.jar:9.4.58.v20250814]
        at 
org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:552) 
~[jetty-servlet-9.4.58.v20250814.jar:9.4.58.v20250814]
        at 
org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143) 
~[jetty-server-9.4.58.v20250814.jar:9.4.58.v20250814]
        at 
org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:600) 
~[jetty-security-9.4.58.v20250814.jar:9.4.58.v20250814]
        at 
org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127) 
~[jetty-server-9.4.58.v20250814.jar:9.4.58.v20250814]
        at 
org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:235)
 ~[jetty-server-9.4.58.v20250814.jar:9.4.58.v20250814]
        at 
org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1624)
 ~[jetty-server-9.4.58.v20250814.jar:9.4.58.v20250814]
        at 
org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:233)
 ~[jetty-server-9.4.58.v20250814.jar:9.4.58.v20250814]
        at 
org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1440)
 ~[jetty-server-9.4.58.v20250814.jar:9.4.58.v20250814]
        at 
org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:188)
 ~[jetty-server-9.4.58.v20250814.jar:9.4.58.v20250814]
        at 
org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:505) 
~[jetty-servlet-9.4.58.v20250814.jar:9.4.58.v20250814]
        at 
org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1594)
 ~[jetty-server-9.4.58.v20250814.jar:9.4.58.v20250814]
        at 
org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:186)
 ~[jetty-server-9.4.58.v20250814.jar:9.4.58.v20250814]
        at 
org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1355)
 ~[jetty-server-9.4.58.v20250814.jar:9.4.58.v20250814]
        at 
org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141) 
~[jetty-server-9.4.58.v20250814.jar:9.4.58.v20250814]
        at 
org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:146)
 ~[jetty-server-9.4.58.v20250814.jar:9.4.58.v20250814]
        at 
org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127) 
~[jetty-server-9.4.58.v20250814.jar:9.4.58.v20250814]
        at org.eclipse.jetty.server.Server.handle(Server.java:516) 
~[jetty-server-9.4.58.v20250814.jar:9.4.58.v20250814]
        at 
org.eclipse.jetty.server.HttpChannel.lambda$handle$1(HttpChannel.java:487) 
~[jetty-server-9.4.58.v20250814.jar:9.4.58.v20250814]
        at org.eclipse.jetty.server.HttpChannel.dispatch(HttpChannel.java:732) 
~[jetty-server-9.4.58.v20250814.jar:9.4.58.v20250814]
        at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:479) 
~[jetty-server-9.4.58.v20250814.jar:9.4.58.v20250814]
        at 
org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:277) 
~[jetty-server-9.4.58.v20250814.jar:9.4.58.v20250814]
        at 
org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:311)
 ~[jetty-io-9.4.58.v20250814.jar:9.4.58.v20250814]
        at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:105) 
~[jetty-io-9.4.58.v20250814.jar:9.4.58.v20250814]
        at org.eclipse.jetty.io.ChannelEndPoint$1.run(ChannelEndPoint.java:104) 
~[jetty-io-9.4.58.v20250814.jar:9.4.58.v20250814]
        at 
org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.runTask(EatWhatYouKill.java:338)
 ~[jetty-util-9.4.58.v20250814.jar:9.4.58.v20250814]
        at 
org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:315)
 ~[jetty-util-9.4.58.v20250814.jar:9.4.58.v20250814]
        at 
org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:173)
 ~[jetty-util-9.4.58.v20250814.jar:9.4.58.v20250814]
        at 
org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.produce(EatWhatYouKill.java:137)
 ~[jetty-util-9.4.58.v20250814.jar:9.4.58.v20250814]
        at 
org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:883)
 [jetty-util-9.4.58.v20250814.jar:9.4.58.v20250814]
        at 
org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:1034)
 [jetty-util-9.4.58.v20250814.jar:9.4.58.v20250814]
        at java.base/java.lang.Thread.run(Thread.java:840) [?:?]
   ```
   
   ### How to reproduce
   
   - Gravitino version: main branch
   - Send an HTTP request to the Gravitino web server (port 8090) where 
`HttpServletRequest.getRequestURI()` returns `null` (e.g., via a malformed 
request or certain reverse proxy configurations that strip the request URI).
   - Observe the WARN log with NPE from `WebUIFilter.doFilter`.
   
   **Root cause:**
   In 
`server/src/main/java/org/apache/gravitino/server/web/ui/WebUIFilter.java` line 
39-40:
   ```java
   String path = httpRequest.getRequestURI();
   String lastPathSegment = path.substring(path.lastIndexOf("/") + 1); // NPE 
when path is null
   There is no null guard on path before it is used.
   
   Suggested fix: Add a null check before using path:
   
   String path = httpRequest.getRequestURI();
   if (path == null) {
     chain.doFilter(request, response);
     return;
   }
   
   
   ### Additional context
   
    The exception is caught by Jetty and logged as WARN, so the server does not 
crash. However, affected requests will receive a 500 error response. The issue 
was observed approximately 15 minutes after server startup, suggesting it is 
triggered by a specific client request pattern rather than occurring at startup.
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to