<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://www.jexp.ru/index.php?action=history&amp;feed=atom&amp;title=Java%2FJSP%2FJSP_Debug</id>
		<title>Java/JSP/JSP Debug - История изменений</title>
		<link rel="self" type="application/atom+xml" href="http://www.jexp.ru/index.php?action=history&amp;feed=atom&amp;title=Java%2FJSP%2FJSP_Debug"/>
		<link rel="alternate" type="text/html" href="http://www.jexp.ru/index.php?title=Java/JSP/JSP_Debug&amp;action=history"/>
		<updated>2026-04-23T04:25:50Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://www.jexp.ru/index.php?title=Java/JSP/JSP_Debug&amp;diff=8657&amp;oldid=prev</id>
		<title>Admin: 1 версия</title>
		<link rel="alternate" type="text/html" href="http://www.jexp.ru/index.php?title=Java/JSP/JSP_Debug&amp;diff=8657&amp;oldid=prev"/>
				<updated>2010-06-01T07:10:22Z</updated>
		
		<summary type="html">&lt;p&gt;1 версия&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr style=&quot;vertical-align: top;&quot; lang=&quot;ru&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;← Предыдущая&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;Версия 07:10, 1 июня 2010&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; style=&quot;text-align: center;&quot; lang=&quot;ru&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(нет различий)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	<entry>
		<id>http://www.jexp.ru/index.php?title=Java/JSP/JSP_Debug&amp;diff=8656&amp;oldid=prev</id>
		<title> в 18:01, 31 мая 2010</title>
		<link rel="alternate" type="text/html" href="http://www.jexp.ru/index.php?title=Java/JSP/JSP_Debug&amp;diff=8656&amp;oldid=prev"/>
				<updated>2010-05-31T18:01:47Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== A command-line interface to a Web server ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
