diff --git a/jetty-ee10/jetty-ee10-servlet/src/main/java/org/eclipse/jetty/ee10/servlet/ServletRequestHttpWrapper.java b/jetty-ee10/jetty-ee10-servlet/src/main/java/org/eclipse/jetty/ee10/servlet/ServletRequestHttpWrapper.java index 29c559e5901..638b0ec7f46 100644 --- a/jetty-ee10/jetty-ee10-servlet/src/main/java/org/eclipse/jetty/ee10/servlet/ServletRequestHttpWrapper.java +++ b/jetty-ee10/jetty-ee10-servlet/src/main/java/org/eclipse/jetty/ee10/servlet/ServletRequestHttpWrapper.java @@ -43,188 +43,186 @@ public class ServletRequestHttpWrapper extends ServletRequestWrapper implements @Override public String getAuthType() { - return null; + throw new UnsupportedOperationException(); } @Override public Cookie[] getCookies() { - return null; + throw new UnsupportedOperationException(); } @Override public long getDateHeader(String name) { - return 0; + throw new UnsupportedOperationException(); } @Override public String getHeader(String name) { - return null; - } - - @Override - public Enumeration getHeaders(String name) - { - return null; + throw new UnsupportedOperationException(); } @Override public Enumeration getHeaderNames() { - return null; + throw new UnsupportedOperationException(); + } + + @Override + public Enumeration getHeaders(String name) + { + throw new UnsupportedOperationException(); } @Override public int getIntHeader(String name) { - return 0; + throw new UnsupportedOperationException(); } @Override public String getMethod() { - return null; + throw new UnsupportedOperationException(); } @Override public String getPathInfo() { - return null; + throw new UnsupportedOperationException(); } @Override public String getPathTranslated() { - return null; + throw new UnsupportedOperationException(); } @Override public String getContextPath() { - return null; + throw new UnsupportedOperationException(); } @Override public String getQueryString() { - return null; + throw new UnsupportedOperationException(); } @Override public String getRemoteUser() { - return null; + throw new UnsupportedOperationException(); } @Override public boolean isUserInRole(String role) { - return false; + throw new UnsupportedOperationException(); } @Override public Principal getUserPrincipal() { - return null; + throw new UnsupportedOperationException(); } @Override public String getRequestedSessionId() { - return null; + throw new UnsupportedOperationException(); } @Override public String getRequestURI() { - return null; + throw new UnsupportedOperationException(); } @Override public StringBuffer getRequestURL() { - return null; + throw new UnsupportedOperationException(); } @Override public String getServletPath() { - return null; + throw new UnsupportedOperationException(); } @Override public HttpSession getSession(boolean create) { - return null; + throw new UnsupportedOperationException(); } @Override public HttpSession getSession() { - return null; + throw new UnsupportedOperationException(); } @Override public boolean isRequestedSessionIdValid() { - return false; + throw new UnsupportedOperationException(); } @Override public boolean isRequestedSessionIdFromCookie() { - return false; + throw new UnsupportedOperationException(); } @Override public boolean isRequestedSessionIdFromURL() { - return false; + throw new UnsupportedOperationException(); } @Override public boolean authenticate(HttpServletResponse response) throws IOException, ServletException { - return false; + throw new UnsupportedOperationException(); } @Override public Part getPart(String name) throws IOException, ServletException { - return null; + throw new UnsupportedOperationException(); } @Override public Collection getParts() throws IOException, ServletException { - return null; + throw new UnsupportedOperationException(); } @Override public void login(String username, String password) throws ServletException { - + throw new UnsupportedOperationException(); } @Override public void logout() throws ServletException { - + throw new UnsupportedOperationException(); } @Override public String changeSessionId() { - // TODO 3.1 Auto-generated method stub - return null; + throw new UnsupportedOperationException(); } @Override public T upgrade(Class handlerClass) throws IOException, ServletException { - // TODO 3.1 Auto-generated method stub - return null; + throw new UnsupportedOperationException(); } } diff --git a/jetty-ee10/jetty-ee10-servlet/src/test/java/org/eclipse/jetty/ee10/servlet/DispatcherTest.java b/jetty-ee10/jetty-ee10-servlet/src/test/java/org/eclipse/jetty/ee10/servlet/DispatcherTest.java index c465662cdbd..07dcfbb1eca 100644 --- a/jetty-ee10/jetty-ee10-servlet/src/test/java/org/eclipse/jetty/ee10/servlet/DispatcherTest.java +++ b/jetty-ee10/jetty-ee10-servlet/src/test/java/org/eclipse/jetty/ee10/servlet/DispatcherTest.java @@ -411,6 +411,66 @@ public class DispatcherTest assertEquals(expected, responses); } + @Test + public void testServletIncludeWelcome() throws Exception + { + _server.stop(); + _contextHandler.setWelcomeFiles(new String[] {"index.x"}); + _contextHandler.addServlet(DispatchServletServlet.class, "/dispatch/*"); + ServletHolder defaultHolder = _contextHandler.addServlet(DefaultServlet.class, "/"); + defaultHolder.setInitParameter("welcomeServlets", "true"); + _contextHandler.addServlet(RogerThatServlet.class, "*.x"); + _server.start(); + + String rawResponse = _connector.getResponse(""" + GET /context/r/ HTTP/1.0\r + Host: localhost\r + Connection: close\r + \r + """); + + String expected = """ + HTTP/1.1 200 OK\r + Content-Length: 11\r + \r + Roger That!"""; + + assertEquals(expected, rawResponse); + + + // direct include + rawResponse = _connector.getResponse(""" + GET /context/dispatch/test?include=/index.x HTTP/1.0\r + Host: localhost\r + Connection: close\r + \r + """); + + expected = """ + HTTP/1.1 200 OK\r + Content-Length: 11\r + \r + Roger That!"""; + + assertEquals(expected, rawResponse); + + // include through welcome file based on servlet mapping + rawResponse = _connector.getResponse(""" + GET /context/dispatch/test?include=/r/ HTTP/1.0\r + Host: localhost\r + Connection: close\r + \r + """); + + expected = """ + HTTP/1.1 200 OK\r + Content-Length: 11\r + \r + Roger That!"""; + + assertEquals(expected, rawResponse); + } + public static Stream includeTests() { return Stream.of( @@ -1142,13 +1202,13 @@ public class DispatcherTest if (request.getParameter("include") != null) { dispatcher = getServletContext().getRequestDispatcher(request.getParameter("include")); - dispatcher.include(new ServletRequestWrapper(request), new ServletResponseWrapper(response)); + dispatcher.include(new HttpServletRequestWrapper(request), new HttpServletResponseWrapper(response)); } else if (request.getParameter("forward") != null) { dispatcher = getServletContext().getRequestDispatcher(request.getParameter("forward")); if (dispatcher != null) - dispatcher.forward(new ServletRequestWrapper(request), new ServletResponseWrapper(response)); + dispatcher.forward(new HttpServletRequestWrapper(request), new HttpServletResponseWrapper(response)); else response.sendError(404); } diff --git a/jetty-ee10/jetty-ee10-servlet/src/test/java/org/eclipse/jetty/ee10/servlet/ServletWrapperTest.java b/jetty-ee10/jetty-ee10-servlet/src/test/java/org/eclipse/jetty/ee10/servlet/ServletWrapperTest.java index d68801f0453..eae57dcff02 100644 --- a/jetty-ee10/jetty-ee10-servlet/src/test/java/org/eclipse/jetty/ee10/servlet/ServletWrapperTest.java +++ b/jetty-ee10/jetty-ee10-servlet/src/test/java/org/eclipse/jetty/ee10/servlet/ServletWrapperTest.java @@ -22,7 +22,9 @@ import jakarta.servlet.FilterChain; import jakarta.servlet.FilterConfig; import jakarta.servlet.ServletException; import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletRequestWrapper; import jakarta.servlet.ServletResponse; +import jakarta.servlet.ServletResponseWrapper; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequestWrapper; @@ -43,9 +45,10 @@ public class ServletWrapperTest { private Server server; private LocalConnector localConnector; + ServletContextHandler context; @BeforeEach - public void startServer() throws Exception + public void initServer() throws Exception { server = new Server(); @@ -56,16 +59,8 @@ public class ServletWrapperTest connector.setPort(0); server.addConnector(connector); - ServletContextHandler context = new ServletContextHandler(); + context = new ServletContextHandler(); context.setContextPath("/"); - - ServletHolder servletHolder = context.addServlet(HelloServlet.class, "/hello"); - servletHolder.setAsyncSupported(false); - FilterHolder filterHolder = context.addFilter(WrapFilter.class, "/*", EnumSet.of(DispatcherType.REQUEST)); - filterHolder.setAsyncSupported(true); - - server.setHandler(context); - server.start(); } @AfterEach @@ -77,6 +72,14 @@ public class ServletWrapperTest @Test public void testWrapper() throws Exception { + ServletHolder servletHolder = context.addServlet(HelloServlet.class, "/hello"); + servletHolder.setAsyncSupported(false); + FilterHolder filterHolder = context.addFilter(NoopRequestWrapperFilter.class, "/*", EnumSet.of(DispatcherType.REQUEST)); + filterHolder.setAsyncSupported(true); + + server.setHandler(context); + server.start(); + StringBuilder req = new StringBuilder(); req.append("GET /hello HTTP/1.1\r\n"); req.append("Host: local\r\n"); @@ -88,6 +91,27 @@ public class ServletWrapperTest assertThat("Response.status", resp.getStatus(), is(200)); } + @Test + public void testServletRequestHttpWrapper() throws Exception + { + ServletHolder servletHolder = context.addServlet(WrappedRequestServlet.class, "/test"); + FilterHolder filterHolder = context.addFilter(ServletRequestHttpWrapperFilter.class, "/*", EnumSet.of(DispatcherType.REQUEST)); + + server.setHandler(context); + server.start(); + + StringBuilder req = new StringBuilder(); + req.append("GET /test HTTP/1.1\r\n"); + req.append("Host: local\r\n"); + req.append("Connection: close\r\n"); + req.append("\r\n"); + + String rawResponse = localConnector.getResponse(req.toString()); + HttpTester.Response resp = HttpTester.parseResponse(rawResponse); + assertThat("Response.status", resp.getStatus(), is(200)); + assertThat(resp.getContent(), is("Serviced!\n")); + } + public static class HelloServlet extends HttpServlet { @Override @@ -99,7 +123,25 @@ public class ServletWrapperTest } } - public static class WrapFilter implements Filter + public static class WrappedRequestServlet extends HttpServlet + { + @Override + public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException + { + res.getWriter().println("Serviced!"); + } + } + + public static class ServletRequestHttpWrapperFilter implements Filter + { + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException + { + chain.doFilter(new ServletRequestWrapper(request), new ServletResponseWrapper(response)); + } + } + + public static class NoopRequestWrapperFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException diff --git a/jetty-ee10/jetty-ee10-servlet/src/test/resources/contextResources/r/dot b/jetty-ee10/jetty-ee10-servlet/src/test/resources/contextResources/r/dot new file mode 100644 index 00000000000..c3927bfb737 --- /dev/null +++ b/jetty-ee10/jetty-ee10-servlet/src/test/resources/contextResources/r/dot @@ -0,0 +1 @@ +Do Not Delete diff --git a/jetty-ee9/jetty-ee9-nested/src/main/java/org/eclipse/jetty/ee9/nested/ServletRequestHttpWrapper.java b/jetty-ee9/jetty-ee9-nested/src/main/java/org/eclipse/jetty/ee9/nested/ServletRequestHttpWrapper.java index 7d83a25b986..2807a63bc9b 100644 --- a/jetty-ee9/jetty-ee9-nested/src/main/java/org/eclipse/jetty/ee9/nested/ServletRequestHttpWrapper.java +++ b/jetty-ee9/jetty-ee9-nested/src/main/java/org/eclipse/jetty/ee9/nested/ServletRequestHttpWrapper.java @@ -40,198 +40,196 @@ public class ServletRequestHttpWrapper extends ServletRequestWrapper implements super(request); } + @Override + public boolean authenticate(HttpServletResponse response) throws IOException, ServletException + { + throw new UnsupportedOperationException(); + } + + @Override + public String changeSessionId() + { + throw new UnsupportedOperationException(); + } + @Override public String getAuthType() { - return null; - } - - @Override - public Cookie[] getCookies() - { - return null; - } - - @Override - public long getDateHeader(String name) - { - return 0; - } - - @Override - public String getHeader(String name) - { - return null; - } - - @Override - public Enumeration getHeaders(String name) - { - return null; - } - - @Override - public Enumeration getHeaderNames() - { - return null; - } - - @Override - public int getIntHeader(String name) - { - return 0; - } - - @Override - public String getMethod() - { - return null; - } - - @Override - public String getPathInfo() - { - return null; - } - - @Override - public String getPathTranslated() - { - return null; + throw new UnsupportedOperationException(); } @Override public String getContextPath() { - return null; + throw new UnsupportedOperationException(); + } + + @Override + public Cookie[] getCookies() + { + throw new UnsupportedOperationException(); + } + + @Override + public long getDateHeader(String name) + { + throw new UnsupportedOperationException(); + } + + @Override + public String getHeader(String name) + { + throw new UnsupportedOperationException(); + } + + @Override + public Enumeration getHeaderNames() + { + throw new UnsupportedOperationException(); + } + + @Override + public Enumeration getHeaders(String name) + { + throw new UnsupportedOperationException(); + } + + @Override + public int getIntHeader(String name) + { + throw new UnsupportedOperationException(); + } + + @Override + public String getMethod() + { + throw new UnsupportedOperationException(); + } + + @Override + public Part getPart(String name) throws IOException, ServletException + { + throw new UnsupportedOperationException(); + } + + @Override + public Collection getParts() throws IOException, ServletException + { + throw new UnsupportedOperationException(); + } + + @Override + public String getPathInfo() + { + throw new UnsupportedOperationException(); + } + + @Override + public String getPathTranslated() + { + throw new UnsupportedOperationException(); } @Override public String getQueryString() { - return null; + throw new UnsupportedOperationException(); } @Override public String getRemoteUser() { - return null; - } - - @Override - public boolean isUserInRole(String role) - { - return false; - } - - @Override - public Principal getUserPrincipal() - { - return null; - } - - @Override - public String getRequestedSessionId() - { - return null; + throw new UnsupportedOperationException(); } @Override public String getRequestURI() { - return null; + throw new UnsupportedOperationException(); } @Override public StringBuffer getRequestURL() { - return null; + throw new UnsupportedOperationException(); + } + + @Override + public String getRequestedSessionId() + { + throw new UnsupportedOperationException(); } @Override public String getServletPath() { - return null; + throw new UnsupportedOperationException(); } @Override public HttpSession getSession(boolean create) { - return null; + throw new UnsupportedOperationException(); } @Override public HttpSession getSession() { - return null; + throw new UnsupportedOperationException(); } @Override - public boolean isRequestedSessionIdValid() + public Principal getUserPrincipal() { - return false; + throw new UnsupportedOperationException(); } @Override public boolean isRequestedSessionIdFromCookie() { - return false; + throw new UnsupportedOperationException(); } @Override public boolean isRequestedSessionIdFromURL() { - return false; + throw new UnsupportedOperationException(); } @Override @Deprecated(since = "Servlet API 2.1") public boolean isRequestedSessionIdFromUrl() { - return false; + throw new UnsupportedOperationException(); } @Override - public boolean authenticate(HttpServletResponse response) throws IOException, ServletException + public boolean isRequestedSessionIdValid() { - return false; + throw new UnsupportedOperationException(); } @Override - public Part getPart(String name) throws IOException, ServletException + public boolean isUserInRole(String role) { - return null; - } - - @Override - public Collection getParts() throws IOException, ServletException - { - return null; + throw new UnsupportedOperationException(); } @Override public void login(String username, String password) throws ServletException { - + throw new UnsupportedOperationException(); } @Override public void logout() throws ServletException { - - } - - @Override - public String changeSessionId() - { - // TODO 3.1 Auto-generated method stub - return null; + throw new UnsupportedOperationException(); } @Override public T upgrade(Class handlerClass) throws IOException, ServletException { - // TODO 3.1 Auto-generated method stub - return null; + throw new UnsupportedOperationException(); } } diff --git a/jetty-ee9/jetty-ee9-servlet/src/test/java/org/eclipse/jetty/ee9/servlet/DispatcherTest.java b/jetty-ee9/jetty-ee9-servlet/src/test/java/org/eclipse/jetty/ee9/servlet/DispatcherTest.java index d81ac1df802..598cdbd1480 100644 --- a/jetty-ee9/jetty-ee9-servlet/src/test/java/org/eclipse/jetty/ee9/servlet/DispatcherTest.java +++ b/jetty-ee9/jetty-ee9-servlet/src/test/java/org/eclipse/jetty/ee9/servlet/DispatcherTest.java @@ -418,6 +418,67 @@ public class DispatcherTest } } + @Test + public void testServletIncludeWelcome() throws Exception + { + createDefaultContextHandlerCollection(); + _contextHandler.setWelcomeFiles(new String[] {"index.x"}); + _contextHandler.addServlet(DispatchServletServlet.class, "/dispatch/*"); + ServletHolder defaultHolder = _contextHandler.addServlet(DefaultServlet.class, "/"); + defaultHolder.setInitParameter("welcomeServlets", "true"); + _contextHandler.addServlet(RogerThatServlet.class, "*.x"); + createServer(_contextCollection); + _server.start(); + + String rawResponse = _connector.getResponse(""" + GET /context/r/ HTTP/1.0\r + Host: localhost\r + Connection: close\r + \r + """); + + String expected = """ + HTTP/1.1 200 OK\r + Content-Length: 11\r + \r + Roger That!"""; + + assertEquals(expected, rawResponse); + + + // direct include + rawResponse = _connector.getResponse(""" + GET /context/dispatch/test?include=/index.x HTTP/1.0\r + Host: localhost\r + Connection: close\r + \r + """); + + expected = """ + HTTP/1.1 200 OK\r + Content-Length: 11\r + \r + Roger That!"""; + + assertEquals(expected, rawResponse); + + // include through welcome file based on servlet mapping + rawResponse = _connector.getResponse(""" + GET /context/dispatch/test?include=/r/ HTTP/1.0\r + Host: localhost\r + Connection: close\r + \r + """); + + expected = """ + HTTP/1.1 200 OK\r + Content-Length: 11\r + \r + Roger That!"""; + + assertEquals(expected, rawResponse); + } + @Test public void testInclude() throws Exception { @@ -1003,13 +1064,13 @@ public class DispatcherTest if (request.getParameter("include") != null) { dispatcher = getServletContext().getRequestDispatcher(request.getParameter("include")); - dispatcher.include(new ServletRequestWrapper(request), new ServletResponseWrapper(response)); + dispatcher.include(new HttpServletRequestWrapper(request), new HttpServletResponseWrapper(response)); } else if (request.getParameter("forward") != null) { dispatcher = getServletContext().getRequestDispatcher(request.getParameter("forward")); if (dispatcher != null) - dispatcher.forward(new ServletRequestWrapper(request), new ServletResponseWrapper(response)); + dispatcher.forward(new HttpServletRequestWrapper(request), new HttpServletResponseWrapper(response)); else response.sendError(404); } diff --git a/jetty-ee9/jetty-ee9-servlet/src/test/resources/contextResources/r/dot b/jetty-ee9/jetty-ee9-servlet/src/test/resources/contextResources/r/dot new file mode 100644 index 00000000000..c3927bfb737 --- /dev/null +++ b/jetty-ee9/jetty-ee9-servlet/src/test/resources/contextResources/r/dot @@ -0,0 +1 @@ +Do Not Delete