Skip to content

Commit

Permalink
Fixes #22079 (#22081)
Browse files Browse the repository at this point in the history
modified:   appserver/tests/appserv-tests/devtests/web/servlet-4.0/mappingDiscovery/WebTest.java

- Change AAsyncDispatchToC case to correctly match specified behavior.

- Add BIncludeDispatchServletNamedDispatcher to combine include, async,
  and named dispatcher cases.

- Add these tests to assertions.

modified:   appserver/tests/appserv-tests/devtests/web/servlet-4.0/mappingDiscovery/descriptor/web.xml

- Add BIncludeDispatchServletNamedDispatcher

new file:   appserver/tests/appserv-tests/devtests/web/servlet-4.0/mappingDiscovery/servlet/BIncludeDispatchServletNamedDispatcher.java

- combines include, async, and named dispatcher cases.

modified:   appserver/tests/appserv-tests/devtests/web/servlet-4.0/mappingDiscovery/servlet/DispatchServlet.java

- Dispatch async to ServletC rather than TestServlet.

- Added logging.

deleted:    appserver/tests/appserv-tests/devtests/web/servlet-4.0/mappingDiscovery/servlet/TestServlet.java

- No need for this.

modified:   appserver/web/web-core/src/main/java/org/apache/catalina/core/ApplicationDispatcher.java

- The actual bug fix!  If DispatcherType is ASYNC, overwrite the mapping
  reference with the one from the original request.
  • Loading branch information
Edward Burns authored and yaminikb committed Jul 20, 2017
1 parent 1365c33 commit a559328
Show file tree
Hide file tree
Showing 6 changed files with 157 additions and 94 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -87,10 +87,13 @@ public static void main(String[] args) {
extensionMatch &&
pathMatch)? stat.PASS : stat.FAIL));

boolean asyncMatch = webTest.run("GET", 200, false, "/AAsyncDispatchToC", ".*ServletC.MappingImpl\\{matchValue=ServletC.*pattern=/ServletC.*servletName=ServletC,.*mappingMatch=EXACT\\}.*FORWARD_MAPPING: null.*INCLUDE_MAPPING: null.*ASYNC_MAPPING:.*MappingImpl\\{matchValue=AAsyncDispatchToC.*pattern=/AAsyncDispatchToC.*servletName=AAsyncDispatchToC.*mappingMatch=EXACT}.*");
boolean asyncMatch1 = webTest.run("GET", 200, false, "/AAsyncDispatchToC", ".*ServletC.MappingImpl\\{matchValue=AAsyncDispatchToC.*pattern=/AAsyncDispatchToC.*servletName=AAsyncDispatchToC,.*mappingMatch=EXACT\\}.*FORWARD_MAPPING: null.*INCLUDE_MAPPING: null.*ASYNC_MAPPING:.*MappingImpl\\{matchValue=AAsyncDispatchToC.*pattern=/AAsyncDispatchToC.*servletName=AAsyncDispatchToC.*mappingMatch=EXACT}.*");

boolean asyncMatch2 = webTest.run("GET", 200, false, "/BIncludeDispatchServletNamedDispatcher", ".*In.ServletC.MappingImpl\\{matchValue=BIncludeDispatchServletNamedDispatcher,.pattern=/BIncludeDispatchServletNamedDispatcher,.servletName=BIncludeDispatchServletNamedDispatcher,.mappingMatch=EXACT\\}.*FORWARD_MAPPING:.null.*INCLUDE_MAPPING:.null.*ASYNC_MAPPING:.MappingImpl\\{matchValue=BIncludeDispatchServletNamedDispatcher,.pattern=/BIncludeDispatchServletNamedDispatcher,.servletName=BIncludeDispatchServletNamedDispatcher,.mappingMatch=EXACT\\}.*");

stat.addStatus(TEST_NAME + "-async",
asyncMatch ? stat.PASS : stat.FAIL);
asyncMatch1 &&
asyncMatch2 ? stat.PASS : stat.FAIL);

