Skip to content
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

NPE when forwarding a request to default servlet which should redirect to a subdirectory with trailing slash #10558

Closed
grgrzybek opened this issue Sep 20, 2023 · 5 comments
Assignees
Labels
Bug For general bugs on Jetty side

Comments

@grgrzybek
Copy link
Contributor

Jetty version(s)
12.0.1

Java version/vendor (use: java -version)

$ java -version
java version "17.0.8" 2023-07-18 LTS
Java(TM) SE Runtime Environment (build 17.0.8+9-LTS-211)
Java HotSpot(TM) 64-Bit Server VM (build 17.0.8+9-LTS-211, mixed mode, sharing)

OS type/version

$ uname -srv
Linux 6.4.15-200.fc38.x86_64 #1 SMP PREEMPT_DYNAMIC Thu Sep  7 00:25:01 UTC 2023

Description
When forwarding a request to default servlet using a directory without trailing slash and with welcome files configured, instead of getting redirect to such directory with trailing slash (so welcome file resolution happens after redirect), I'm getting NPE:

java.lang.NullPointerException: Cannot invoke "String.length()" because "s" is null
	at org.eclipse.jetty.util/org.eclipse.jetty.util.AbstractTrie.get(AbstractTrie.java:66)
	at org.eclipse.jetty.server/org.eclipse.jetty.server.Request.getServerPort(Request.java:459)
	at org.eclipse.jetty.server/org.eclipse.jetty.server.Request.toRedirectURI(Request.java:572)
	at org.eclipse.jetty.server/org.eclipse.jetty.server.Response.sendRedirect(Response.java:317)
	at org.eclipse.jetty.server/org.eclipse.jetty.server.Response.sendRedirect(Response.java:265)
	at org.eclipse.jetty.server/org.eclipse.jetty.server.Response.sendRedirect(Response.java:243)
	at org.eclipse.jetty.server/org.eclipse.jetty.server.ResourceService.sendRedirect(ResourceService.java:239)
	at org.eclipse.jetty.server/org.eclipse.jetty.server.ResourceService.sendWelcome(ResourceService.java:465)
	at org.eclipse.jetty.server/org.eclipse.jetty.server.ResourceService.doGet(ResourceService.java:174)
	at org.eclipse.jetty.ee10.servlet/org.eclipse.jetty.ee10.servlet.DefaultServlet.doGet(DefaultServlet.java:534)
	at [email protected]/jakarta.servlet.http.HttpServlet.service(HttpServlet.java:527)
	at [email protected]/jakarta.servlet.http.HttpServlet.service(HttpServlet.java:614)
	at org.eclipse.jetty.ee10.servlet/org.eclipse.jetty.ee10.servlet.ServletHolder.handle(ServletHolder.java:736)
	at org.eclipse.jetty.ee10.servlet/org.eclipse.jetty.ee10.servlet.ServletHandler$ChainEnd.doFilter(ServletHandler.java:1608)
	at org.eclipse.jetty.ee10.servlet/org.eclipse.jetty.ee10.servlet.ServletHandler$MappedServlet.handle(ServletHandler.java:1541)
	at org.eclipse.jetty.ee10.servlet/org.eclipse.jetty.ee10.servlet.Dispatcher.forward(Dispatcher.java:124)
	at org.eclipse.jetty.ee10.servlet/org.eclipse.jetty.ee10.servlet.DispatcherTest$ForwardServlet.doGet(DispatcherTest.java:1057)
	at [email protected]/jakarta.servlet.http.HttpServlet.service(HttpServlet.java:527)
	at [email protected]/jakarta.servlet.http.HttpServlet.service(HttpServlet.java:614)
	at org.eclipse.jetty.ee10.servlet/org.eclipse.jetty.ee10.servlet.ServletHolder.handle(ServletHolder.java:736)
	at org.eclipse.jetty.ee10.servlet/org.eclipse.jetty.ee10.servlet.ServletHandler$ChainEnd.doFilter(ServletHandler.java:1608)
	at org.eclipse.jetty.ee10.servlet/org.eclipse.jetty.ee10.servlet.ServletHandler$MappedServlet.handle(ServletHandler.java:1541)
	at org.eclipse.jetty.ee10.servlet/org.eclipse.jetty.ee10.servlet.ServletChannel.dispatch(ServletChannel.java:885)
	at org.eclipse.jetty.ee10.servlet/org.eclipse.jetty.ee10.servlet.ServletChannel.handle(ServletChannel.java:490)
	at org.eclipse.jetty.ee10.servlet/org.eclipse.jetty.ee10.servlet.ServletHandler.handle(ServletHandler.java:463)
	at org.eclipse.jetty.server/org.eclipse.jetty.server.handler.ContextHandler.handle(ContextHandler.java:811)
	at org.eclipse.jetty.server/org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:177)
	at org.eclipse.jetty.server/org.eclipse.jetty.server.Handler$Wrapper.handle(Handler.java:712)
	at org.eclipse.jetty.server/org.eclipse.jetty.server.Server.handle(Server.java:176)
	at org.eclipse.jetty.server/org.eclipse.jetty.server.internal.HttpChannelState$HandlerInvoker.run(HttpChannelState.java:648)
	at org.eclipse.jetty.server/org.eclipse.jetty.server.internal.HttpConnection.onFillable(HttpConnection.java:471)
	at org.eclipse.jetty.io/org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:322)
	at org.eclipse.jetty.io/org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:100)
	at org.eclipse.jetty.io/org.eclipse.jetty.io.ByteArrayEndPoint.lambda$new$0(ByteArrayEndPoint.java:58)
	at org.eclipse.jetty.util/org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:969)
	at org.eclipse.jetty.util/org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.doRunJob(QueuedThreadPool.java:1194)
	at org.eclipse.jetty.util/org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:1149)
	at java.base/java.lang.Thread.run(Thread.java:833)

