Java tutorial
// ======================================================================== // $Id: DumpHandler.java,v 1.14 2005/08/13 00:01:26 gregwilkins Exp $ // Copyright 1999-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 net.lightbody.bmp.proxy.jetty.http.handler; import net.lightbody.bmp.proxy.jetty.http.HttpException; import net.lightbody.bmp.proxy.jetty.http.HttpFields; import net.lightbody.bmp.proxy.jetty.http.HttpRequest; import net.lightbody.bmp.proxy.jetty.http.HttpResponse; import net.lightbody.bmp.proxy.jetty.log.LogFactory; import net.lightbody.bmp.proxy.jetty.util.LogSupport; import net.lightbody.bmp.proxy.jetty.util.StringUtil; import org.apache.commons.logging.Log; import javax.servlet.http.Cookie; import java.io.*; import java.util.Enumeration; import java.util.Iterator; import java.util.List; import java.util.Set; /* ------------------------------------------------------------ */ /** Dump request handler. * Dumps GET and POST requests. * Useful for testing and debugging. * * @version $Id: DumpHandler.java,v 1.14 2005/08/13 00:01:26 gregwilkins Exp $ * @author Greg Wilkins (gregw) */ public class DumpHandler extends AbstractHttpHandler { private static Log log = LogFactory.getLog(DumpHandler.class); /* ----------------------------------------------------------------- */ public String realPath(String pathSpec, String path) { return ""; } /* ------------------------------------------------------------ */ public void handle(String pathInContext, String pathParams, HttpRequest request, HttpResponse response) throws HttpException, IOException { if (!isStarted()) return; // Only handle GET, HEAD and POST if (!HttpRequest.__GET.equals(request.getMethod()) && !HttpRequest.__HEAD.equals(request.getMethod()) && !HttpRequest.__POST.equals(request.getMethod())) return; log.debug("Dump"); response.setField(HttpFields.__ContentType, HttpFields.__TextHtml); OutputStream out = response.getOutputStream(); ByteArrayOutputStream buf = new ByteArrayOutputStream(2048); Writer writer = new OutputStreamWriter(buf, StringUtil.__ISO_8859_1); writer.write("<HTML><H1>Dump HttpHandler</H1>"); writer.write("<PRE>\npath=" + request.getPath() + "\ncontextPath=" + getHttpContext().getContextPath() + "\npathInContext=" + pathInContext + "\n</PRE>\n"); writer.write("<H3>Header:</H3><PRE>"); writer.write(request.toString()); writer.write("</PRE>\n<H3>Parameters:</H3>\n<PRE>"); Set names = request.getParameterNames(); Iterator iter = names.iterator(); while (iter.hasNext()) { String name = iter.next().toString(); List values = request.getParameterValues(name); if (values == null || values.size() == 0) { writer.write(name); writer.write("=\n"); } else if (values.size() == 1) { writer.write(name); writer.write("="); writer.write((String) values.get(0)); writer.write("\n"); } else { for (int i = 0; i < values.size(); i++) { writer.write(name); writer.write("[" + i + "]="); writer.write((String) values.get(i)); writer.write("\n"); } } } String cookie_name = request.getParameter("CookieName"); if (cookie_name != null && cookie_name.trim().length() > 0) { String cookie_action = request.getParameter("Button"); try { Cookie cookie = new Cookie(cookie_name.trim(), request.getParameter("CookieVal")); if ("Clear Cookie".equals(cookie_action)) cookie.setMaxAge(0); response.addSetCookie(cookie); } catch (IllegalArgumentException e) { writer.write("</PRE>\n<H3>BAD Set-Cookie:</H3>\n<PRE>"); writer.write(e.toString()); LogSupport.ignore(log, e); } } writer.write("</PRE>\n<H3>Cookies:</H3>\n<PRE>"); Cookie[] cookies = request.getCookies(); if (cookies != null && cookies.length > 0) { for (int c = 0; c < cookies.length; c++) { Cookie cookie = cookies[c]; writer.write(cookie.getName()); writer.write("="); writer.write(cookie.getValue()); writer.write("\n"); } } writer.write("</PRE>\n<H3>Attributes:</H3>\n<PRE>"); Enumeration attributes = request.getAttributeNames(); if (attributes != null && attributes.hasMoreElements()) { while (attributes.hasMoreElements()) { String attr = attributes.nextElement().toString(); writer.write(attr); writer.write("="); writer.write(request.getAttribute(attr).toString()); writer.write("\n"); } } writer.write("</PRE>\n<H3>Content:</H3>\n<PRE>"); byte[] content = new byte[4096]; int len; try { InputStream in = request.getInputStream(); while ((len = in.read(content)) >= 0) writer.write(new String(content, 0, len)); } catch (IOException e) { LogSupport.ignore(log, e); writer.write(e.toString()); } // You wouldn't normally set a trailer like this, but // we don't want to commit the output to force trailers as // it makes test harness messy request.getAcceptableTransferCodings(); // commit now writer.flush(); response.setIntField(HttpFields.__ContentLength, buf.size() + 1000); buf.writeTo(out); out.flush(); // Now add the response buf.reset(); writer.write("</PRE>\n<H3>Response:</H3>\n<PRE>"); writer.write(response.toString()); writer.write("</PRE></HTML>"); writer.flush(); for (int pad = 998 - buf.size(); pad-- > 0;) writer.write(" "); writer.write("\015\012"); writer.flush(); buf.writeTo(out); request.setHandled(true); } }