Listing of Source cgi/SimpleStatusCGI.java
package se.entra.phantom.server.http;

import java.io.IOException;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Date;
import java.util.Enumeration;
import java.util.Vector;

import se.entra.phantom.common.Utilities;
import se.entra.phantom.server.ClientSessionManager;
import se.entra.phantom.server.ServerSocketInterface2;

/**
 * Returns the simple status of the server and requesting agent.
 */
public class SimpleStatusCGI implements CgiPrintInterface
{
  /**
   * This method should print a HTML document content using the
   * <code>PrintWriter</code> parameter.
   *
   * <p>The current directory of the CGI for the client agent is defined in the
   * <code>HttpSession</code> class instance.
   *
   * @throws  IOException  for IO errors.
   */
  @Override
  public void performAction(HttpSession session,PrintWriter out) throws IOException
    {
    Socket socket=session.socket;
    
    String referer=session.headerFields.getHeader(HttpHeaderFields.SHF_Referer);
    if ( referer==null )
      referer="<none>";
    
    out.print("<html><head>\r\n"
             +"  <meta http-equiv=\"Content-Type\" content=\"text/html; charset=iso-8859-1\">\r\n"
             +"  <title>"+Utilities.PROGRAM_NAME+" - Simple Status Servlet/CGI</title>\r\n"
             +"</head><body bgcolor=#FFFFFF text=#000000 topmargin=0 leftmargin=2>"

             +"<font size=4 face=\"Verdana, Arial, Helvetica, sans-serif\" color=\"#405D79\"><b>Server Information</b></font>"
             +"<font size=2 face=\"Verdana, Arial, Helvetica, sans-serif\">"

             +"  <p>Version: "+ClientSessionManager.progVer+"\r\n"
             +"  <br>Server universal time: "+HttpDate.getCurrentUTC()+"\r\n"
             +"  <br>Server local time: "+(new Date())+"\r\n"
             +"  <br>Connection since (local time): "+session.sessionEstablishedTime+"\r\n"
             +"  <br>Concurrent user count: "+ClientSessionManager.getServerAdminInterface().getClientConnectionCount()+"\r\n"
             +"  <br>Host name: "+session.hostName+"\r\n"
             +"  <br>Host address: "+session.hostAddress+"\r\n"
             +"  <br>Port: "+session.serverPort+"\r\n"
             +"  <br>HTTP request line: "+InternetCharacterConversion.stringConvertToHTMLString(session.requestLine)+"\r\n"
             +"  <br>Referer: "+InternetCharacterConversion.stringConvertToHTMLString(referer)+"\r\n"

             +"<p><font size=4 face=\"Verdana, Arial, Helvetica, sans-serif\" color=\"#405D79\"><b>Client Information</b></font>"
             +"<font size=2 face=\"Verdana, Arial, Helvetica, sans-serif\">\r\n"

             +"  <p>Agent: "+InternetCharacterConversion.stringConvertToHTMLString(session.environment.userAgent)+"\r\n"
             +"  <br>Host name: "+session.getClientDNSName()+"\r\n"
             +"  <br>Host address: "+session.getClientIPAddress()+"\r\n"
             +"  <br>Port: "+socket.getPort()+"\r\n"
             +"  <br>User ID: "+InternetCharacterConversion.stringConvertToHTMLString(session.environment.userID==null? "<none>": session.environment.userID)+"\r\n");

    if ( session.serverSocket.isUsingSSL() )
      {
      out.print("<p><font size=4 face=\"Verdana, Arial, Helvetica, sans-serif\" color=\"#405D79\"><b>SSL Information</b></font>"
               +"<font size=2 face=\"Verdana, Arial, Helvetica, sans-serif\">\r\n"

               +"  <p>Cipher suite: "+InternetCharacterConversion.stringConvertToHTMLString(session.serverSocket.getInformation(socket,ServerSocketInterface2.SSLINFO_GETCIPHER))+"\r\n"
               +"  <br>Maximum asymmetric bit-strength: "+session.serverSocket.getInformation(socket,ServerSocketInterface2.SSLINFO_GETEFFECTIVEBITS)+"\r\n");
      
      String s=session.serverSocket.getInformation(socket,ServerSocketInterface2.SSLINFO_CLIENTCERT_VERSION);
      if ( s!=null )
        {
        out.print("<p><font size=4 face=\"Verdana, Arial, Helvetica, sans-serif\" color=\"#405D79\"><b>Client Certificate Information</b></font>"
                 +"<font size=2 face=\"Verdana, Arial, Helvetica, sans-serif\">\r\n"

                 +"  <p>Version: "+s+"\r\n"
                 +"  <br>Serial number: "+session.serverSocket.getInformation(socket,ServerSocketInterface2.SSLINFO_CLIENTCERT_SERIALNUMBER)+"\r\n"
                 +"  <br>Signature algorithm: "+InternetCharacterConversion.stringConvertToHTMLString(session.serverSocket.getInformation(socket,ServerSocketInterface2.SSLINFO_CLIENTCERT_SIGNATUREALGORITHM       ))+"\r\n"
                 +"  <br>Issuer: "             +InternetCharacterConversion.stringConvertToHTMLString(session.serverSocket.getInformation(socket,ServerSocketInterface2.SSLINFO_CLIENTCERT_ISSUER ).replace('\0',','))+"\r\n"
                 +"  <br>Valid from: "         +InternetCharacterConversion.stringConvertToHTMLString(session.serverSocket.getInformation(socket,ServerSocketInterface2.SSLINFO_CLIENTCERT_VALIDFROM                ))+"\r\n"
                 +"  <br>Valid to: "           +InternetCharacterConversion.stringConvertToHTMLString(session.serverSocket.getInformation(socket,ServerSocketInterface2.SSLINFO_CLIENTCERT_VALIDTO                  ))+"\r\n"
                 +"  <br>Subject: "            +InternetCharacterConversion.stringConvertToHTMLString(session.serverSocket.getInformation(socket,ServerSocketInterface2.SSLINFO_CLIENTCERT_SUBJECT).replace('\0',','))+"\r\n"
                 +"  <br>Public key format: "  +InternetCharacterConversion.stringConvertToHTMLString(session.serverSocket.getInformation(socket,ServerSocketInterface2.SSLINFO_CLIENTCERT_PUBLICKEYFORMAT          ))+"\r\n");
        }
      }

    if ( session.uriParams!=null )
      out.print("<p><font size=4 face=\"Verdana, Arial, Helvetica, sans-serif\" color=\"#405D79\"><b>URI Parameter</b></font>"
               +"<font size=2 face=\"Verdana, Arial, Helvetica, sans-serif\">\r\n"

               +"  <p>Parameter: "+InternetCharacterConversion.stringConvertToHTMLString(session.uriParams)+"\r\n");

    Vector<HttpCookie> cv=session.headerFields.getCookies();
    if ( cv!=null )
      {
      out.print("<p><font size=4 face=\"Verdana, Arial, Helvetica, sans-serif\" color=\"#405D79\"><b>Cookies</b></font>"
               +"<font size=2 face=\"Verdana, Arial, Helvetica, sans-serif\">\r\n");

      Enumeration<HttpCookie> e=cv.elements();
      String first="<p>";
      while ( e.hasMoreElements() )
        {
        HttpCookie cookie=e.nextElement();
        out.print("  "+first
                 +"name = '"+InternetCharacterConversion.stringConvertToHTMLString(cookie.name)
                 +"', value = '"+InternetCharacterConversion.stringConvertToHTMLString(cookie.value)
                 +"'\r\n");
        first="<br>";
        }
      }

    if ( session.formData!=null )
      {
      out.print("<p><font size=4 face=\"Verdana, Arial, Helvetica, sans-serif\" color=\"#405D79\"><b>HTML Form Data</b></font>"
               +"<font size=2 face=\"Verdana, Arial, Helvetica, sans-serif\">\r\n");

      Enumeration<String> e=session.formData.keys();
      String first="<p>";
      while ( e.hasMoreElements() )
        {
        String n=e.nextElement();
        String v=session.formData.get(n);
        out.print("  "+first
                 +"name = '"+InternetCharacterConversion.stringConvertToHTMLString(n)
                 +"', value = '"+InternetCharacterConversion.stringConvertToHTMLString(v)
                 +"'\r\n");
        first="<br>";
        }
      }

    out.print("</body></html>\r\n");
    }
}