| // ======================================================================== |
| // $Id: Dump.java,v 1.42 2005/12/21 23:14:38 gregwilkins Exp $ |
| // Copyright 1996-2004 Mort Bay Consulting Pty. Ltd. |
| // ------------------------------------------------------------------------ |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| // ======================================================================== |
| |
| package org.openqa.jetty.servlet; |
| import java.io.IOException; |
| import java.io.OutputStream; |
| import java.io.PrintWriter; |
| import java.lang.reflect.Field; |
| import java.util.Enumeration; |
| import java.util.Locale; |
| |
| import javax.servlet.ServletConfig; |
| import javax.servlet.ServletException; |
| import javax.servlet.ServletRequest; |
| import javax.servlet.ServletRequestWrapper; |
| import javax.servlet.UnavailableException; |
| import javax.servlet.http.Cookie; |
| import javax.servlet.http.HttpServlet; |
| import javax.servlet.http.HttpServletRequest; |
| import javax.servlet.http.HttpServletRequestWrapper; |
| import javax.servlet.http.HttpServletResponse; |
| |
| import org.apache.commons.logging.Log; |
| import org.openqa.jetty.log.LogFactory; |
| import org.openqa.jetty.html.Break; |
| import org.openqa.jetty.html.Font; |
| import org.openqa.jetty.html.Heading; |
| import org.openqa.jetty.html.Page; |
| import org.openqa.jetty.html.Select; |
| import org.openqa.jetty.html.Table; |
| import org.openqa.jetty.html.TableForm; |
| import org.openqa.jetty.http.HttpException; |
| import org.openqa.jetty.util.Loader; |
| import org.openqa.jetty.util.LogSupport; |
| |
| /* ------------------------------------------------------------ */ |
| /** Dump Servlet Request. |
| * |
| */ |
| public class Dump extends HttpServlet |
| { |
| private static Log log= LogFactory.getLog(Dump.class); |
| |
| /* ------------------------------------------------------------ */ |
| String pageType; |
| |
| /* ------------------------------------------------------------ */ |
| public void init(ServletConfig config) throws ServletException |
| { |
| super.init(config); |
| } |
| |
| /* ------------------------------------------------------------ */ |
| public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException |
| { |
| doGet(request, response); |
| } |
| |
| /* ------------------------------------------------------------ */ |
| public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException |
| { |
| request.setAttribute("Dump", this); |
| request.setCharacterEncoding("ISO_8859_1"); |
| getServletContext().setAttribute("Dump",this); |
| |
| String info= request.getPathInfo(); |
| if (info != null && info.endsWith("Exception")) |
| { |
| try |
| { |
| throw (Throwable) (Loader.loadClass(this.getClass(), info.substring(1)).newInstance()); |
| } |
| catch (Throwable th) |
| { |
| throw new ServletException(th); |
| } |
| } |
| |
| String redirect= request.getParameter("redirect"); |
| if (redirect != null && redirect.length() > 0) |
| { |
| response.getOutputStream().println("THIS SHOULD NOT BE SEEN!"); |
| response.sendRedirect(redirect); |
| response.getOutputStream().println("THIS SHOULD NOT BE SEEN!"); |
| return; |
| } |
| |
| String error= request.getParameter("error"); |
| if (error != null && error.length() > 0) |
| { |
| response.getOutputStream().println("THIS SHOULD NOT BE SEEN!"); |
| response.sendError(Integer.parseInt(error)); |
| response.getOutputStream().println("THIS SHOULD NOT BE SEEN!"); |
| return; |
| } |
| |
| String length= request.getParameter("length"); |
| if (length != null && length.length() > 0) |
| { |
| response.setContentLength(Integer.parseInt(length)); |
| } |
| |
| String buffer= request.getParameter("buffer"); |
| if (buffer != null && buffer.length() > 0) |
| response.setBufferSize(Integer.parseInt(buffer)); |
| |
| request.setCharacterEncoding("UTF-8"); |
| response.setContentType("text/html"); |
| |
| if (info != null && info.indexOf("Locale/") >= 0) |
| { |
| try |
| { |
| String locale_name= info.substring(info.indexOf("Locale/") + 7); |
| Field f= java.util.Locale.class.getField(locale_name); |
| response.setLocale((Locale)f.get(null)); |
| } |
| catch (Exception e) |
| { |
| LogSupport.ignore(log, e); |
| response.setLocale(Locale.getDefault()); |
| } |
| } |
| |
| String cn= request.getParameter("cookie"); |
| String cv=request.getParameter("value"); |
| String v=request.getParameter("version"); |
| if (cn!=null && cv!=null) |
| { |
| Cookie cookie= new Cookie(cn, cv); |
| cookie.setComment("Cookie from dump servlet"); |
| if (v!=null) |
| { |
| cookie.setMaxAge(300); |
| cookie.setPath("/"); |
| cookie.setVersion(Integer.parseInt(v)); |
| } |
| response.addCookie(cookie); |
| } |
| |
| String pi= request.getPathInfo(); |
| if (pi != null && pi.startsWith("/ex")) |
| { |
| OutputStream out= response.getOutputStream(); |
| out.write("</H1>This text should be reset</H1>".getBytes()); |
| if ("/ex0".equals(pi)) |
| throw new ServletException("test ex0", new Throwable()); |
| if ("/ex1".equals(pi)) |
| throw new IOException("test ex1"); |
| if ("/ex2".equals(pi)) |
| throw new UnavailableException("test ex2"); |
| if ("/ex3".equals(pi)) |
| throw new HttpException(501); |
| } |
| |
| PrintWriter pout= response.getWriter(); |
| Page page= null; |
| |
| try |
| { |
| page= new Page(); |
| page.title("Dump Servlet"); |
| |
| page.add(new Heading(1, "Dump Servlet")); |
| Table table= new Table(0).cellPadding(0).cellSpacing(0); |
| page.add(table); |
| table.newRow(); |
| table.addHeading("getMethod: ").cell().right(); |
| table.addCell("" + request.getMethod()); |
| table.newRow(); |
| table.addHeading("getContentLength: ").cell().right(); |
| table.addCell(Integer.toString(request.getContentLength())); |
| table.newRow(); |
| table.addHeading("getContentType: ").cell().right(); |
| table.addCell("" + request.getContentType()); |
| table.newRow(); |
| table.addHeading("getCharacterEncoding: ").cell().right(); |
| table.addCell("" + request.getCharacterEncoding()); |
| table.newRow(); |
| table.addHeading("getRequestURI: ").cell().right(); |
| table.addCell("" + request.getRequestURI()); |
| table.newRow(); |
| table.addHeading("getRequestURL: ").cell().right(); |
| table.addCell("" + request.getRequestURL()); |
| table.newRow(); |
| table.addHeading("getContextPath: ").cell().right(); |
| table.addCell("" + request.getContextPath()); |
| table.newRow(); |
| table.addHeading("getServletPath: ").cell().right(); |
| table.addCell("" + request.getServletPath()); |
| table.newRow(); |
| table.addHeading("getPathInfo: ").cell().right(); |
| table.addCell("" + request.getPathInfo()); |
| table.newRow(); |
| table.addHeading("getPathTranslated: ").cell().right(); |
| table.addCell("" + request.getPathTranslated()); |
| table.newRow(); |
| table.addHeading("getQueryString: ").cell().right(); |
| table.addCell("" + request.getQueryString()); |
| |
| table.newRow(); |
| table.addHeading("getProtocol: ").cell().right(); |
| table.addCell("" + request.getProtocol()); |
| table.newRow(); |
| table.addHeading("getScheme: ").cell().right(); |
| table.addCell("" + request.getScheme()); |
| table.newRow(); |
| table.addHeading("getServerName: ").cell().right(); |
| table.addCell("" + request.getServerName()); |
| table.newRow(); |
| table.addHeading("getServerPort: ").cell().right(); |
| table.addCell("" + Integer.toString(request.getServerPort())); |
| table.newRow(); |
| table.addHeading("getLocalName: ").cell().right(); |
| table.addCell("" + request.getLocalName()); |
| table.newRow(); |
| table.addHeading("getLocalAddr: ").cell().right(); |
| table.addCell("" + request.getLocalAddr()); |
| table.newRow(); |
| table.addHeading("getLocalPort: ").cell().right(); |
| table.addCell("" + Integer.toString(request.getLocalPort())); |
| table.newRow(); |
| table.addHeading("getRemoteUser: ").cell().right(); |
| table.addCell("" + request.getRemoteUser()); |
| table.newRow(); |
| table.addHeading("getRemoteAddr: ").cell().right(); |
| table.addCell("" + request.getRemoteAddr()); |
| table.newRow(); |
| table.addHeading("getRemoteHost: ").cell().right(); |
| table.addCell("" + request.getRemoteHost()); |
| table.newRow(); |
| table.addHeading("getRemotePort: ").cell().right(); |
| table.addCell("" + request.getRemotePort()); |
| table.newRow(); |
| table.addHeading("getRequestedSessionId: ").cell().right(); |
| table.addCell("" + request.getRequestedSessionId()); |
| table.newRow(); |
| table.addHeading("isSecure(): ").cell().right(); |
| table.addCell("" + request.isSecure()); |
| |
| table.newRow(); |
| table.addHeading("isUserInRole(admin): ").cell().right(); |
| table.addCell("" + request.isUserInRole("admin")); |
| |
| table.newRow(); |
| table.addHeading("getLocale: ").cell().right(); |
| table.addCell("" + request.getLocale()); |
| |
| Enumeration locales= request.getLocales(); |
| while (locales.hasMoreElements()) |
| { |
| table.newRow(); |
| table.addHeading("getLocales: ").cell().right(); |
| table.addCell(locales.nextElement()); |
| } |
| |
| table.newRow(); |
| table |
| .newHeading() |
| .cell() |
| .nest(new Font(2, true)) |
| .add("<BR>Other HTTP Headers") |
| .attribute("COLSPAN", "2") |
| .left(); |
| Enumeration h= request.getHeaderNames(); |
| String name; |
| while (h.hasMoreElements()) |
| { |
| name= (String)h.nextElement(); |
| |
| Enumeration h2= request.getHeaders(name); |
| while (h2.hasMoreElements()) |
| { |
| String hv= (String)h2.nextElement(); |
| table.newRow(); |
| table.addHeading(name + ": ").cell().right(); |
| table.addCell(hv); |
| } |
| } |
| |
| table.newRow(); |
| table |
| .newHeading() |
| .cell() |
| .nest(new Font(2, true)) |
| .add("<BR>Request Parameters") |
| .attribute("COLSPAN", "2") |
| .left(); |
| h= request.getParameterNames(); |
| while (h.hasMoreElements()) |
| { |
| name= (String)h.nextElement(); |
| table.newRow(); |
| table.addHeading(name + ": ").cell().right(); |
| table.addCell(request.getParameter(name)); |
| String[] values= request.getParameterValues(name); |
| if (values == null) |
| { |
| table.newRow(); |
| table.addHeading(name + " Values: ").cell().right(); |
| table.addCell("NULL!!!!!!!!!"); |
| } |
| else |
| if (values.length > 1) |
| { |
| for (int i= 0; i < values.length; i++) |
| { |
| table.newRow(); |
| table.addHeading(name + "[" + i + "]: ").cell().right(); |
| table.addCell(values[i]); |
| } |
| } |
| } |
| |
| table.newRow(); |
| table |
| .newHeading() |
| .cell() |
| .nest(new Font(2, true)) |
| .add("<BR>Cookies") |
| .attribute("COLSPAN", "2") |
| .left(); |
| Cookie[] cookies = request.getCookies(); |
| for (int i=0; cookies!=null && i<cookies.length;i++) |
| { |
| Cookie cookie = cookies[i]; |
| |
| table.newRow(); |
| table.addHeading(cookie.getName() + ": ").cell().attribute("VALIGN", "TOP").right(); |
| table.addCell(cookie.getValue()); |
| } |
| |
| /* ------------------------------------------------------------ */ |
| table.newRow(); |
| table |
| .newHeading() |
| .cell() |
| .nest(new Font(2, true)) |
| .add("<BR>Request Attributes") |
| .attribute("COLSPAN", "2") |
| .left(); |
| Enumeration a= request.getAttributeNames(); |
| while (a.hasMoreElements()) |
| { |
| name= (String)a.nextElement(); |
| table.newRow(); |
| table.addHeading(name + ": ").cell().attribute("VALIGN", "TOP").right(); |
| table.addCell("<pre>" + toString(request.getAttribute(name)) + "</pre>"); |
| } |
| |
| /* ------------------------------------------------------------ */ |
| table.newRow(); |
| table |
| .newHeading() |
| .cell() |
| .nest(new Font(2, true)) |
| .add("<BR>Servlet InitParameters") |
| .attribute("COLSPAN", "2") |
| .left(); |
| a= getInitParameterNames(); |
| while (a.hasMoreElements()) |
| { |
| name= (String)a.nextElement(); |
| table.newRow(); |
| table.addHeading(name + ": ").cell().attribute("VALIGN", "TOP").right(); |
| table.addCell("<pre>" + toString(getInitParameter(name)) + "</pre>"); |
| } |
| |
| table.newRow(); |
| table |
| .newHeading() |
| .cell() |
| .nest(new Font(2, true)) |
| .add("<BR>Context InitParameters") |
| .attribute("COLSPAN", "2") |
| .left(); |
| a= getServletContext().getInitParameterNames(); |
| while (a.hasMoreElements()) |
| { |
| name= (String)a.nextElement(); |
| table.newRow(); |
| table.addHeading(name + ": ").cell().attribute("VALIGN", "TOP").right(); |
| table.addCell("<pre>" + toString(getServletContext().getInitParameter(name)) + "</pre>"); |
| } |
| |
| table.newRow(); |
| table |
| .newHeading() |
| .cell() |
| .nest(new Font(2, true)) |
| .add("<BR>Context Attributes") |
| .attribute("COLSPAN", "2") |
| .left(); |
| a= getServletContext().getAttributeNames(); |
| while (a.hasMoreElements()) |
| { |
| name= (String)a.nextElement(); |
| table.newRow(); |
| table.addHeading(name + ": ").cell().attribute("VALIGN", "TOP").right(); |
| table.addCell("<pre>" + toString(getServletContext().getAttribute(name)) + "</pre>"); |
| } |
| |
| if (request.getContentType() != null |
| && request.getContentType().startsWith("multipart/form-data") |
| && request.getContentLength() < 1000000) |
| { |
| MultiPartRequest multi= new MultiPartRequest(request); |
| String[] parts= multi.getPartNames(); |
| |
| table.newRow(); |
| table |
| .newHeading() |
| .cell() |
| .nest(new Font(2, true)) |
| .add("<BR>Multi-part content") |
| .attribute("COLSPAN", "2") |
| .left(); |
| for (int p= 0; p < parts.length; p++) |
| { |
| name= parts[p]; |
| table.newRow(); |
| table.addHeading(name + ": ").cell().attribute("VALIGN", "TOP").right(); |
| table.addCell("<pre>" + multi.getString(parts[p]) + "</pre>"); |
| } |
| } |
| |
| String res= request.getParameter("resource"); |
| if (res != null && res.length() > 0) |
| { |
| table.newRow(); |
| table |
| .newHeading() |
| .cell() |
| .nest(new Font(2, true)) |
| .add("<BR>Get Resource: " + res) |
| .attribute("COLSPAN", "2") |
| .left(); |
| |
| table.newRow(); |
| table.addHeading("this.getClass(): ").cell().right(); |
| table.addCell("" + this.getClass().getResource(res)); |
| |
| table.newRow(); |
| table.addHeading("this.getClass().getClassLoader(): ").cell().right(); |
| table.addCell("" + this.getClass().getClassLoader().getResource(res)); |
| |
| table.newRow(); |
| table.addHeading("Thread.currentThread().getContextClassLoader(): ").cell().right(); |
| table.addCell("" + Thread.currentThread().getContextClassLoader().getResource(res)); |
| |
| table.newRow(); |
| table.addHeading("getServletContext(): ").cell().right(); |
| try{table.addCell("" + getServletContext().getResource(res));} |
| catch(Exception e) {table.addCell("" +e);} |
| } |
| |
| |
| /* ------------------------------------------------------------ */ |
| page.add(Break.para); |
| page.add(new Heading(1, "Request Wrappers")); |
| ServletRequest rw=request; |
| int w=0; |
| while (rw !=null) |
| { |
| page.add((w++)+": "+rw.getClass().getName()+"<br/>"); |
| if (rw instanceof HttpServletRequestWrapper) |
| rw=((HttpServletRequestWrapper)rw).getRequest(); |
| else if (rw instanceof ServletRequestWrapper) |
| rw=((ServletRequestWrapper)rw).getRequest(); |
| else |
| rw=null; |
| } |
| |
| page.add(Break.para); |
| page.add(new Heading(1, "International Characters")); |
| page.add("Directly encoced: Dürst<br/>"); |
| page.add("HTML reference: Dürst<br/>"); |
| page.add("Decimal (252) 8859-1: Dürst<br/>"); |
| page.add("Hex (xFC) 8859-1: Dürst<br/>"); |
| page.add( |
| "Javascript unicode (00FC) : <script language='javascript'>document.write(\"D\u00FCrst\");</script><br/>"); |
| page.add(Break.para); |
| page.add(new Heading(1, "Form to generate GET content")); |
| TableForm tf= new TableForm(response.encodeURL(getURI(request))); |
| tf.method("GET"); |
| tf.addTextField("TextField", "TextField", 20, "value"); |
| tf.addButton("Action", "Submit"); |
| page.add(tf); |
| |
| page.add(Break.para); |
| page.add(new Heading(1, "Form to generate POST content")); |
| tf= new TableForm(response.encodeURL(getURI(request))); |
| tf.method("POST"); |
| tf.addTextField("TextField", "TextField", 20, "value"); |
| Select select= tf.addSelect("Select", "Select", true, 3); |
| select.add("ValueA"); |
| select.add("ValueB1,ValueB2"); |
| select.add("ValueC"); |
| tf.addButton("Action", "Submit"); |
| page.add(tf); |
| |
| page.add(new Heading(1, "Form to upload content")); |
| tf= new TableForm(response.encodeURL(getURI(request))); |
| tf.method("POST"); |
| tf.attribute("enctype", "multipart/form-data"); |
| tf.addFileField("file", "file"); |
| tf.addButton("Upload", "Upload"); |
| page.add(tf); |
| |
| page.add(new Heading(1, "Form to get Resource")); |
| tf= new TableForm(response.encodeURL(getURI(request))); |
| tf.method("POST"); |
| tf.addTextField("resource", "resource", 20, ""); |
| tf.addButton("Action", "getResource"); |
| page.add(tf); |
| |
| } |
| catch (Exception e) |
| { |
| log.warn(LogSupport.EXCEPTION, e); |
| } |
| |
| page.write(pout); |
| |
| String data= request.getParameter("data"); |
| if (data != null && data.length() > 0) |
| { |
| int d= Integer.parseInt(data); |
| while (d > 0) |
| { |
| pout.println("1234567890123456789012345678901234567890123456789\n"); |
| d= d - 50; |
| |
| } |
| } |
| |
| pout.close(); |
| |
| if (pi != null) |
| { |
| if ("/ex4".equals(pi)) |
| throw new ServletException("test ex4", new Throwable()); |
| if ("/ex5".equals(pi)) |
| throw new IOException("test ex5"); |
| if ("/ex6".equals(pi)) |
| throw new UnavailableException("test ex6"); |
| if ("/ex7".equals(pi)) |
| throw new HttpException(501); |
| } |
| |
| request.getInputStream().close(); |
| |
| } |
| |
| /* ------------------------------------------------------------ */ |
| public String getServletInfo() |
| { |
| return "Dump Servlet"; |
| } |
| |
| /* ------------------------------------------------------------ */ |
| public synchronized void destroy() |
| { |
| log.debug("Destroyed"); |
| } |
| |
| /* ------------------------------------------------------------ */ |
| private String getURI(HttpServletRequest request) |
| { |
| String uri= (String)request.getAttribute("javax.servlet.forward.request_uri"); |
| if (uri == null) |
| uri= request.getRequestURI(); |
| return uri; |
| } |
| |
| /* ------------------------------------------------------------ */ |
| private static String toString(Object o) |
| { |
| if (o == null) |
| return null; |
| |
| if (o.getClass().isArray()) |
| { |
| StringBuffer sb= new StringBuffer(); |
| Object[] array= (Object[])o; |
| for (int i= 0; i < array.length; i++) |
| { |
| if (i > 0) |
| sb.append("\n"); |
| sb.append(array.getClass().getComponentType().getName()); |
| sb.append("["); |
| sb.append(i); |
| sb.append("]="); |
| sb.append(toString(array[i])); |
| } |
| return sb.toString(); |
| } |
| else |
| return o.toString(); |
| } |
| |
| } |