boolean forwardMatch1 = webTest.run("GET", 200, false, "/AForwardToB", ".*ServletC.MappingImpl\\{matchValue=ServletC,.*pattern=/ServletC,.*servletName=ServletC,.*mappingMatch=EXACT\\}.*FORWARD_MAPPING:.MappingImpl\\{matchValue=AForwardToB,.pattern=/AForwardToB,.servletName=AForwardToB,.mappingMatch=EXACT\\}.*INCLUDE_MAPPING:.null.*ASYNC_MAPPING:.null.*");
boolean forwardMatch2 = webTest.run("GET", 200, false, "/BForwardToC", ".*ServletC.MappingImpl\\{matchValue=ServletC,.*pattern=/ServletC,.*servletName=ServletC,.*mappingMatch=EXACT\\}.*FORWARD_MAPPING:.MappingImpl\\{matchValue=BForwardToC,.pattern=/BForwardToC,.servletName=BForwardToC,.mappingMatch=EXACT\\}.*INCLUDE_MAPPING:.null.*ASYNC_MAPPING:.null.*");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,15 @@
<servlet-name>AAsyncDispatchToC</servlet-name>
<url-pattern>/AAsyncDispatchToC</url-pattern>
</servlet-mapping>

<servlet>
<servlet-name>BIncludeDispatchServletNamedDispatcher</servlet-name>
<servlet-class>BIncludeDispatchServletNamedDispatcher</servlet-class>
<async-supported>true</async-supported>
</servlet>
<servlet-mapping>
<servlet-name>BIncludeDispatchServletNamedDispatcher</servlet-name>
<url-pattern>/BIncludeDispatchServletNamedDispatcher</url-pattern>
</servlet-mapping>
<!-- getNamedDispatcher cases -->
<servlet>
<servlet-name>BForwardToCNamedDispatcher</servlet-name>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright (c) 2017 Oracle and/or its affiliates. All rights reserved.
*
* The contents of this file are subject to the terms of either the GNU
* General Public License Version 2 only ("GPL") or the Common Development
* and Distribution License("CDDL") (collectively, the "License"). You
* may not use this file except in compliance with the License. You can
* obtain a copy of the License at
* https://oss.oracle.com/licenses/CDDL+GPL-1.1
* or LICENSE.txt. See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each
* file and include the License file at LICENSE.txt.
*
* GPL Classpath Exception:
* Oracle designates this particular file as subject to the "Classpath"
* exception as provided by Oracle in the GPL Version 2 section of the License
* file that accompanied this code.
*
* Modifications:
* If applicable, add the following below the License Header, with the fields
* enclosed by brackets [] replaced by your own identifying information:
* "Portions Copyright [year] [name of copyright owner]"
*
* Contributor(s):
* If you wish your version of this file to be governed by only the CDDL or
* only the GPL Version 2, indicate your decision by adding "[Contributor]
* elects to include this software in this distribution under the [CDDL or GPL
* Version 2] license." If you don't indicate a single choice of license, a
* recipient has the option to distribute your version of this file under
* either the CDDL, the GPL Version 2 or to extend the choice of license to
* its licensees as provided above. However, if you add GPL Version 2 code
* and therefore, elected the GPL Version 2 license, then the option applies
* only if the new code is made subject to such option by the copyright
* holder.
*/

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.AsyncContext;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletMapping;

