blob: e0a5ee44877a80d16b894d0104ce476efc3916f5 [file] [log] [blame]
//
// ========================================================================
// Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
// ------------------------------------------------------------------------
// All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0
// and Apache License v2.0 which accompanies this distribution.
//
// The Eclipse Public License is available at
// http://www.eclipse.org/legal/epl-v10.html
//
// The Apache License v2.0 is available at
// http://www.opensource.org/licenses/apache2.0.php
//
// You may elect to redistribute this code under either of these licenses.
// ========================================================================
//
package org.eclipse.jetty.server;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Reader;
import java.io.Writer;
import java.nio.charset.StandardCharsets;
import java.util.Enumeration;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.eclipse.jetty.http.HttpHeader;
import org.eclipse.jetty.http.MimeTypes;
import org.eclipse.jetty.server.handler.AbstractHandler;
import org.eclipse.jetty.util.log.Log;
import org.eclipse.jetty.util.log.Logger;
/* ------------------------------------------------------------ */
/** 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 $
*
*/
public class DumpHandler extends AbstractHandler
{
private static final Logger LOG = Log.getLogger(DumpHandler.class);
String label="Dump HttpHandler";
public DumpHandler()
{
}
public DumpHandler(String label)
{
this.label=label;
}
/* ------------------------------------------------------------ */
/*
* @see org.eclipse.jetty.server.server.Handler#handle(java.lang.String, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, int)
*/
@Override
public void doHandle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
{
if (!isStarted())
return;
StringBuilder read = null;
if (request.getParameter("read")!=null)
{
read=new StringBuilder();
int len=Integer.parseInt(request.getParameter("read"));
Reader in = request.getReader();
for (int i=len;i-->0;)
read.append((char)in.read());
}
if (request.getParameter("date")!=null)
response.setHeader("Date",request.getParameter("date"));
if (request.getParameter("ISE")!=null)
{
throw new IllegalStateException("Testing ISE");
}
if (request.getParameter("error")!=null)
{
response.sendError(Integer.parseInt(request.getParameter("error")));
return;
}
baseRequest.setHandled(true);
response.setHeader(HttpHeader.CONTENT_TYPE.asString(),MimeTypes.Type.TEXT_HTML.asString());
OutputStream out = response.getOutputStream();
ByteArrayOutputStream buf = new ByteArrayOutputStream(2048);
Writer writer = new OutputStreamWriter(buf,StandardCharsets.ISO_8859_1);
writer.write("<html><h1>"+label+"</h1>");
writer.write("<pre>\npathInfo="+request.getPathInfo()+"\n</pre>\n");
writer.write("<pre>\ncontentType="+request.getContentType()+"\n</pre>\n");
writer.write("<pre>\nencoding="+request.getCharacterEncoding()+"\n</pre>\n");
writer.write("<pre>\nservername="+request.getServerName()+"\n</pre>\n");
writer.write("<pre>\nlocal="+request.getLocalAddr()+":"+request.getLocalPort()+"\n</pre>\n");
writer.write("<pre>\nremote="+request.getRemoteAddr()+":"+request.getRemotePort()+"\n</pre>\n");
writer.write("<h3>Header:</h3><pre>");
writer.write(request.getMethod()+" "+request.getRequestURI()+" "+request.getProtocol()+"\n");
Enumeration<String> headers = request.getHeaderNames();
while(headers.hasMoreElements())
{
String name=headers.nextElement();
writer.write(name);
writer.write(": ");
writer.write(request.getHeader(name));
writer.write("\n");
}
writer.write("</pre>\n<h3>Parameters:</h3>\n<pre>");
Enumeration<String> names=request.getParameterNames();
while(names.hasMoreElements())
{
String name=names.nextElement();
String[] values=request.getParameterValues(name);
if (values==null || values.length==0)
{
writer.write(name);
writer.write("=\n");
}
else if (values.length==1)
{
writer.write(name);
writer.write("=");
writer.write(values[0]);
writer.write("\n");
}
else
{
for (int i=0; i<values.length; i++)
{
writer.write(name);
writer.write("["+i+"]=");
writer.write(values[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{
String val=request.getParameter("CookieVal");
val=val.replaceAll("[ \n\r=<>]","?");
Cookie cookie=
new Cookie(cookie_name.trim(),val);
if ("Clear Cookie".equals(cookie_action))
cookie.setMaxAge(0);
response.addCookie(cookie);
}
catch(IllegalArgumentException e)
{
writer.write("</pre>\n<h3>BAD Set-Cookie:</h3>\n<pre>");
writer.write(e.toString());
}
}
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<String> 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>");
if (read!=null)
{
writer.write(read.toString());
}
else
{
char[] content= new char[4096];
int len;
try{
Reader in=request.getReader();
while((len=in.read(content))>=0)
writer.write(new String(content,0,len));
}
catch(IOException e)
{
writer.write(e.toString());
}
}
writer.write("</pre>\n");
writer.write("</html>\n");
writer.flush();
// commit now
response.setContentLength(buf.size()+1000);
response.addHeader("Before-Flush",response.isCommitted()?"Committed???":"Not Committed");
buf.writeTo(out);
out.flush();
response.addHeader("After-Flush","These headers should not be seen in the response!!!");
response.addHeader("After-Flush",response.isCommitted()?"Committed":"Not Committed?");
// write remaining content after commit
try
{
buf.reset();
writer.flush();
for (int pad=998;pad-->0;)
writer.write(" ");
writer.write("\r\n");
writer.flush();
buf.writeTo(out);
}
catch(Exception e)
{
LOG.ignore(e);
}
}
}