The problem is that I have an instance of org.eclipse.jetty.ee10.servlet.Dispatcher$ForwardRequest like this:

request = {org.eclipse.jetty.ee10.servlet.ServletCoreRequest@3063} 
 _httpFields: org.eclipse.jetty.http.HttpFields  = {org.eclipse.jetty.http.ImmutableHttpFields@3068} "Connection: close\r\nHost: local\r\n\r\n"
 _servletContextRequest: org.eclipse.jetty.ee10.servlet.ServletContextRequest  = {org.eclipse.jetty.ee10.servlet.ServletContextRequest@3067} 
 _servletRequest: jakarta.servlet.http.HttpServletRequest  = {org.eclipse.jetty.ee10.servlet.Dispatcher$ForwardRequest@3066} 
  _httpServletRequest: jakarta.servlet.http.HttpServletRequest  = {org.eclipse.jetty.ee10.servlet.ServletApiRequest@3404} 
  _params: org.eclipse.jetty.util.MultiMap  = null
  org.eclipse.jetty.ee10.servlet.Dispatcher$ParameterRequestWrapper.this$0: org.eclipse.jetty.ee10.servlet.Dispatcher  = {org.eclipse.jetty.ee10.servlet.Dispatcher@3405} "Dispatcher@0x5e43b83c{null,/context/subdir}"
  request: jakarta.servlet.ServletRequest  = {org.eclipse.jetty.ee10.servlet.ServletApiRequest@3404} 
  this$0: org.eclipse.jetty.ee10.servlet.Dispatcher  = {org.eclipse.jetty.ee10.servlet.Dispatcher@3405} "Dispatcher@0x5e43b83c{null,/context/subdir}"
 _uri: org.eclipse.jetty.http.HttpURI  = {org.eclipse.jetty.http.HttpURI$Immutable@3064} "/context/subdir?do=req.echo&uri=/subdir"

and org.eclipse.jetty.server.Request#getServerPort() uses:

// Is there a scheme with a default port?
HttpScheme scheme = HttpScheme.CACHE.get(request.getHttpURI().getScheme());

and this ServletCoreRequest@3063 has this _uri:

result = {org.eclipse.jetty.http.HttpURI$Immutable@3064} "/context/subdir?do=req.echo&uri=/subdir"
 _canonicalPath: java.lang.String  = {@3421} "/context/subdir"
 _fragment: java.lang.String  = null
 _host: java.lang.String  = null
 _param: java.lang.String  = null
 _path: java.lang.String  = {@3421} "/context/subdir"
 _port: int  = -1
 _query: java.lang.String  = {@3422} "do=req.echo&uri=/subdir"
 _scheme: java.lang.String  = null
 _uri: java.lang.String  = {@3065} "/context/subdir?do=req.echo&uri=/subdir"
 _user: java.lang.String  = null
 _violations: java.util.EnumSet  = {java.util.RegularEnumSet@3423}  size = 0

How to reproduce?

I've prepared a unit test using current jetty-12.0.x branch here: grgrzybek@066c2ca

This is part of my continued work after #9910 has been explained.

@grgrzybek grgrzybek added the Bug For general bugs on Jetty side label Sep 20, 2023
@janbartel
Copy link
Contributor

@grgrzybek yep, this is an issue. PR is on the way.

@janbartel
Copy link
Contributor

See PR #10560

@janbartel janbartel self-assigned this Sep 21, 2023
@janbartel janbartel moved this to 🏗 In progress in Jetty 12.0.3 Sep 21, 2023
@grgrzybek
Copy link
Contributor Author

Thank you for quick response!

janbartel added a commit that referenced this issue Sep 23, 2023
* Issue #10558 Fix ee10 redirect during forward, add ee9 test
@janbartel
Copy link
Contributor

Fixed via #10560

@github-project-automation github-project-automation bot moved this from 🏗 In progress to ✅ Done in Jetty 12.0.3 Sep 24, 2023
@grgrzybek
Copy link
Contributor Author

Thanks - I checked in Pax Web and everything works perfectly!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Bug For general bugs on Jetty side
Projects
No open projects
Status: ✅ Done
Development

No branches or pull requests

2 participants