public class BIncludeDispatchServletNamedDispatcher extends HttpServlet {

/**
* Processes requests for both HTTP <code>GET</code> and <code>POST</code>
* methods.
*
* @param request servlet request
* @param response servlet response
* @throws ServletException if a servlet-specific error occurs
* @throws IOException if an I/O error occurs
*/
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.getServletContext().log(this.getClass().getSimpleName() + " "
+ request.getHttpServletMapping());
HttpServletMapping forwardMapping = (HttpServletMapping) request.getAttribute(RequestDispatcher.FORWARD_MAPPING);
request.getServletContext().log(this.getClass().getSimpleName() + " FORWARD_MAPPING attribute: "
+ forwardMapping);
HttpServletMapping includeMapping = (HttpServletMapping) request.getAttribute(RequestDispatcher.INCLUDE_MAPPING);
request.getServletContext().log(this.getClass().getSimpleName() + " INCLUDE_MAPPING attribute: "
+ includeMapping);
HttpServletMapping asyncMapping = (HttpServletMapping) request.getAttribute(AsyncContext.ASYNC_MAPPING);
request.getServletContext().log(this.getClass().getSimpleName() + " ASYNC_MAPPING attribute: "
+ asyncMapping);
RequestDispatcher rd = request.getServletContext().getNamedDispatcher("fa5raP");
rd.include(request, response);
}

// <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
/**
* Handles the HTTP <code>GET</code> method.
*
* @param request servlet request
* @param response servlet response
* @throws ServletException if a servlet-specific error occurs
* @throws IOException if an I/O error occurs
*/
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}

/**
* Handles the HTTP <code>POST</code> method.
*
* @param request servlet request
* @param response servlet response
* @throws ServletException if a servlet-specific error occurs
* @throws IOException if an I/O error occurs
*/
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}

/**
* Returns a short description of the servlet.
*
* @return a String containing servlet description
*/
@Override
public String getServletInfo() {
return "Short description";
}// </editor-fold>

}
Original file line number Diff line number Diff line change
Expand Up @@ -40,17 +40,31 @@

import java.io.IOException;
import javax.servlet.AsyncContext;
import javax.servlet.RequestDispatcher;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletMapping;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet(asyncSupported = true, value = "/DispatchServlet", loadOnStartup = 1)
@WebServlet(asyncSupported = true, name="fa5raP", value = "/DispatchServlet", loadOnStartup = 1)
public class DispatchServlet extends HttpServlet {

public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException{
AsyncContext asyncContext = req.startAsync();
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException{
request.getServletContext().log(this.getClass().getSimpleName() + " "
+ request.getHttpServletMapping());
HttpServletMapping forwardMapping = (HttpServletMapping) request.getAttribute(RequestDispatcher.FORWARD_MAPPING);
request.getServletContext().log(this.getClass().getSimpleName() + " FORWARD_MAPPING attribute: "
+ forwardMapping);
HttpServletMapping includeMapping = (HttpServletMapping) request.getAttribute(RequestDispatcher.INCLUDE_MAPPING);
request.getServletContext().log(this.getClass().getSimpleName() + " INCLUDE_MAPPING attribute: "
+ includeMapping);
HttpServletMapping asyncMapping = (HttpServletMapping) request.getAttribute(AsyncContext.ASYNC_MAPPING);
request.getServletContext().log(this.getClass().getSimpleName() + " ASYNC_MAPPING attribute: "
+ asyncMapping);

AsyncContext asyncContext = request.startAsync();
asyncContext.setTimeout(0);
asyncContext.dispatch("/TestServlet");
asyncContext.dispatch("/ServletC");
}
}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -1075,7 +1075,13 @@ private ServletRequest wrapRequest(State state) {
this.mappingForDispatch = computeNamedDispatchHttpServletMapping(context, hcurrent);
}
//END OF github/javaee/glassfish/issues/21846


//START OF github/javaee/glassfish/issues/22079
if (DispatcherType.ASYNC.equals(state.dispatcherType)) {
this.mappingForDispatch = hcurrent.getHttpServletMapping();
}
//END OF github/javaee/glassfish/issues/22079

wrapper = new ApplicationHttpRequest
(hcurrent, context, crossContext, mappingForDispatch, state.dispatcherType);
} else {
Expand Down

0 comments on commit a559328

Please sign in to comment.