1 2 import java.io.IOException; 3 import java.io.PrintWriter; 4 5 import java.util.Map; 6 7 import javax.servlet.DispatcherType; 8 import javax.servlet.RequestDispatcher; 9 import javax.servlet.ServletConfig; 10 import javax.servlet.ServletException; 11 import javax.servlet.http.HttpServlet; 12 import javax.servlet.http.HttpServletRequest; 13 import javax.servlet.http.HttpServletRequestWrapper; 14 import javax.servlet.http.HttpServletResponse; 15 import javax.servlet.http.HttpServletResponseWrapper; 16 17 public class app extends HttpServlet 18 { 19 private String id; 20 21 private class RequestWrapper extends HttpServletRequestWrapper 22 { RequestWrapper(HttpServletRequest r)23 public RequestWrapper(HttpServletRequest r) 24 { 25 super(r); 26 } 27 } 28 29 private class ResponseWrapper extends HttpServletResponseWrapper 30 { ResponseWrapper(HttpServletResponse r)31 public ResponseWrapper(HttpServletResponse r) 32 { 33 super(r); 34 } 35 } 36 37 @Override init(ServletConfig sc)38 public void init(ServletConfig sc) 39 throws ServletException 40 { 41 id = sc.getInitParameter("id"); 42 } 43 getRequestDispatcher(HttpServletRequest request, String str)44 private RequestDispatcher getRequestDispatcher(HttpServletRequest request, String str) 45 { 46 String disp = request.getParameter("disp"); 47 48 if (disp != null && disp.equals("ctx")) { 49 return request.getServletContext().getRequestDispatcher(str); 50 } 51 52 if (disp != null && disp.equals("name")) { 53 return request.getServletContext().getNamedDispatcher(str); 54 } 55 56 if (disp == null || disp.equals("req")) { 57 return request.getRequestDispatcher(str); 58 } 59 60 return null; 61 } 62 63 @Override doGet(HttpServletRequest request, HttpServletResponse response)64 public void doGet(HttpServletRequest request, HttpServletResponse response) 65 throws IOException, ServletException 66 { 67 String dtype = "" + request.getDispatcherType(); 68 69 response.addHeader("X-" + dtype + "-Id", id); 70 response.addHeader("X-" + dtype + "-Request-URI", "" + request.getRequestURI()); 71 response.addHeader("X-" + dtype + "-Servlet-Path", "" + request.getServletPath()); 72 response.addHeader("X-" + dtype + "-Path-Info", "" + request.getPathInfo()); 73 response.addHeader("X-" + dtype + "-Query-String", "" + request.getQueryString()); 74 response.addHeader("X-" + dtype + "-Dispatcher-Type", "" + request.getDispatcherType()); 75 76 response.setContentType("text/plain; charset=utf-8"); 77 78 Map<String, String[]> pmap = request.getParameterMap(); 79 80 for (Map.Entry<String,String[]> p : pmap.entrySet()) { 81 response.addHeader("X-" + dtype + "-Param-" + p.getKey(), "" + String.join(",", p.getValue())); 82 } 83 84 PrintWriter out = response.getWriter(); 85 86 if (id.equals("fwd")) { 87 String uri = request.getParameter("uri"); 88 89 if (uri != null && request.getDispatcherType() != DispatcherType.FORWARD) { 90 response.addHeader("X-Forward-To", "" + uri); 91 92 out.println("Before forwarding."); 93 94 RequestDispatcher d = getRequestDispatcher(request, uri); 95 96 if (d == null) { 97 out.println("Dispatcher is null"); 98 return; 99 } 100 101 try { 102 d.forward(new RequestWrapper(request), new ResponseWrapper(response)); 103 } catch(Exception e) { 104 response.addHeader("X-Exception", "" + e); 105 } 106 107 response.addHeader("X-After-Forwarding", "you-should-not-see-this"); 108 109 out.println("After forwarding."); 110 111 return; 112 } 113 } 114 115 if (id.equals("data")) { 116 response.addHeader("X-" + RequestDispatcher.FORWARD_REQUEST_URI, "" + request.getAttribute(RequestDispatcher.FORWARD_REQUEST_URI)); 117 response.addHeader("X-" + RequestDispatcher.FORWARD_CONTEXT_PATH, "" + request.getAttribute(RequestDispatcher.FORWARD_CONTEXT_PATH)); 118 response.addHeader("X-" + RequestDispatcher.FORWARD_SERVLET_PATH, "" + request.getAttribute(RequestDispatcher.FORWARD_SERVLET_PATH)); 119 response.addHeader("X-" + RequestDispatcher.FORWARD_PATH_INFO, "" + request.getAttribute(RequestDispatcher.FORWARD_PATH_INFO)); 120 response.addHeader("X-" + RequestDispatcher.FORWARD_QUERY_STRING, "" + request.getAttribute(RequestDispatcher.FORWARD_QUERY_STRING)); 121 122 out.println("app.doGet(): #" + this + ", " + id); 123 out.println("RequestURI: " + request.getRequestURI()); 124 out.println("ServletPath: " + request.getServletPath()); 125 out.println("PathInfo: " + request.getPathInfo()); 126 out.println("DispType: " + request.getDispatcherType()); 127 out.println("QueryString: " + request.getQueryString()); 128 129 for (Map.Entry<String,String[]> p : pmap.entrySet()) { 130 out.println("- " + p.getKey() + "=" + String.join(",", p.getValue())); 131 } 132 133 return; 134 } 135 136 response.sendError(404); 137 } 138 } 139