*  Copyright (c) 2002 by Phil Hanna&lt;br /&gt;
*  All rights reserved.&lt;br /&gt;
*  &lt;br /&gt;
*  You may study, use, modify, and distribute this&lt;br /&gt;
*  software for any purpose provided that this&lt;br /&gt;
*  copyright notice appears in all copies.&lt;br /&gt;
*  &lt;br /&gt;
*  This software is provided without warranty&lt;br /&gt;
*  either expressed or implied.&lt;br /&gt;
*/&lt;br /&gt;
import java.io.BufferedReader;&lt;br /&gt;
import java.io.IOException;&lt;br /&gt;
import java.io.InputStreamReader;&lt;br /&gt;
import java.io.PrintWriter;&lt;br /&gt;
import java.net.Socket;&lt;br /&gt;
import java.util.regex.Matcher;&lt;br /&gt;
import java.util.regex.Pattern;&lt;br /&gt;
/**&lt;br /&gt;
* Mainline for running the Web client&lt;br /&gt;
*/&lt;br /&gt;
public class MainWebClient&lt;br /&gt;
{&lt;br /&gt;
   /**&lt;br /&gt;
   * Reads command line parameters, creates a new&lt;br /&gt;
   * &amp;lt;code&amp;gt;WebClient&amp;lt;/code&amp;gt; object, then invokes it.&lt;br /&gt;
   */&lt;br /&gt;
   public static void main(String[] args)&lt;br /&gt;
      throws IOException&lt;br /&gt;
   {&lt;br /&gt;
      // Default values&lt;br /&gt;
      String host = &amp;quot;localhost&amp;quot;;&lt;br /&gt;
      int port = 80;&lt;br /&gt;
      // Use values from command line, if specified&lt;br /&gt;
      for (int i = 0; i &amp;lt; args.length; i++) {&lt;br /&gt;
         String arg = args[i];&lt;br /&gt;
         if (arg.equals(&amp;quot;-h&amp;quot;) || arg.equals(&amp;quot;-help&amp;quot;)) {&lt;br /&gt;
            showUsage();&lt;br /&gt;
            return;&lt;br /&gt;
         }&lt;br /&gt;
         else&lt;br /&gt;
         if (arg.equals(&amp;quot;-host&amp;quot;) &amp;amp;&amp;amp; ++i &amp;lt; args.length)&lt;br /&gt;
            host = args[i];&lt;br /&gt;
         else&lt;br /&gt;
         if (arg.equals(&amp;quot;-port&amp;quot;) &amp;amp;&amp;amp; ++i &amp;lt; args.length)&lt;br /&gt;
            port = Integer.parseInt(args[i]);&lt;br /&gt;
      }&lt;br /&gt;
      // Create and start the Web client&lt;br /&gt;
      new WebClient(host, port).run();&lt;br /&gt;
   }&lt;br /&gt;
   /**&lt;br /&gt;
   * Displays the calling syntax&lt;br /&gt;
   */&lt;br /&gt;
   private static void showUsage()&lt;br /&gt;
   {&lt;br /&gt;
      String[] text = {&lt;br /&gt;
         &amp;quot;usage: java com.jspcr.debug.webclient.Main&amp;quot;&lt;br /&gt;
         + &amp;quot; [-host &amp;lt;hostName&amp;gt;]&amp;quot;&lt;br /&gt;
         + &amp;quot; [-port &amp;lt;portNumber&amp;gt;]&amp;quot;,&lt;br /&gt;
      };&lt;br /&gt;
      for (int i = 0; i &amp;lt; text.length; i++)&lt;br /&gt;
         System.out.println(text[i]);&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
*  Copyright (c) 2002 by Phil Hanna&lt;br /&gt;
*  All rights reserved.&lt;br /&gt;
*  &lt;br /&gt;
*  You may study, use, modify, and distribute this&lt;br /&gt;
*  software for any purpose provided that this&lt;br /&gt;
*  copyright notice appears in all copies.&lt;br /&gt;
*  &lt;br /&gt;
*  This software is provided without warranty&lt;br /&gt;
*  either expressed or implied.&lt;br /&gt;
*/&lt;br /&gt;
/**&lt;br /&gt;
* A command-line interface to a Web server&lt;br /&gt;
*/&lt;br /&gt;
class WebClient&lt;br /&gt;
{&lt;br /&gt;
   // Instance variables&lt;br /&gt;
   private String host;&lt;br /&gt;
   private int port;&lt;br /&gt;
   /**&lt;br /&gt;
   * Creates a new Web client&lt;br /&gt;
   * @param host the HTTP server&lt;br /&gt;
   * @param port the server port number&lt;br /&gt;
   */&lt;br /&gt;
   public WebClient(String host, int port)&lt;br /&gt;
   {&lt;br /&gt;
      this.host = host;&lt;br /&gt;
      this.port = port;&lt;br /&gt;
   }&lt;br /&gt;
   /**&lt;br /&gt;
   * Runs the Web client&lt;br /&gt;
   * @throws IOException if a socket error occurs&lt;br /&gt;
   */&lt;br /&gt;
   public void run() throws IOException&lt;br /&gt;
   {&lt;br /&gt;
      int contentLength = 0;&lt;br /&gt;
      // Open a socket to the Web host&lt;br /&gt;
      Socket socket = new Socket(host, port);&lt;br /&gt;
      // Set up to read input from the user&lt;br /&gt;
      // and echo it to Web host&lt;br /&gt;
      BufferedReader in =&lt;br /&gt;
         new BufferedReader(new InputStreamReader(System.in));&lt;br /&gt;
      PrintWriter out =&lt;br /&gt;
         new PrintWriter(socket.getOutputStream(), true);&lt;br /&gt;
      // The first line is the HTTP request&lt;br /&gt;
      // e.g., &amp;quot;GET /path HTTP/1.0&amp;quot;&lt;br /&gt;
      String line = in.readLine();&lt;br /&gt;
      out.println(line);&lt;br /&gt;
      // Read and echo any other headers, stopping&lt;br /&gt;
      // when a blank line is encountered.&lt;br /&gt;
      while ((line = in.readLine()) != null) {&lt;br /&gt;
         line = line.trim();&lt;br /&gt;
         out.println(line);&lt;br /&gt;
         if (line.equals(&amp;quot;&amp;quot;))&lt;br /&gt;
            break;&lt;br /&gt;
         // Check for a Content-Length header&lt;br /&gt;
         Pattern p = Pattern.rupile&lt;br /&gt;
            (&amp;quot;^\\s*([^:]+):\\s+(.*\\S)\\s*$&amp;quot;);&lt;br /&gt;
         Matcher m = p.matcher(line);&lt;br /&gt;
         if (m.matches()) {&lt;br /&gt;
            String name = m.group(1);&lt;br /&gt;
            String value = m.group(2);&lt;br /&gt;
            if (name.equalsIgnoreCase(&amp;quot;Content-Length&amp;quot;))&lt;br /&gt;
               contentLength = Integer.parseInt(value);&lt;br /&gt;
         }&lt;br /&gt;
      }&lt;br /&gt;
      // If a non-zero content length header was used,&lt;br /&gt;
      // read and echo that many bytes to the Web host.&lt;br /&gt;
      if (contentLength &amp;gt; 0) {&lt;br /&gt;
         for (int i = 0; i &amp;lt; contentLength; i++)&lt;br /&gt;
            out.print((char) in.read());&lt;br /&gt;
         out.flush();&lt;br /&gt;
      }&lt;br /&gt;
      // The server is now working on the request.&lt;br /&gt;
      // Read its output and dump to stdout&lt;br /&gt;
      in = new BufferedReader(&lt;br /&gt;
           new InputStreamReader(socket.getInputStream()));&lt;br /&gt;
      out = new PrintWriter(System.out);&lt;br /&gt;
      for (;;) {&lt;br /&gt;
         line = in.readLine();&lt;br /&gt;
         if (line == null)&lt;br /&gt;
            break;&lt;br /&gt;
         out.println(line);&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      // Close files&lt;br /&gt;
      in.close();&lt;br /&gt;
      out.close();&lt;br /&gt;
      socket.close();&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
           &lt;br /&gt;
       &amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== HTTP Echo For testing ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import java.net.Socket;&lt;br /&gt;
import java.net.ServerSocket;&lt;br /&gt;
import java.io.IOException;&lt;br /&gt;
import java.io.InputStream;&lt;br /&gt;
import java.io.OutputStream;&lt;br /&gt;
import java.io.BufferedInputStream;&lt;br /&gt;
public class HTTPEcho {&lt;br /&gt;
   private static final int BUF_SIZE = 1024;&lt;br /&gt;
   private Socket browserSocket = null;&lt;br /&gt;
   private Socket webServerSocket = null;&lt;br /&gt;
   private ServerSocket browserListenerSocket = null;&lt;br /&gt;
   private OutputStream toWebServer = null;&lt;br /&gt;
   private BufferedInputStream fromWebServer = null;&lt;br /&gt;
   private OutputStream toBrowser = null;&lt;br /&gt;
   private BufferedInputStream fromBrowser = null; &lt;br /&gt;
   private ServerSocket createListenerSocket(int portNum)  {&lt;br /&gt;
      ServerSocket socket = null;&lt;br /&gt;
      try  {&lt;br /&gt;
         socket = new ServerSocket(portNum);&lt;br /&gt;
      }&lt;br /&gt;
      catch (IOException ioe)  {&lt;br /&gt;
         System.out.println(ioe.getMessage());&lt;br /&gt;
         System.exit(-1);&lt;br /&gt;
      }&lt;br /&gt;
      return socket;&lt;br /&gt;
   }&lt;br /&gt;
   private Socket createClientSocket(String host, int portNum)  {&lt;br /&gt;
      Socket socket = null;&lt;br /&gt;
      try  {&lt;br /&gt;
         socket = new Socket(host, portNum);&lt;br /&gt;
         toWebServer = socket.getOutputStream();&lt;br /&gt;
         fromWebServer = &lt;br /&gt;
            new BufferedInputStream(socket.getInputStream());&lt;br /&gt;
      }&lt;br /&gt;
      catch (IOException ioe)  {&lt;br /&gt;
         System.out.println(ioe.getMessage());&lt;br /&gt;
         System.exit(-1);&lt;br /&gt;
      }&lt;br /&gt;
      return socket;&lt;br /&gt;
   }&lt;br /&gt;
   private Socket accept ()  {&lt;br /&gt;
      Socket socket = null;&lt;br /&gt;
      try {&lt;br /&gt;
         socket = browserListenerSocket.accept();&lt;br /&gt;
         toBrowser = socket.getOutputStream();&lt;br /&gt;
         fromBrowser = &lt;br /&gt;
            new BufferedInputStream(socket.getInputStream());&lt;br /&gt;
      }&lt;br /&gt;
      catch (IOException e) {&lt;br /&gt;
         System.out.println(&amp;quot;Accept failed: &amp;quot; +  e.getMessage());&lt;br /&gt;
         System.exit(-1);&lt;br /&gt;
      }&lt;br /&gt;
      return socket;&lt;br /&gt;
   }&lt;br /&gt;
   private void setBrowserListenerSocket(ServerSocket socket)  {&lt;br /&gt;
      browserListenerSocket = socket;&lt;br /&gt;
   }&lt;br /&gt;
   private void setWebServerSocket(Socket socket)  {&lt;br /&gt;
      webServerSocket = socket;&lt;br /&gt;
   }&lt;br /&gt;
   private void setBrowserSocket(Socket socket)  {&lt;br /&gt;
      browserSocket = socket;&lt;br /&gt;
   }&lt;br /&gt;
   private int readLine(InputStream in, byte[] b, int off, int len) throws IOException {&lt;br /&gt;
      if (len &amp;lt;= 0) {&lt;br /&gt;
         return 0;&lt;br /&gt;
      }&lt;br /&gt;
      int count = 0, c;&lt;br /&gt;
      while ((c = in.read()) != -1 &amp;amp;&amp;amp; count &amp;lt; len) {&lt;br /&gt;
         b[off++] = (byte)c;&lt;br /&gt;
         count++;&lt;br /&gt;
         if (c == &amp;quot;\n&amp;quot;) {&lt;br /&gt;
            break;&lt;br /&gt;
         }&lt;br /&gt;
      }&lt;br /&gt;
      return count &amp;gt; 0 ? count : -1;&lt;br /&gt;
   }&lt;br /&gt;
   private void echoBuffer(BufferedInputStream in, OutputStream out)  {&lt;br /&gt;
      byte[] readBuf = new byte[BUF_SIZE];&lt;br /&gt;
      try  {&lt;br /&gt;
         int rlen = -1;&lt;br /&gt;
         int bodyLen = 0;&lt;br /&gt;
         String line = null;&lt;br /&gt;
         do  {&lt;br /&gt;
            line = null;&lt;br /&gt;
            rlen = readLine(in, readBuf, 0, BUF_SIZE);&lt;br /&gt;
            if (rlen &amp;gt; 0)  {&lt;br /&gt;
               line = new String(readBuf, 0, rlen); &lt;br /&gt;
               System.out.print(line);&lt;br /&gt;
               if (line.startsWith(&amp;quot;Content-Length: &amp;quot;)) {&lt;br /&gt;
                  String size = &lt;br /&gt;
                     line.substring(&amp;quot;Content-Length: &amp;quot;.length(), &lt;br /&gt;
                                    line.length());&lt;br /&gt;
                  bodyLen = Integer.parseInt(size.trim()); &lt;br /&gt;
               }&lt;br /&gt;
               out.write(readBuf, 0, rlen);&lt;br /&gt;
            }&lt;br /&gt;
         } while ((rlen &amp;gt; 0) &amp;amp;&amp;amp; !(line.equals(&amp;quot;\r\n&amp;quot;)));&lt;br /&gt;
         if (bodyLen &amp;gt; 0) {&lt;br /&gt;
            System.out.println(&amp;quot;&amp;lt;Entity-Body&amp;gt;&amp;quot;);&lt;br /&gt;
            int count = 0;&lt;br /&gt;
            do  {&lt;br /&gt;
               rlen = in.read(readBuf, 0, BUF_SIZE);&lt;br /&gt;
               if (rlen &amp;gt; 0)  {&lt;br /&gt;
                  out.write(readBuf, 0, rlen);&lt;br /&gt;
                  count += rlen;&lt;br /&gt;
               }else break;&lt;br /&gt;
            } while (count &amp;lt; bodyLen);&lt;br /&gt;
         }&lt;br /&gt;
         out.flush();&lt;br /&gt;
      }&lt;br /&gt;
      catch (IOException ioe)  {&lt;br /&gt;
         System.out.println(ioe.getMessage());&lt;br /&gt;
      }&lt;br /&gt;
      finally  {&lt;br /&gt;
         readBuf = null;&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
   private void echo()  {&lt;br /&gt;
      System.out.println(&amp;quot;\nHTTP REQUEST:&amp;quot;);&lt;br /&gt;
      echoBuffer(fromBrowser, toWebServer);&lt;br /&gt;
      System.out.println(&amp;quot;\nHTTP REPLY:&amp;quot;);&lt;br /&gt;
      echoBuffer(fromWebServer, toBrowser);&lt;br /&gt;
   }&lt;br /&gt;
   private void closeClientDescriptors()  {&lt;br /&gt;
      try  {&lt;br /&gt;
         fromWebServer.close();&lt;br /&gt;
         toWebServer.close();&lt;br /&gt;
         webServerSocket.close();&lt;br /&gt;
         fromBrowser.close();&lt;br /&gt;
         toBrowser.close();&lt;br /&gt;
         browserSocket.close();&lt;br /&gt;
      }&lt;br /&gt;
      catch (IOException ioe)  {&lt;br /&gt;
         System.out.println(ioe.getMessage());&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
   public static void main(String [] args) {&lt;br /&gt;
      HTTPEcho echo = new HTTPEcho();&lt;br /&gt;
      if (args.length &amp;gt; 1)  {&lt;br /&gt;
         System.out.println(&amp;quot;Starting HTTPEcho on port: &amp;quot; + args[0] + &amp;quot;. &amp;quot;);&lt;br /&gt;
         System.out.println(&amp;quot;Web server host: &amp;quot; + args[1] + &amp;quot;.&amp;quot;);&lt;br /&gt;
         System.out.println(&amp;quot;Web server is on port: &amp;quot; + args[2] + &amp;quot;.&amp;quot;);&lt;br /&gt;
      int interceptorPort = Integer.parseInt(args[0]);&lt;br /&gt;
      String webServerHost = args[1];&lt;br /&gt;
      int webServerPort = Integer.parseInt(args[2]);&lt;br /&gt;
      echo.setBrowserListenerSocket(echo.createListenerSocket(interceptorPort));&lt;br /&gt;
         while (true)  {&lt;br /&gt;
            echo.setBrowserSocket(echo.accept());&lt;br /&gt;
            echo.setWebServerSocket(echo.createClientSocket(webServerHost, &lt;br /&gt;
                                    webServerPort));&lt;br /&gt;
            echo.echo();&lt;br /&gt;
            echo.closeClientDescriptors();&lt;br /&gt;
         }&lt;br /&gt;
      }&lt;br /&gt;
      else {&lt;br /&gt;
         System.out.println(&amp;quot;Usage: java HTTPEcho &amp;quot; + &lt;br /&gt;
                            &amp;quot;interceptorPort &amp;quot; +&lt;br /&gt;
                            &amp;quot;webServerHost webServerPort&amp;quot;);&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
           &lt;br /&gt;
       &amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Mainline for the HTTP tracer tool ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 *  Copyright (c) 2002 by Phil Hanna&lt;br /&gt;
 *  All rights reserved.&lt;br /&gt;
 *  &lt;br /&gt;
 *  You may study, use, modify, and distribute this&lt;br /&gt;
 *  software for any purpose provided that this&lt;br /&gt;
 *  copyright notice appears in all copies.&lt;br /&gt;
 *  &lt;br /&gt;
 *  This software is provided without warranty&lt;br /&gt;
 *  either expressed or implied.&lt;br /&gt;
 */&lt;br /&gt;
import java.io.BufferedInputStream;&lt;br /&gt;
import java.io.BufferedOutputStream;&lt;br /&gt;
import java.io.FileWriter;&lt;br /&gt;
import java.io.IOException;&lt;br /&gt;
import java.io.InputStream;&lt;br /&gt;
import java.io.OutputStream;&lt;br /&gt;
import java.io.PrintWriter;&lt;br /&gt;
import java.io.Writer;&lt;br /&gt;
import java.net.ServerSocket;&lt;br /&gt;
import java.net.Socket;&lt;br /&gt;
/**&lt;br /&gt;
 * Mainline for the HTTP tracer tool&lt;br /&gt;
 */&lt;br /&gt;
public class MainHTTPTracerTool {&lt;br /&gt;
  public static void main(String[] args) throws IOException {&lt;br /&gt;
    String opt_host = null;&lt;br /&gt;
    String opt_port = null;&lt;br /&gt;
    String opt_tracerPort = null;&lt;br /&gt;
    String opt_log = null;&lt;br /&gt;
    try {&lt;br /&gt;
      // Parse command line arguments&lt;br /&gt;
      for (int i = 0, n = args.length; i &amp;lt; n; i++) {&lt;br /&gt;
        String arg = args[i];&lt;br /&gt;
        if (arg.equals(&amp;quot;-h&amp;quot;)) {&lt;br /&gt;
          showUsage();&lt;br /&gt;
          return;&lt;br /&gt;
        }&lt;br /&gt;
        if (arg.equals(&amp;quot;-host&amp;quot;) &amp;amp;&amp;amp; (i + 1 &amp;lt; n))&lt;br /&gt;
          opt_host = args[++i];&lt;br /&gt;
        else if (arg.equals(&amp;quot;-port&amp;quot;) &amp;amp;&amp;amp; (i + 1 &amp;lt; n))&lt;br /&gt;
          opt_port = args[++i];&lt;br /&gt;
        else if (arg.equals(&amp;quot;-tracerPort&amp;quot;) &amp;amp;&amp;amp; (i + 1 &amp;lt; n))&lt;br /&gt;
          opt_tracerPort = args[++i];&lt;br /&gt;
        else if (arg.equals(&amp;quot;-log&amp;quot;) &amp;amp;&amp;amp; (i + 1 &amp;lt; n))&lt;br /&gt;
          opt_log = args[++i];&lt;br /&gt;
        else&lt;br /&gt;
          throw new IllegalArgumentException(&amp;quot;Unrecognized option &amp;quot;&lt;br /&gt;
              + arg);&lt;br /&gt;
      }&lt;br /&gt;
      // Verify that there is no port conflict&lt;br /&gt;
      int testTracerPort = (opt_tracerPort == null) ? Tracer.DEFAULT_PORT&lt;br /&gt;
          : Integer.parseInt(opt_tracerPort);&lt;br /&gt;
      int testHostPort = (opt_port == null) ? RequestHandler.DEFAULT_PORT&lt;br /&gt;
          : Integer.parseInt(opt_port);&lt;br /&gt;
      if (testTracerPort == testHostPort)&lt;br /&gt;
        throw new IllegalArgumentException(&lt;br /&gt;
            &amp;quot;Cannot assign port and tracerPort both to &amp;quot;&lt;br /&gt;
                + testHostPort);&lt;br /&gt;
    } catch (IllegalArgumentException e) {&lt;br /&gt;
      System.err.println(e.getMessage());&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
    // Create the tracer and set its properties&lt;br /&gt;
    Tracer tracer = new Tracer();&lt;br /&gt;
    if (opt_host != null)&lt;br /&gt;
      tracer.setHost(opt_host);&lt;br /&gt;
    if (opt_port != null)&lt;br /&gt;
      tracer.setPort(Integer.parseInt(opt_port));&lt;br /&gt;
    if (opt_tracerPort != null)&lt;br /&gt;
      tracer.setTracerPort(Integer.parseInt(opt_tracerPort));&lt;br /&gt;
    if (opt_log != null)&lt;br /&gt;
      tracer.setLogWriter(new FileWriter(opt_log));&lt;br /&gt;
    // Start it running&lt;br /&gt;
    tracer.start();&lt;br /&gt;
  }&lt;br /&gt;
  public static final void showUsage() {&lt;br /&gt;
    String[] text = { &amp;quot;&amp;quot;, &amp;quot;usage: java -jar tracer.jar [options]&amp;quot;, &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;where options are:&amp;quot;, &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;-host         &amp;lt;hostName&amp;gt;  (default is localhost)&amp;quot;,&lt;br /&gt;
        &amp;quot;-port         &amp;lt;hostPort&amp;gt;  (default is 80)&amp;quot;,&lt;br /&gt;
        &amp;quot;-tracerPort   &amp;lt;localPort&amp;gt; (default is 8601)&amp;quot;,&lt;br /&gt;
        &amp;quot;-log          &amp;lt;fileName&amp;gt;  (default is stdout)&amp;quot;, };&lt;br /&gt;
    for (int i = 0; i &amp;lt; text.length; i++)&lt;br /&gt;
      System.out.println(text[i]);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
/**&lt;br /&gt;
 * Copyright (c) 2002 by Phil Hanna All rights reserved.&lt;br /&gt;
 * &lt;br /&gt;
 * You may study, use, modify, and distribute this software for any purpose&lt;br /&gt;
 * provided that this copyright notice appears in all copies.&lt;br /&gt;
 * &lt;br /&gt;
 * This software is provided without warranty either expressed or implied.&lt;br /&gt;
 */&lt;br /&gt;
/**&lt;br /&gt;
 * Acts as a proxy web server, capturing requests and responses and echoing the&lt;br /&gt;
 * headers to a log stream.&lt;br /&gt;
 */&lt;br /&gt;
class Tracer extends Thread implements Logger {&lt;br /&gt;
  public static final int DEFAULT_PORT = 8601;&lt;br /&gt;
  private String host;&lt;br /&gt;
  private int port;&lt;br /&gt;
  private int tracerPort;&lt;br /&gt;
  private PrintWriter logWriter;&lt;br /&gt;
  public void run() {&lt;br /&gt;
    // Set defaults if not otherwise specified&lt;br /&gt;
    if (tracerPort == 0)&lt;br /&gt;
      tracerPort = DEFAULT_PORT;&lt;br /&gt;
    if (logWriter == null)&lt;br /&gt;
      logWriter = new PrintWriter(System.out);&lt;br /&gt;
    // Start proxy server&lt;br /&gt;
    try {&lt;br /&gt;
      log(&amp;quot;M: Opening tracer server on tracerPort &amp;quot; + tracerPort);&lt;br /&gt;
      ServerSocket server = new ServerSocket(tracerPort);&lt;br /&gt;
      // Loop forever&lt;br /&gt;
      while (true) {&lt;br /&gt;
        // Wait for connection&lt;br /&gt;
        log(&amp;quot;M: Waiting for connections&amp;quot;);&lt;br /&gt;
        Socket client = server.accept();&lt;br /&gt;
        log(&amp;quot;M: Connection received from &amp;quot; + client);&lt;br /&gt;
        // Dispatch it to a request handler thread&lt;br /&gt;
        RequestHandler rh = new RequestHandler(client);&lt;br /&gt;
        rh.setLogger(this);&lt;br /&gt;
        if (host != null)&lt;br /&gt;
          rh.setHost(host);&lt;br /&gt;
        if (port != 0)&lt;br /&gt;
          rh.setPort(port);&lt;br /&gt;
        rh.start();&lt;br /&gt;
      }&lt;br /&gt;
    } catch (IOException e) {&lt;br /&gt;
      e.printStackTrace();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  // ===========================================&lt;br /&gt;
  //    Implementation of Logger&lt;br /&gt;
  // ===========================================&lt;br /&gt;
  /**&lt;br /&gt;
   * Writes a message to the log&lt;br /&gt;
   * &lt;br /&gt;
   * @param message&lt;br /&gt;
   *            the message&lt;br /&gt;
   */&lt;br /&gt;
  public synchronized void log(String message) {&lt;br /&gt;
    logWriter.println(message);&lt;br /&gt;
    logWriter.flush();&lt;br /&gt;
  }&lt;br /&gt;
  // ===========================================&lt;br /&gt;
  //    Property setters&lt;br /&gt;
  // ===========================================&lt;br /&gt;
  /**&lt;br /&gt;
   * Sets the host.&lt;br /&gt;
   * &lt;br /&gt;
   * @param host&lt;br /&gt;
   *            the host.&lt;br /&gt;
   */&lt;br /&gt;
  public void setHost(String host) {&lt;br /&gt;
    this.host = host;&lt;br /&gt;
  }&lt;br /&gt;
  /**&lt;br /&gt;
   * Sets the port.&lt;br /&gt;
   * &lt;br /&gt;
   * @param port&lt;br /&gt;
   *            the port.&lt;br /&gt;
   */&lt;br /&gt;
  public void setPort(int port) {&lt;br /&gt;
    this.port = port;&lt;br /&gt;
  }&lt;br /&gt;
  /**&lt;br /&gt;
   * Sets the tracerPort.&lt;br /&gt;
   * &lt;br /&gt;
   * @param tracerPort&lt;br /&gt;
   *            the tracerPort.&lt;br /&gt;
   */&lt;br /&gt;
  public void setTracerPort(int tracerPort) {&lt;br /&gt;
    this.tracerPort = tracerPort;&lt;br /&gt;
  }&lt;br /&gt;
  /**&lt;br /&gt;
   * Sets the logWriter.&lt;br /&gt;
   * &lt;br /&gt;
   * @param logWriter&lt;br /&gt;
   *            the logWriter.&lt;br /&gt;
   */&lt;br /&gt;
  public void setLogWriter(Writer logWriter) throws IOException {&lt;br /&gt;
    this.logWriter = new PrintWriter(logWriter);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
/**&lt;br /&gt;
 * Copyright (c) 2002 by Phil Hanna All rights reserved.&lt;br /&gt;
 * &lt;br /&gt;
 * You may study, use, modify, and distribute this software for any purpose&lt;br /&gt;
 * provided that this copyright notice appears in all copies.&lt;br /&gt;
 * &lt;br /&gt;
 * This software is provided without warranty either expressed or implied.&lt;br /&gt;
 */&lt;br /&gt;
/**&lt;br /&gt;
 * A proxy HTTP server that handles a single request&lt;br /&gt;
 */&lt;br /&gt;
class RequestHandler extends Thread {&lt;br /&gt;
  public static final String DEFAULT_HOST = &amp;quot;localhost&amp;quot;;&lt;br /&gt;
  public static final int DEFAULT_PORT = 80;&lt;br /&gt;
  private Socket client;&lt;br /&gt;
  private Logger logger;&lt;br /&gt;
  private String host;&lt;br /&gt;
  private int port;&lt;br /&gt;
  // ===========================================&lt;br /&gt;
  //    Constructors&lt;br /&gt;
  // ===========================================&lt;br /&gt;
  /**&lt;br /&gt;
   * Creates a new &amp;lt;code&amp;gt;RequestHandler&amp;lt;/code&amp;gt; for the specified client&lt;br /&gt;
   */&lt;br /&gt;
  public RequestHandler(Socket client) {&lt;br /&gt;
    this.client = client;&lt;br /&gt;
  }&lt;br /&gt;
  // ===========================================&lt;br /&gt;
  //    Instance methods&lt;br /&gt;
  // ===========================================&lt;br /&gt;
  /**&lt;br /&gt;
   * Copies the request from the client to the server and copies the response&lt;br /&gt;
   * back to the client.&lt;br /&gt;
   */&lt;br /&gt;
  public void run() {&lt;br /&gt;
    try {&lt;br /&gt;
      // Open a socket to the web server&lt;br /&gt;
      if (host == null)&lt;br /&gt;
        host = DEFAULT_HOST;&lt;br /&gt;
      if (port &amp;lt;= 0)&lt;br /&gt;
        port = DEFAULT_PORT;&lt;br /&gt;
      Socket server = new Socket(host, port);&lt;br /&gt;
      // Open I/O streams to the client&lt;br /&gt;
      InputStream cin = new BufferedInputStream(client.getInputStream());&lt;br /&gt;
      OutputStream cout = new BufferedOutputStream(client&lt;br /&gt;
          .getOutputStream());&lt;br /&gt;
      // Open I/O streams to the server&lt;br /&gt;
      InputStream sin = new BufferedInputStream(server.getInputStream());&lt;br /&gt;
      OutputStream sout = new BufferedOutputStream(server&lt;br /&gt;
          .getOutputStream());&lt;br /&gt;
      // Copy request line and headers from client to server,&lt;br /&gt;
      // echoing to logger if specified. Stop after the&lt;br /&gt;
      // first empty line (end of headers)&lt;br /&gt;
      int contentLength = 0;&lt;br /&gt;
      StringBuffer sb = new StringBuffer();&lt;br /&gt;
      for (;;) {&lt;br /&gt;
        // Read a byte from client&lt;br /&gt;
        // and copy it to server&lt;br /&gt;
        int c = cin.read();&lt;br /&gt;
        sout.write(c);&lt;br /&gt;
        // Ignore CR at end of line&lt;br /&gt;
        if (c == &amp;quot;\r&amp;quot;)&lt;br /&gt;
          continue;&lt;br /&gt;
        // If LF, process the line&lt;br /&gt;
        if (c == &amp;quot;\n&amp;quot;) {&lt;br /&gt;
          String line = sb.toString();&lt;br /&gt;
          sb = new StringBuffer();&lt;br /&gt;
          // Log the line&lt;br /&gt;
          logger.log(&amp;quot;C: &amp;quot; + line);&lt;br /&gt;
          // If this is an empty line,&lt;br /&gt;
          // there are no more headers&lt;br /&gt;
          if (line.length() == 0)&lt;br /&gt;
            break;&lt;br /&gt;
          // If it is a content length header,&lt;br /&gt;
          // save the content length&lt;br /&gt;
          int p = line.indexOf(&amp;quot;:&amp;quot;);&lt;br /&gt;
          if (p != -1) {&lt;br /&gt;
            String key = line.substring(0, p).trim();&lt;br /&gt;
            String value = line.substring(p + 1).trim();&lt;br /&gt;
            if (key.equalsIgnoreCase(&amp;quot;content-length&amp;quot;))&lt;br /&gt;
              contentLength = Integer.parseInt(value);&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
        // Otherwise, append char to string buffer&lt;br /&gt;
        else&lt;br /&gt;
          sb.append((char) c);&lt;br /&gt;
      }&lt;br /&gt;
      sout.flush();&lt;br /&gt;
      // If content length was specified, read input stream&lt;br /&gt;
      // and copy to server&lt;br /&gt;
      if (contentLength &amp;gt; 0) {&lt;br /&gt;
        for (int i = 0; i &amp;lt; contentLength; i++) {&lt;br /&gt;
          int c = cin.read();&lt;br /&gt;
          sout.write(c);&lt;br /&gt;
        }&lt;br /&gt;
        sout.flush();&lt;br /&gt;
      }&lt;br /&gt;
      // Echo the response back to the client&lt;br /&gt;
      sb = new StringBuffer();&lt;br /&gt;
      while (true) {&lt;br /&gt;
        // Read a byte from server&lt;br /&gt;
        // and copy it to client&lt;br /&gt;
        int c = sin.read();&lt;br /&gt;
        cout.write(c);&lt;br /&gt;
        // Ignore CR at end of line&lt;br /&gt;
        if (c == &amp;quot;\r&amp;quot;)&lt;br /&gt;
          continue;&lt;br /&gt;
        // If LF, process the line&lt;br /&gt;
        if (c == &amp;quot;\n&amp;quot;) {&lt;br /&gt;
          String line = sb.toString();&lt;br /&gt;
          sb = new StringBuffer();&lt;br /&gt;
          // Log the line&lt;br /&gt;
          logger.log(&amp;quot;S: &amp;quot; + line);&lt;br /&gt;
          // If this is an empty line,&lt;br /&gt;
          // there are no more headers&lt;br /&gt;
          if (line.length() == 0)&lt;br /&gt;
            break;&lt;br /&gt;
        }&lt;br /&gt;
        // Otherwise, append char to string buffer&lt;br /&gt;
        else&lt;br /&gt;
          sb.append((char) c);&lt;br /&gt;
      }&lt;br /&gt;
      cout.flush();&lt;br /&gt;
      // Copy remaining bytes to client&lt;br /&gt;
      int bytesCopied = 0;&lt;br /&gt;
      while (true) {&lt;br /&gt;
        int c = sin.read();&lt;br /&gt;
        if (c == -1)&lt;br /&gt;
          break;&lt;br /&gt;
        cout.write(c);&lt;br /&gt;
        bytesCopied++;&lt;br /&gt;
      }&lt;br /&gt;
      if (bytesCopied &amp;gt; 0)&lt;br /&gt;
        cout.flush();&lt;br /&gt;
      // Close streams and sockets&lt;br /&gt;
      cin.close();&lt;br /&gt;
      cout.close();&lt;br /&gt;
      client.close();&lt;br /&gt;
      sin.close();&lt;br /&gt;
      sout.close();&lt;br /&gt;
      server.close();&lt;br /&gt;
    } catch (IOException e) {&lt;br /&gt;
      e.printStackTrace();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  // ===========================================&lt;br /&gt;
  //    Property setters&lt;br /&gt;
  // ===========================================&lt;br /&gt;
  /**&lt;br /&gt;
   * Sets the logger.&lt;br /&gt;
   * &lt;br /&gt;
   * @param logger&lt;br /&gt;
   *            the logger.&lt;br /&gt;
   */&lt;br /&gt;
  public void setLogger(Logger logger) {&lt;br /&gt;
    this.logger = logger;&lt;br /&gt;
  }&lt;br /&gt;
  /**&lt;br /&gt;
   * Sets the host.&lt;br /&gt;
   * &lt;br /&gt;
   * @param host&lt;br /&gt;
   *            the host.&lt;br /&gt;
   */&lt;br /&gt;
  public void setHost(String host) {&lt;br /&gt;
    this.host = host;&lt;br /&gt;
  }&lt;br /&gt;
  /**&lt;br /&gt;
   * Sets the port.&lt;br /&gt;
   * &lt;br /&gt;
   * @param port&lt;br /&gt;
   *            the port.&lt;br /&gt;
   */&lt;br /&gt;
  public void setPort(int port) {&lt;br /&gt;
    this.port = port;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
/**&lt;br /&gt;
 * Copyright (c) 2002 by Phil Hanna All rights reserved.&lt;br /&gt;
 * &lt;br /&gt;
 * You may study, use, modify, and distribute this software for any purpose&lt;br /&gt;
 * provided that this copyright notice appears in all copies.&lt;br /&gt;
 * &lt;br /&gt;
 * This software is provided without warranty either expressed or implied.&lt;br /&gt;
 */&lt;br /&gt;
/**&lt;br /&gt;
 * The set of methods that must be implemented by a class that logs message&lt;br /&gt;
 */&lt;br /&gt;
interface Logger {&lt;br /&gt;
  /**&lt;br /&gt;
   * Logs a message&lt;br /&gt;
   */&lt;br /&gt;
  public void log(String s);&lt;br /&gt;
}&lt;br /&gt;
           &lt;br /&gt;
       &amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;/div&gt;</summary>
			</entry>

	</feed>