import java.io.IOException; import java.io.PrintWriter; import java.util.Map; import javax.servlet.DispatcherType; import javax.servlet.RequestDispatcher; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponseWrapper; public class app extends HttpServlet { private String id; private class RequestWrapper extends HttpServletRequestWrapper { public RequestWrapper(HttpServletRequest r) { super(r); } } private class ResponseWrapper extends HttpServletResponseWrapper { public ResponseWrapper(HttpServletResponse r) { super(r); } } @Override public void init(ServletConfig sc) throws ServletException { id = sc.getInitParameter("id"); } private RequestDispatcher getRequestDispatcher(HttpServletRequest request, String str) { String disp = request.getParameter("disp"); if (disp != null && disp.equals("ctx")) { return request.getServletContext().getRequestDispatcher(str); } if (disp != null && disp.equals("name")) { return request.getServletContext().getNamedDispatcher(str); } if (disp == null || disp.equals("req")) { return request.getRequestDispatcher(str); } return null; } @Override public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { String dtype = "" + request.getDispatcherType(); response.addHeader("X-" + dtype + "-Id", id); response.addHeader("X-" + dtype + "-Request-URI", "" + request.getRequestURI()); response.addHeader("X-" + dtype + "-Servlet-Path", "" + request.getServletPath()); response.addHeader("X-" + dtype + "-Path-Info", "" + request.getPathInfo()); response.addHeader("X-" + dtype + "-Query-String", "" + request.getQueryString()); response.addHeader("X-" + dtype + "-Dispatcher-Type", "" + request.getDispatcherType()); response.setContentType("text/plain; charset=utf-8"); Map pmap = request.getParameterMap(); for (Map.Entry p : pmap.entrySet()) { response.addHeader("X-" + dtype + "-Param-" + p.getKey(), "" + String.join(",", p.getValue())); } PrintWriter out = response.getWriter(); if (id.equals("fwd")) { String uri = request.getParameter("uri"); if (uri != null && request.getDispatcherType() != DispatcherType.FORWARD) { response.addHeader("X-Forward-To", "" + uri); out.println("Before forwarding."); RequestDispatcher d = getRequestDispatcher(request, uri); if (d == null) { out.println("Dispatcher is null"); return; } try { d.forward(new RequestWrapper(request), new ResponseWrapper(response)); } catch(Exception e) { response.addHeader("X-Exception", "" + e); } response.addHeader("X-After-Forwarding", "you-should-not-see-this"); out.println("After forwarding."); return; } } if (id.equals("data")) { response.addHeader("X-" + RequestDispatcher.FORWARD_REQUEST_URI, "" + request.getAttribute(RequestDispatcher.FORWARD_REQUEST_URI)); response.addHeader("X-" + RequestDispatcher.FORWARD_CONTEXT_PATH, "" + request.getAttribute(RequestDispatcher.FORWARD_CONTEXT_PATH)); response.addHeader("X-" + RequestDispatcher.FORWARD_SERVLET_PATH, "" + request.getAttribute(RequestDispatcher.FORWARD_SERVLET_PATH)); response.addHeader("X-" + RequestDispatcher.FORWARD_PATH_INFO, "" + request.getAttribute(RequestDispatcher.FORWARD_PATH_INFO)); response.addHeader("X-" + RequestDispatcher.FORWARD_QUERY_STRING, "" + request.getAttribute(RequestDispatcher.FORWARD_QUERY_STRING)); out.println("app.doGet(): #" + this + ", " + id); out.println("RequestURI: " + request.getRequestURI()); out.println("ServletPath: " + request.getServletPath()); out.println("PathInfo: " + request.getPathInfo()); out.println("DispType: " + request.getDispatcherType()); out.println("QueryString: " + request.getQueryString()); for (Map.Entry p : pmap.entrySet()) { out.println("- " + p.getKey() + "=" + String.join(",", p.getValue())); } return; } response.sendError(404); } }