// Copyright 2010 Google Inc. // // 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 com.google.enterprise.connector.servlet; import java.io.IOException; import java.io.PrintWriter; import java.io.StringWriter; import java.util.ArrayList; import java.util.Enumeration; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Utility to dump servlet request and response packages in human- * readable form. Useful for debugging purposes, for instance, as * called from doTrace(). */ /* Moved out of ServletUtil, to avoid having ServletUtil depend upon * servlet-api.jar. */ public class ServletDump { private static Logger LOGGER = Logger.getLogger(ServletDump.class.getName()); private ServletDump() { // Prevent Instantiation. } /** * For Debugging: Write out the HttpServletRequest information. * This writes an XML stream to the response output that describes * most of the data received in the request structure. It returns * true, so that you may call it from doGet() like: * <code> if (dumpServletRequest(req, res)) return;</code> * without javac complaining about unreachable code with a straight * return. * * @param req An HttpServletRequest * @param res An HttpServletResponse * @return true */ public static boolean dumpServletRequest(HttpServletRequest req, HttpServletResponse res) throws IOException { res.setContentType(ServletUtil.MIMETYPE_XML); StringWriter stringWriter = new StringWriter(); PrintWriter out = new PrintWriter(stringWriter); ServletUtil.writeRootTag(out, false); ServletUtil.writeXMLTag(out, 2, "HttpServletRequest", false); ServletUtil.writeXMLElement(out, 3, "Method", req.getMethod()); ServletUtil.writeXMLElement(out, 3, "AuthType", req.getAuthType()); ServletUtil.writeXMLElement(out, 3, "ContextPath", req.getContextPath()); ServletUtil.writeXMLElement(out, 3, "PathInfo", req.getPathInfo()); ServletUtil.writeXMLElement(out, 3, "PathTranslated", req.getPathTranslated()); ServletUtil.writeXMLElement(out, 3, "QueryString", req.getQueryString()); ServletUtil.writeXMLElement(out, 3, "RemoteUser", req.getRemoteUser()); ServletUtil.writeXMLElement(out, 3, "RequestURI", req.getRequestURI()); ServletUtil.writeXMLElement(out, 3, "RequestURL", req.getRequestURL().toString()); ServletUtil.writeXMLElement(out, 3, "ServletPath", req.getServletPath()); ServletUtil.writeXMLTag(out, 3, "Headers", false); for (Enumeration<?> names = req.getHeaderNames(); names.hasMoreElements(); ) { String name = (String)(names.nextElement()); for (Enumeration<?> e = req.getHeaders(name); e.hasMoreElements(); ) ServletUtil.writeXMLElement(out, 4, name, (String)(e.nextElement())); } ServletUtil.writeXMLTag(out, 3, "Headers", true); ServletUtil.writeXMLTag(out, 2, "HttpServletRequest", true); ServletUtil.writeXMLTag(out, 2, "ServletRequest", false); ServletUtil.writeXMLElement(out, 3, "Protocol", req.getProtocol()); ServletUtil.writeXMLElement(out, 3, "Scheme", req.getScheme()); ServletUtil.writeXMLElement(out, 3, "ServerName", req.getServerName()); ServletUtil.writeXMLElement(out, 3, "ServerPort", String.valueOf(req.getServerPort())); ServletUtil.writeXMLElement(out, 3, "RemoteAddr", req.getRemoteAddr()); ServletUtil.writeXMLElement(out, 3, "RemoteHost", req.getRemoteHost()); Enumeration<?> names; ServletUtil.writeXMLTag(out, 3, "Attributes", false); for (names = req.getAttributeNames(); names.hasMoreElements(); ) { String name = (String)(names.nextElement()); ServletUtil.writeXMLElement(out, 4, name, req.getAttribute(name).toString()); } ServletUtil.writeXMLTag(out, 3, "Attributes", true); ServletUtil.writeXMLTag(out, 3, "Parameters", false); for (names = req.getParameterNames(); names.hasMoreElements(); ) { String name = (String)(names.nextElement()); String[] params = req.getParameterValues(name); for (int i = 0; i < params.length; i++) ServletUtil.writeXMLElement(out, 4, name, params[i]); } ServletUtil.writeXMLTag(out, 3, "Parameters", true); ServletUtil.writeXMLTag(out, 2, "ServletRequest", true); ServletUtil.writeRootTag(out, true); out.close(); String dumpStr = stringWriter.getBuffer().toString(); if (LOGGER.isLoggable(Level.FINE)) { List<String> callerClasses = getCallerClasses(); LOGGER.fine("HttpRequest handled by " + callerClasses.get(3) + "\ncalled by " + callerClasses.get(4) + "\n" + dumpStr); } // Now stuff it out to the response. out = res.getWriter(); out.write(dumpStr); out.close(); return true; } private static List<String> getCallerClasses() { StackTraceElement[] stack = Thread.currentThread().getStackTrace(); List<String> classes = new ArrayList<String>(stack.length); for (StackTraceElement element : stack) { String name = element.getClassName(); if (!name.contains(".reflect.")) { classes.add(name); } } return classes; } }