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