google / google/guice

guice-servlet fails on welcome files: wrong pathInfo.

Open
#1,002 0 comments 0 reactions 0 assignees View on GitHub
Dominant language
Java
Stars
12.7k
Forks
1.7k
Avg merge
11m
Merged PRs (30d)
2

Description

I'm not sure whether this bug is in Jetty or Guice-Servlet.
Guice Servlet 4.0
Jetty 9.3.7.v20160115 (servlet-api-3.1.0)

This may or may not relate to or even caused by #372.

Having this config:

``` java
serve("/", "index.html")
.with(new org.eclipse.jetty.servlet.DefaultServlet());
```

and handling `GET /` request, DefaultServlet forwards it to welcome file to path "index.html".
Guice-servlet wraps the forwarded request and sets newRequestUri=="index.html", but with the same servletPath=="/" and null pathInfo.
So when DefaultServlet() sees the forwarded request again, it sums servletPath + pathInfo and gets "/" again, not "index.html", falling into infinite loop. Here's the stacktrace:

```
java.lang.StackOverflowError
...
at javax.servlet.ServletRequestWrapper.removeAttribute(ServletRequestWrapper.java:302)
at javax.servlet.ServletRequestWrapper.removeAttribute(ServletRequestWrapper.java:302)
at javax.servlet.ServletRequestWrapper.removeAttribute(ServletRequestWrapper.java:302)
at javax.servlet.ServletRequestWrapper.removeAttribute(ServletRequestWrapper.java:302)
at com.google.inject.servlet.ManagedServletPipeline$1.doServiceImpl(ManagedServletPipeline.java:156)
at com.google.inject.servlet.ManagedServletPipeline$1.forward(ManagedServletPipeline.java:140)
at org.eclipse.jetty.servlet.DefaultServlet.sendWelcome(DefaultServlet.java:600)
at org.eclipse.jetty.servlet.DefaultServlet.doGet(DefaultServlet.java:486)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:687)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
at com.google.inject.servlet.ServletDefinition.doServiceImpl(ServletDefinition.java:287)
at com.google.inject.servlet.ServletDefinition.doService(ServletDefinition.java:277)
at com.google.inject.servlet.ManagedServletPipeline$1.doServiceImpl(ManagedServletPipeline.java:154)
at com.google.inject.servlet.ManagedServletPipeline$1.forward(ManagedServletPipeline.java:140)
at org.eclipse.jetty.servlet.DefaultServlet.sendWelcome(DefaultServlet.java:600)
at org.eclipse.jetty.servlet.DefaultServlet.doGet(DefaultServlet.java:486)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:687)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
at com.google.inject.servlet.ServletDefinition.doServiceImpl(ServletDefinition.java:287)
at com.google.inject.servlet.ServletDefinition.doService(ServletDefinition.java:277)
at com.google.inject.servlet.ManagedServletPipeline$1.doServiceImpl(ManagedServletPipeline.java:154)
at com.google.inject.servlet.ManagedServletPipeline$1.forward(ManagedServletPipeline.java:140)
at org.eclipse.jetty.servlet.DefaultServlet.sendWelcome(DefaultServlet.java:600)
at org.eclipse.jetty.servlet.DefaultServlet.doGet(DefaultServlet.java:486)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:687)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
at com.google.inject.servlet.ServletDefinition.doServiceImpl(ServletDefinition.java:287)
at com.google.inject.servlet.ServletDefinition.doService(ServletDefinition.java:277)
at com.google.inject.servlet.ManagedServletPipeline$1.doServiceImpl(ManagedServletPipeline.java:154)
at com.google.inject.servlet.ManagedServletPipeline$1.forward(ManagedServletPipeline.java:140)
at org.eclipse.jetty.servlet.DefaultServlet.sendWelcome(DefaultServlet.java:600)
at org.eclipse.jetty.servlet.DefaultServlet.doGet(DefaultServlet.java:486)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:687)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
at com.google.inject.servlet.ServletDefinition.doServiceImpl(ServletDefinition.java:287)
at com.google.inject.servlet.ServletDefinition.doService(ServletDefinition.java:277)
at com.google.inject.servlet.ManagedServletPipeline$1.doServiceImpl(ManagedServletPipeline.java:154)
at com.google.inject.servlet.ManagedServletPipeline$1.forward(ManagedServletPipeline.java:140)
at org.eclipse.jetty.servlet.DefaultServlet.sendWelcome(DefaultServlet.java:600)
at org.eclipse.jetty.servlet.DefaultServlet.doGet(DefaultServlet.java:486)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:687)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
at com.google.inject.servlet.ServletDefinition.doServiceImpl(ServletDefinition.java:287)
at com.google.inject.servlet.ServletDefinition.doService(ServletDefinition.java:277)
at com.google.inject.servlet.ManagedServletPipeline$1.doServiceImpl(ManagedServletPipeline.java:154)
at com.google.inject.servlet.ManagedServletPipeline$1.forward(ManagedServletPipeline.java:140)
at org.eclipse.jetty.servlet.DefaultServlet.sendWelcome(DefaultServlet.java:600)
at org.eclipse.jetty.servlet.DefaultServlet.doGet(DefaultServlet.java:486)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:687)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
at com.google.inject.servlet.ServletDefinition.doServiceImpl(ServletDefinition.java:287)
```

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.