import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.BufferedReader;
import java.util.Enumeration;
import java.net.URLDecoder;
import java.io.UnsupportedEncodingException;

public class HttpRequestServlet extends HttpServlet {
    private static String htmlHead = "<html><head></head><body>";
    private static String htmlTail = "</body></html>";

    private void fieldInfo(
        PrintWriter o, String name, String info )
    {
        o.print( "<b>" + name + "</b>:" );
        o.print( info );
        o.print( "<br>" );
    }

    private void dumpInfo(
        PrintWriter o, HttpServletRequest request )
    {
        o.print("<h2>url</h2>");
        o.print("<p>");
        fieldInfo(o, "method", request.getMethod() );
        fieldInfo(o, "servlet-path", request.getServletPath() );
        fieldInfo(o, "path-info", request.getPathInfo() );
        fieldInfo(o, "query", request.getQueryString() );
        o.print("</p>");
        o.print("<h2>headers</h2>");
        o.print("<p>");
        Enumeration names = request.getHeaderNames();
        while ( names.hasMoreElements() ) {
            String name = names.nextElement().toString();
            fieldInfo(o, name, request.getHeader(name) );
        }
        o.print("</p>");
    }

    private void dumpQuery( PrintWriter o, String query ) {
        o.print("<h2>query</h2>");
        o.print("<p>");
        String[] pairs = query.split("\\&");
        for ( int i=0; i < pairs.length; i++) {
            String[] fields = pairs[i].split("=");
            try {
                String n =
                    URLDecoder.decode(fields[0], "ISO-8859-1");
                String v =
                    URLDecoder.decode(fields[1], "ISO-8859-1");
                fieldInfo( o, n, v );
            }
            catch( UnsupportedEncodingException ex ) {
                // ignore
            }
        }
        o.print("</p>");
    }

    protected void doGet(
        HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException
    {
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        out.println( htmlHead );
        dumpInfo( out, request );
        String q = request.getQueryString();
        if ( q != null ) {
            dumpQuery(out, q );
        }
        out.println( htmlTail );
    }

    protected void doPost(
        HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException
    {
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        out.println( htmlHead );
        dumpInfo( out, request );
        BufferedReader rd = request.getReader();
        out.println("<h2>content</h2>");
        int ch;
        StringBuilder sb = new StringBuilder();
        while ( (ch=rd.read()) != -1 ) {
            sb.append( (char)ch);
        }
        dumpQuery(out, sb.toString() );
        out.println( htmlTail );
    }
}
