View Javadoc
1   package com.atlassian.plugin.refimpl.servlet;
2   
3   import org.slf4j.Logger;
4   import org.slf4j.LoggerFactory;
5   
6   import javax.servlet.ServletException;
7   import javax.servlet.ServletRequest;
8   import javax.servlet.ServletResponse;
9   import javax.servlet.http.HttpServlet;
10  import javax.servlet.http.HttpServletRequest;
11  import javax.servlet.http.HttpServletResponse;
12  import java.io.IOException;
13  import java.util.Enumeration;
14  
15  /**
16   * NoOpServlet is a dummy servlet used only to provide a servlet mapping for url patterns that don't have any. This is
17   * necessary as some application servers like WebSphere 6.1.0.5 returns a 404 if there are no mapped servlet before
18   * applying filters to the request which could potentially change the URL mapped to a valid servlet. For example, the
19   * {@code URLRewriter} filter does this. Hence this dummy servlet should never handle any requests.
20   * <p>
21   * If this servlet receives a request, it will simply log all relevant information from the request that may be of help
22   * in determining why the request was received, as this would not be the desired result.
23   * </p>
24   *
25   * @since 2.3.6
26   */
27  public class NoOpServlet extends HttpServlet {
28      private static final Logger log = LoggerFactory.getLogger(NoOpServlet.class);
29      private static final String RECEIVED_UNEXPECTED_REQUEST = "NoOpServlet received an unexpected request.";
30      private static final String UNABLE_TO_HANDLE_REQUEST =
31              "Unable to handle request. Request is not a HttpServletRequest";
32  
33      public void service(ServletRequest servletRequest, ServletResponse servletResponse)
34              throws ServletException, IOException {
35          log.warn(RECEIVED_UNEXPECTED_REQUEST);
36  
37          if (!(servletRequest instanceof HttpServletRequest && servletResponse instanceof HttpServletResponse)) {
38              log.error(UNABLE_TO_HANDLE_REQUEST);
39              return;
40          }
41          HttpServletRequest request = (HttpServletRequest) servletRequest;
42          HttpServletResponse response = (HttpServletResponse) servletResponse;
43  
44          //log information that may help in finding out why the request came here
45          logRequestInformation(request);
46  
47          //Let the user know that there is some error
48          response.sendError(404, RECEIVED_UNEXPECTED_REQUEST + " More information is available in the log file.");
49      }
50  
51      /**
52       * Logs relevant information about the request such as the request URL and the query string
53       *
54       * @param request request to log information about
55       */
56      private void logRequestInformation(HttpServletRequest request) {
57          try {
58              log.warn("Request Information");
59              log.warn("- Request URL: " + request.getRequestURL());
60              log.warn("- Query String: " + (request.getQueryString() == null ? "" : request.getQueryString()));
61  
62              log.warn("Request Attributes");
63              Enumeration attributeNames = request.getAttributeNames();
64              while (attributeNames.hasMoreElements()) {
65                  String name = (String) attributeNames.nextElement();
66                  Object attribute = request.getAttribute(name);
67                  log.warn("- " + name + ": " + (attribute == null ? "null" : attribute.toString()));
68              }
69          } catch (Throwable t) {
70              log.error("Error rendering logging information" + t);
71          }
72      }
73  }