soap监视器

类别:Java 点击:0 评论:0 推荐:

1.soap监视器原理:soap监视器通过tcpip协议截获和转发soap请求,并且显示相关的soap封装信息,使开发人员可以轻松的调试web服务,它的原理如下:

2.系统类图:

3.程序源代码:

package estore.client.util;

/*
 * EStore
 *
 * Copyright (c) 2003 YL Group.  All rights reserved.
 *
 */

import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTabbedPane;
import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.ListSelectionModel;
import javax.swing.SwingConstants;
import javax.swing.UIManager;
import javax.swing.border.TitledBorder;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.plaf.basic.BasicButtonListener;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;
import javax.swing.table.TableModel;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.Document;
import javax.swing.text.PlainDocument;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.URL;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Iterator;
import java.util.ResourceBundle;
import java.util.Vector;

/**
 * TCP monitor to log http messages and responses, both SOAP and plain HTTP.
 * @author yellowicq([email protected])
 */

public class TCPMonitor
    extends JFrame {
  private JTabbedPane notebook = null;

  private static final int STATE_COLUMN = 0;
  private static final int TIME_COLUMN = 1;
  private static final int INHOST_COLUMN = 2;
  private static final int OUTHOST_COLUMN = 3;
  private static final int REQ_COLUMN = 4;

  private static final String DEFAULT_HOST = "127.0.0.1";
  private static final int DEFAULT_PORT = 8080;

  /**
   * this is the admin page
   */
  class AdminPage
      extends JPanel {
    public JRadioButton listenerButton, proxyButton;
    public JLabel hostLabel, tportLabel;
    public NumberField port;
    public HostnameField host;
    public NumberField tport;
    public JTabbedPane noteb;
    public JCheckBox HTTPProxyBox;
    public HostnameField HTTPProxyHost;
    public NumberField HTTPProxyPort;
    public JLabel HTTPProxyHostLabel, HTTPProxyPortLabel;
    public JLabel delayTimeLabel, delayBytesLabel;
    public NumberField delayTime, delayBytes;
    public JCheckBox delayBox;

    public AdminPage(JTabbedPane notebook, String name) {
      JPanel mainPane = null;
      JButton addButton = null;

      this.setLayout(new BorderLayout());
      noteb = notebook;

      GridBagLayout layout = new GridBagLayout();
      GridBagConstraints c = new GridBagConstraints();

      mainPane = new JPanel(layout);

      c.anchor = GridBagConstraints.WEST;
      c.gridwidth = GridBagConstraints.REMAINDER;
      mainPane.add(new JLabel(getMessage("newTCP00",
                                         "Create a new TCP/IP Monitor...") +
                              " "), c);

      // Add some blank space
      mainPane.add(Box.createRigidArea(new Dimension(1, 5)), c);

      // The listener info
      ///////////////////////////////////////////////////////////////
      JPanel tmpPanel = new JPanel(new GridBagLayout());

      c.anchor = GridBagConstraints.WEST;
      c.gridwidth = 1;
      tmpPanel.add(new JLabel(getMessage("listenPort00", "Listen Port #") + " "),
                   c);

      c.anchor = GridBagConstraints.WEST;
      c.gridwidth = GridBagConstraints.REMAINDER;
      tmpPanel.add(port = new NumberField(4), c);

      mainPane.add(tmpPanel, c);

      mainPane.add(Box.createRigidArea(new Dimension(1, 5)), c);

      // Group for the radio buttons
      ButtonGroup btns = new ButtonGroup();

      c.anchor = GridBagConstraints.WEST;
      c.gridwidth = GridBagConstraints.REMAINDER;
      mainPane.add(new JLabel(getMessage("actAs00", "Act as a...")), c);

      // Target Host/Port section
      ///////////////////////////////////////////////////////////////////
      c.anchor = GridBagConstraints.WEST;
      c.gridwidth = GridBagConstraints.REMAINDER;

      final String listener = getMessage("listener00", "Listener");

      mainPane.add(listenerButton = new JRadioButton(listener), c);
      btns.add(listenerButton);
      listenerButton.setSelected(true);

      listenerButton.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent event) {
          if (listener.equals(event.getActionCommand())) {
            boolean state = listenerButton.isSelected();

            tport.setEnabled(state);
            host.setEnabled(state);
            hostLabel.setForeground(state ? Color.black : Color.gray);
            tportLabel.setForeground(state ? Color.black : Color.gray);
          }
        }
      }
      );

      c.anchor = GridBagConstraints.WEST;
      c.gridwidth = 1;
      mainPane.add(Box.createRigidArea(new Dimension(25, 0)));
      mainPane.add(hostLabel = new JLabel(getMessage("targetHostname00",
          "Target Hostname") + " "), c);

      c.anchor = GridBagConstraints.WEST;
      c.gridwidth = GridBagConstraints.REMAINDER;
      host = new HostnameField(30);
      mainPane.add(host, c);
      host.setText(DEFAULT_HOST);

      c.anchor = GridBagConstraints.WEST;
      c.gridwidth = 1;
      mainPane.add(Box.createRigidArea(new Dimension(25, 0)));
      mainPane.add(tportLabel = new JLabel(getMessage("targetPort00",
          "Target Port #") + " "), c);

      c.anchor = GridBagConstraints.WEST;
      c.gridwidth = GridBagConstraints.REMAINDER;
      tport = new NumberField(4);
      mainPane.add(tport, c);
      tport.setValue(DEFAULT_PORT);

      // Act as proxy section
      ///////////////////////////////////////////////////////////////////
      c.anchor = GridBagConstraints.WEST;
      c.gridwidth = GridBagConstraints.REMAINDER;
      final String proxy = getMessage("proxy00", "Proxy");

      mainPane.add(proxyButton = new JRadioButton(proxy), c);
      btns.add(proxyButton);

      proxyButton.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent event) {
          if (proxy.equals(event.getActionCommand())) {
            boolean state = proxyButton.isSelected();

            tport.setEnabled(!state);
            host.setEnabled(!state);
            hostLabel.setForeground(state ? Color.gray : Color.black);
            tportLabel.setForeground(state ? Color.gray : Color.black);
          }
        }
      }
      );

      // Spacer
      /////////////////////////////////////////////////////////////////
      c.anchor = GridBagConstraints.WEST;
      c.gridwidth = GridBagConstraints.REMAINDER;
      mainPane.add(Box.createRigidArea(new Dimension(1, 10)), c);

      // Options section
      ///////////////////////////////////////////////////////////////////
      JPanel opts = new JPanel(new GridBagLayout());

      opts.setBorder(new TitledBorder(getMessage("options00", "Options")));
      c.anchor = GridBagConstraints.WEST;
      c.gridwidth = GridBagConstraints.REMAINDER;
      mainPane.add(opts, c);

      // HTTP Proxy Support section
      ///////////////////////////////////////////////////////////////////
      c.anchor = GridBagConstraints.WEST;
      c.gridwidth = GridBagConstraints.REMAINDER;
      final String proxySupport = getMessage("proxySupport00",
                                             "HTTP Proxy Support");

      opts.add(HTTPProxyBox = new JCheckBox(proxySupport), c);

      c.anchor = GridBagConstraints.WEST;
      c.gridwidth = 1;
      opts.add(HTTPProxyHostLabel = new JLabel(getMessage("hostname00",
          "Hostname") + " "), c);
      HTTPProxyHostLabel.setForeground(Color.gray);

      c.anchor = GridBagConstraints.WEST;
      c.gridwidth = GridBagConstraints.REMAINDER;
      opts.add(HTTPProxyHost = new HostnameField(30), c);
      HTTPProxyHost.setEnabled(false);

      c.anchor = GridBagConstraints.WEST;
      c.gridwidth = 1;
      opts.add(HTTPProxyPortLabel = new JLabel(getMessage("port00", "Port #") +
                                               " "), c);
      HTTPProxyPortLabel.setForeground(Color.gray);

      c.anchor = GridBagConstraints.WEST;
      c.gridwidth = GridBagConstraints.REMAINDER;
      opts.add(HTTPProxyPort = new NumberField(4), c);
      HTTPProxyPort.setEnabled(false);

      HTTPProxyBox.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent event) {
          if (proxySupport.equals(event.getActionCommand())) {
            boolean b = HTTPProxyBox.isSelected();
            Color color = b ? Color.black : Color.gray;

            HTTPProxyHost.setEnabled(b);
            HTTPProxyPort.setEnabled(b);
            HTTPProxyHostLabel.setForeground(color);
            HTTPProxyPortLabel.setForeground(color);
          }
        }
      }
      );

      // Set default proxy values...
      String tmp = System.getProperty("http.proxyHost");

      if (tmp != null && tmp.equals("")) {
        tmp = null;
      }

      HTTPProxyBox.setSelected(tmp != null);
      HTTPProxyHost.setEnabled(tmp != null);
      HTTPProxyPort.setEnabled(tmp != null);
      HTTPProxyHostLabel.setForeground(tmp != null ? Color.black : Color.gray);
      HTTPProxyPortLabel.setForeground(tmp != null ? Color.black : Color.gray);

      if (tmp != null) {
        HTTPProxyBox.setSelected(true);
        HTTPProxyHost.setText(tmp);
        tmp = System.getProperty("http.proxyPort");
        if (tmp != null && tmp.equals("")) {
          tmp = null;
        }
        if (tmp == null) {
          tmp = "80";
        }
        HTTPProxyPort.setText(tmp);
      }

      //add byte delay fields
      opts.add(Box.createRigidArea(new Dimension(1, 10)), c);
      c.anchor = GridBagConstraints.WEST;
      c.gridwidth = GridBagConstraints.REMAINDER;
      final String delaySupport = getMessage("delay00",
                                             "Simulate Slow Connection");
      opts.add(delayBox = new JCheckBox(delaySupport), c);

      //bytes per pause
      c.anchor = GridBagConstraints.WEST;
      c.gridwidth = 1;
      delayBytesLabel = new JLabel(getMessage("delay01", "Bytes per Pause"));
      opts.add(delayBytesLabel, c);
      delayBytesLabel.setForeground(Color.gray);
      c.anchor = GridBagConstraints.WEST;
      c.gridwidth = GridBagConstraints.REMAINDER;
      opts.add(delayBytes = new NumberField(6), c);
      delayBytes.setEnabled(false);

      //delay interval
      c.anchor = GridBagConstraints.WEST;
      c.gridwidth = 1;
      delayTimeLabel = new JLabel(getMessage("delay02", "Delay in Milliseconds"));
      opts.add(delayTimeLabel, c);
      delayTimeLabel.setForeground(Color.gray);
      c.anchor = GridBagConstraints.WEST;
      c.gridwidth = GridBagConstraints.REMAINDER;
      opts.add(delayTime = new NumberField(6), c);
      delayTime.setEnabled(false);

      //enabler callback
      delayBox.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent event) {
          if (delaySupport.equals(event.getActionCommand())) {
            boolean b = delayBox.isSelected();
            Color color = b ? Color.black : Color.gray;

            delayBytes.setEnabled(b);
            delayTime.setEnabled(b);
            delayBytesLabel.setForeground(color);
            delayTimeLabel.setForeground(color);
          }
        }
      }
      );

      // Spacer
      //////////////////////////////////////////////////////////////////
      mainPane.add(Box.createRigidArea(new Dimension(1, 10)), c);

      // ADD Button
      ///////////////////////////////////////////////////////////////////
      c.anchor = GridBagConstraints.WEST;
      c.gridwidth = GridBagConstraints.REMAINDER;
      final String add = getMessage("add00", "Add");

      mainPane.add(addButton = new JButton(add), c);

      this.add(new JScrollPane(mainPane), BorderLayout.CENTER);

      addButton.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent event) {
          if (add.equals(event.getActionCommand())) {
            String text;
            Listener l = null;
            int lPort;
            lPort = port.getValue(0);
            if (lPort == 0) {
              //no port, button does nothing
              return;
            }
            String tHost = host.getText();
            int tPort = 0;
            tPort = tport.getValue(0);
            SlowLinkSimulator slowLink = null;
            if (delayBox.isSelected()) {
              int bytes = delayBytes.getValue(0);
              int time = delayTime.getValue(0);
              slowLink = new SlowLinkSimulator(bytes, time);
            }
            l = new Listener(noteb, null, lPort, tHost, tPort,
                             proxyButton.isSelected(), slowLink);

            // Pick-up the HTTP Proxy settings
            ///////////////////////////////////////////////////
            text = HTTPProxyHost.getText();
            if ("".equals(text)) {
              text = null;
            }
            l.HTTPProxyHost = text;
            text = HTTPProxyPort.getText();
            int proxyPort = HTTPProxyPort.getValue( -1);
            if (proxyPort != -1) {
              l.HTTPProxyPort = Integer.parseInt(text);
            }
            //reset the port
            port.setText(null);
          }
        }
      }
      );

      notebook.addTab(name, this);
      notebook.repaint();
      notebook.setSelectedIndex(notebook.getTabCount() - 1);
    }

  }

  /**
   * wait for incoming connections, spawn a connection thread when
   * stuff comes in.
   */
  class SocketWaiter
      extends Thread {
    ServerSocket sSocket = null;
    Listener listener;
    int port;
    boolean pleaseStop = false;

    public SocketWaiter(Listener l, int p) {
      listener = l;
      port = p;
      start();
    }

    public void run() {
      try {
        listener.setLeft(new JLabel(getMessage("wait00",
                                               " Waiting for Connection...")));
        listener.repaint();
        sSocket = new ServerSocket(port);
        for (; ; ) {
          Socket inSocket = sSocket.accept();

          if (pleaseStop) {
            break;
          }
          new Connection(listener, inSocket);
          inSocket = null;
        }
      }
      catch (Exception exp) {
        if (!"socket closed".equals(exp.getMessage())) {
          JLabel tmp = new JLabel(exp.toString());

          tmp.setForeground(Color.red);
          listener.setLeft(tmp);
          listener.setRight(new JLabel(""));
          listener.stop();
        }
      }
    }

    /**
     * force a halt by connecting to self and then closing the server socket
     */
    public void halt() {
      try {
        pleaseStop = true;
        new Socket("127.0.0.1", port);
        if (sSocket != null) {
          sSocket.close();
        }
      }
      catch (Exception e) {
        LogPage.LogInfor(e.getMessage());
      }
    }
  }

  /**
   * class to simulate slow connections by slowing down the system
   */
  static class SlowLinkSimulator {
    private int delayBytes;
    private int delayTime;
    private int currentBytes;
    private int totalBytes;

    /**
     * construct
     * @param delayBytes bytes per delay; set to 0 for no delay
     * @param delayTime delay time per delay in milliseconds
     */
    public SlowLinkSimulator(int delayBytes, int delayTime) {
      this.delayBytes = delayBytes;
      this.delayTime = delayTime;
    }

    /**
     * construct by copying delay bytes and time, but not current
     * count of bytes
     * @param that source of data
     */
    public SlowLinkSimulator(SlowLinkSimulator that) {
      this.delayBytes = that.delayBytes;
      this.delayTime = that.delayTime;
    }

    /**
     * how many bytes have gone past?
     * @return
     */
    public int getTotalBytes() {
      return totalBytes;
    }

    /**
     * log #of bytes pumped. Will pause when necessary. This method is not
     * synchronized
     * @param bytes
     */
    public void pump(int bytes) {
      totalBytes += bytes;
      if (delayBytes == 0) {
        //when not delaying, we are just a byte counter
        return;
      }
      currentBytes += bytes;
      if (currentBytes > delayBytes) {
        //we have overshot. lets find out how far
        int delaysize = currentBytes / delayBytes;
        long delay = delaysize * (long) delayTime;
        //move byte counter down to the remainder of bytes
        currentBytes = currentBytes % delayBytes;
        //now wait
        try {
          Thread.sleep(delay);
        }
        catch (InterruptedException e) {
          ; //ignore the exception
        }
      }
    }

    /**
     * get the current byte count
     * @return
     */
    public int getCurrentBytes() {
      return currentBytes;
    }

    /**
     * set the current byte count
     * @param currentBytes
     */
    public void setCurrentBytes(int currentBytes) {
      this.currentBytes = currentBytes;
    }

  }

  /**
   * this class handles the pumping of data from the incoming socket to the
   * outgoing socket
   */
  class SocketRR
      extends Thread {
    Socket inSocket = null;
    Socket outSocket = null;
    JTextArea textArea;
    InputStream in = null;
    OutputStream out = null;
    boolean xmlFormat;
    volatile boolean done = false;
    TableModel tmodel = null;
    int tableIndex = 0;
    String type = null;
    Connection myConnection = null;
    SlowLinkSimulator slowLink;

    public SocketRR(Connection c, Socket inputSocket, InputStream inputStream,
                    Socket outputSocket, OutputStream outputStream,
                    JTextArea _textArea, boolean format,
                    TableModel tModel, int index, final String type,
                    SlowLinkSimulator slowLink) {
      inSocket = inputSocket;
      in = inputStream;
      outSocket = outputSocket;
      out = outputStream;
      textArea = _textArea;
      xmlFormat = format;
      tmodel = tModel;
      tableIndex = index;
      this.type = type;
      myConnection = c;
      this.slowLink = slowLink;
      start();
    }

    public boolean isDone() {
      return (done);
    }

    public void run() {
      try {
        byte[] buffer = new byte[4096];
        byte[] tmpbuffer = new byte[8192];
        int saved = 0;
        int len;
        int i1, i2;
        int i;
        int reqSaved = 0;
        int tabWidth = 3;
        boolean atMargin = true;
        int thisIndent = -1,
            nextIndent = -1,
            previousIndent = -1;

        if (tmodel != null) {
          String tmpStr = (String) tmodel.getValueAt(tableIndex,
              REQ_COLUMN);

          if (!"".equals(tmpStr)) {
            reqSaved = tmpStr.length();
          }
        }

        a:
        for (; ; ) {
          if (done) {
            break;
          }

          len = buffer.length;
          // Used to be 1, but if we block it doesn't matter
          // however 1 will break with some servers, including apache
          if (len == 0) {
            len = buffer.length;
          }
          if (saved + len > buffer.length) {
            len = buffer.length - saved;
          }
          int len1 = 0;

          while (len1 == 0) {
            try {
              len1 = in.read(buffer, saved, len);
            }
            catch (Exception ex) {
              if (done && saved == 0) {
                break a;
              }
              len1 = -1;
              break;
            }
          }
          len = len1;

          if (len == -1 && saved == 0) {
            break;
          }
          if (len == -1) {
            done = true;
          }

          // No matter how we may (or may not) format it, send it
          // on unformatted - we don't want to mess with how its
          // sent to the other side, just how its displayed
          if (out != null && len > 0) {
            slowLink.pump(len);
            out.write(buffer, saved, len);
          }

          if (tmodel != null && reqSaved < 50) {
            String old = (String) tmodel.getValueAt(tableIndex,
                REQ_COLUMN);

            old = old + new String(buffer, saved, len);
            if (old.length() > 50) {
              old = old.substring(0, 50);
            }

            reqSaved = old.length();

            if ( (i = old.indexOf('\n')) > 0) {
              old = old.substring(0, i - 1);
              reqSaved = 50;
            }

            tmodel.setValueAt(old, tableIndex, REQ_COLUMN);
          }

          if (xmlFormat) {
            // Do XML Formatting
            boolean inXML = false;
            int bufferLen = saved;

            if (len != -1) {
              bufferLen += len;
            }
            i1 = 0;
            i2 = 0;
            saved = 0;
            for (; i1 < bufferLen; i1++) {
              // Except when we're at EOF, saved last char
              if (len != -1 && i1 + 1 == bufferLen) {
                saved = 1;
                break;
              }
              thisIndent = -1;
              if (buffer[i1] == '<' && buffer[i1 + 1] != '/') {
                previousIndent = nextIndent++;
                thisIndent = nextIndent;
                inXML = true;
              }
              if (buffer[i1] == '<' && buffer[i1 + 1] == '/') {
                if (previousIndent > nextIndent) {
                  thisIndent = nextIndent;
                }
                previousIndent = nextIndent--;
                inXML = true;
              }
              if (buffer[i1] == '/' && buffer[i1 + 1] == '>') {
                previousIndent = nextIndent--;
                inXML = true;
              }
              if (thisIndent != -1) {
                if (thisIndent > 0) {
                  tmpbuffer[i2++] = (byte) '\n';
                }
                for (i = tabWidth * thisIndent; i > 0; i--) {
                  tmpbuffer[i2++] = (byte) ' ';
                }
              }
              atMargin = (buffer[i1] == '\n' || buffer[i1] == '\r');

              if (!inXML || !atMargin) {
                tmpbuffer[i2++] = buffer[i1];
              }
            }

            textArea.append(new String(tmpbuffer, 0, i2));

            // Shift saved bytes to the beginning
            for (i = 0; i < saved; i++) {
              buffer[i] = buffer[bufferLen - saved + i];
            }
          }
          else {
            textArea.append(new String(buffer, 0, len));
          }
        }
      }
      catch (Exception e) {
        LogPage.LogInfor(e.getMessage());
      }
      finally {
        done = true;
        try {
          if (out != null) {
            out.flush();
            if (null != outSocket) {
              outSocket.shutdownOutput();
            }
            else {
              out.close();
            }
            out = null;
          }
        }
        catch (Exception e) {
          LogPage.LogInfor(e.getMessage());
        }
        try {
          if (in != null) {
            if (inSocket != null) {
              inSocket.shutdownInput();
            }
            else {
              in.close();
            }
            in = null;
          }
        }
        catch (Exception e) {
          LogPage.LogInfor(e.getMessage());;
        }
        myConnection.wakeUp();
      }
    }

    public void halt() {
      try {
        if (inSocket != null) {
          inSocket.close();
        }
        if (outSocket != null) {
          outSocket.close();
        }
        inSocket = null;
        outSocket = null;
        if (in != null) {
          in.close();
        }
        if (out != null) {
          out.close();
        }
        in = null;
        out = null;
        done = true;
      }
      catch (Exception e) {
        LogPage.LogInfor(e.getMessage());
      }
    }
  }

  /**
   * a connection listens to a single current connection
   */
  class Connection
      extends Thread {
    Listener listener;
    boolean active;
    String fromHost;
    String time;
    JTextArea inputText = null;
    JScrollPane inputScroll = null;
    JTextArea outputText = null;
    JScrollPane outputScroll = null;
    Socket inSocket = null;
    Socket outSocket = null;
    Thread clientThread = null;
    Thread serverThread = null;
    SocketRR rr1 = null;
    SocketRR rr2 = null;
    InputStream inputStream = null;

    String HTTPProxyHost = null;
    int HTTPProxyPort = 80;
    private SlowLinkSimulator slowLink;

    public Connection(Listener l) {
      listener = l;
      HTTPProxyHost = l.HTTPProxyHost;
      HTTPProxyPort = l.HTTPProxyPort;
      slowLink = l.slowLink;
    }

    public Connection(Listener l, Socket s) {
      this(l);
      inSocket = s;
      start();
    }

    public Connection(Listener l, InputStream in) {
      this(l);
      inputStream = in;
      start();
    }

    public void run() {
      try {
        active = true;

        HTTPProxyHost = System.getProperty("http.proxyHost");
        if (HTTPProxyHost != null && HTTPProxyHost.equals("")) {
          HTTPProxyHost = null;
        }

        if (HTTPProxyHost != null) {
          String tmp = System.getProperty("http.proxyPort");

          if (tmp != null && tmp.equals("")) {
            tmp = null;
          }
          if (tmp == null) {
            HTTPProxyPort = 80;
          }
          else {
            HTTPProxyPort = Integer.parseInt(tmp);
          }
        }

        if (inSocket != null) {
          fromHost = (inSocket.getInetAddress()).getHostName();
        }
        else {
          fromHost = "resend";
        }

        String dateformat = getMessage("dateformat00", "yyyy-MM-dd HH:mm:ss");
        DateFormat df = new SimpleDateFormat(dateformat);

        time = df.format(new Date());

        int count = listener.connections.size();

        listener.tableModel.insertRow(count + 1, new Object[] {
                                      getMessage("active00", "Active"),
                                      time,
                                      fromHost,
                                      listener.hostField.getText(), ""
        }
            );
        listener.connections.add(this);
        inputText = new JTextArea(null, null, 20, 80);
        inputScroll = new JScrollPane(inputText);
        outputText = new JTextArea(null, null, 20, 80);
        outputScroll = new JScrollPane(outputText);

        ListSelectionModel lsm = listener.connectionTable.getSelectionModel();

        if (count == 0 || lsm.getLeadSelectionIndex() == 0) {
          listener.outPane.setVisible(false);
          int divLoc = listener.outPane.getDividerLocation();

          listener.setLeft(inputScroll);
          listener.setRight(outputScroll);

          listener.removeButton.setEnabled(false);
          listener.removeAllButton.setEnabled(true);
          listener.saveButton.setEnabled(true);
          listener.resendButton.setEnabled(true);
          listener.outPane.setDividerLocation(divLoc);
          listener.outPane.setVisible(true);
        }

        String targetHost = listener.hostField.getText();
        int targetPort = Integer.parseInt(listener.tPortField.getText());

        InputStream tmpIn1 = inputStream;
        OutputStream tmpOut1 = null;

        InputStream tmpIn2 = null;
        OutputStream tmpOut2 = null;

        if (tmpIn1 == null) {
          tmpIn1 = inSocket.getInputStream();
        }

        if (inSocket != null) {
          tmpOut1 = inSocket.getOutputStream();
        }

        String bufferedData = null;
        StringBuffer buf = null;

        int index = listener.connections.indexOf(this);

        if (listener.isProxyBox.isSelected() || HTTPProxyHost != null) {
          // Check if we're a proxy
          byte[] b = new byte[1];

          buf = new StringBuffer();
          String s;

          for (; ; ) {
            int len;

            len = tmpIn1.read(b, 0, 1);
            if (len == -1) {
              break;
            }
            s = new String(b);
            buf.append(s);
            if (b[0] != '\n') {
              continue;
            }
            break;
          }

          bufferedData = buf.toString();
          inputText.append(bufferedData);

          if (bufferedData.startsWith("GET ") ||
              bufferedData.startsWith("POST ")) {
            int start, end;
            URL url;

            start = bufferedData.indexOf(' ') + 1;
            while (bufferedData.charAt(start) == ' ') {
              start++;
            }
            end = bufferedData.indexOf(' ', start);
            String urlString = bufferedData.substring(start, end);

            if (urlString.charAt(0) == '/') {
              urlString = urlString.substring(1);
            }
            if (listener.isProxyBox.isSelected()) {
              url = new URL(urlString);
              targetHost = url.getHost();
              targetPort = url.getPort();
              if (targetPort == -1) {
                targetPort = 80;
              }

              listener.tableModel.setValueAt(targetHost, index + 1,
                                             OUTHOST_COLUMN);
              bufferedData = bufferedData.substring(0, start) +
                  url.getFile() +
                  bufferedData.substring(end);
            }
            else {
              url = new URL("http://" + targetHost + ":" +
                            targetPort + "/" + urlString);

              listener.tableModel.setValueAt(targetHost, index + 1,
                                             OUTHOST_COLUMN);
              bufferedData = bufferedData.substring(0, start) +
                  url.toExternalForm() +
                  bufferedData.substring(end);

              targetHost = HTTPProxyHost;
              targetPort = HTTPProxyPort;
            }

          }
        }
        else {
          //
          // Change Host: header to point to correct host
          //
          byte[] b1 = new byte[1];

          buf = new StringBuffer();
          String s1;
          String lastLine = null;

          for (; ; ) {
            int len;

            len = tmpIn1.read(b1, 0, 1);
            if (len == -1) {
              break;
            }
            s1 = new String(b1);
            buf.append(s1);
            if (b1[0] != '\n') {
              continue;
            }
            // we have a complete line
            String line = buf.toString();

            buf.setLength(0);
            // check to see if we have found Host: header
            if (line.startsWith("Host: ")) {
              // we need to update the hostname to target host
              String newHost = "Host: " + targetHost + "\r\n";

              bufferedData = bufferedData.concat(newHost);
              break;
            }
            // add it to our headers so far
            if (bufferedData == null) {
              bufferedData = line;
            }
            else {
              bufferedData = bufferedData.concat(line);
            }

            // failsafe
            if (line.equals("\r\n")) {
              break;
            }
            if ("\n".equals(lastLine) && line.equals("\n")) {
              break;
            }
            lastLine = line;
          }
          if (bufferedData != null) {
            inputText.append(bufferedData);
            int idx = bufferedData.length() < 50 ? bufferedData.length() : 50;
            s1 = bufferedData.substring(0, idx);
            int i = s1.indexOf('\n');

            if (i > 0) {
              s1 = s1.substring(0, i - 1);
            }
            s1 = s1 + "                           " +
                "                       ";
            s1 = s1.substring(0, 51);
            listener.tableModel.setValueAt(s1, index + 1,
                                           REQ_COLUMN);
          }
        }

        if (targetPort == -1) {
          targetPort = 80;
        }
        outSocket = new Socket(targetHost, targetPort);

        tmpIn2 = outSocket.getInputStream();
        tmpOut2 = outSocket.getOutputStream();

        if (bufferedData != null) {
          byte[] b = bufferedData.getBytes();
          tmpOut2.write(b);
          slowLink.pump(b.length);
        }

        boolean format = listener.xmlFormatBox.isSelected();

        //this is the channel to the endpoint
        rr1 = new SocketRR(this, inSocket, tmpIn1, outSocket,
                           tmpOut2, inputText, format,
                           listener.tableModel, index + 1, "request:", slowLink);
        //create the response slow link from the inbound slow link
        SlowLinkSimulator responseLink = new SlowLinkSimulator(slowLink);
        //this is the channel from the endpoint
        rr2 = new SocketRR(this, outSocket, tmpIn2, inSocket,
                           tmpOut1, outputText, format,
                           null, 0, "response:", responseLink);

        while (rr1 != null || rr2 != null) {
          // Only loop as long as the connection to the target
          // machine is available - once that's gone we can stop.
          // The old way, loop until both are closed, left us
          // looping forever since no one closed the 1st one.
          if (null != rr1 && rr1.isDone()) {
            if (index >= 0 && rr2 != null) {
              listener.tableModel.setValueAt(getMessage("resp00", "Resp"),
                                             1 + index, STATE_COLUMN);
            }
            rr1 = null;
          }
          if (null != rr2 && rr2.isDone()) {
            if (index >= 0 && rr1 != null) {
              listener.tableModel.setValueAt(getMessage("req00", "Req"),
                                             1 + index, STATE_COLUMN);
            }
            rr2 = null;
          }

          synchronized (this) {
            this.wait(1000); //Safety just incase we're not told to wake up.
          }
        }

        active = false;

        if (index >= 0) {
          listener.tableModel.setValueAt(getMessage("done00", "Done"),
                                         1 + index, STATE_COLUMN);

        }
      }
      catch (Exception e) {
        StringWriter st = new StringWriter();
        PrintWriter wr = new PrintWriter(st);
        int index = listener.connections.indexOf(this);

        if (index >= 0) {
          listener.tableModel.setValueAt(getMessage("error00", "Error"),
                                         1 + index, STATE_COLUMN);
        }
        e.printStackTrace(wr);
        wr.close();
        if (outputText != null) {
          outputText.append(st.toString());
        }
        else {
          //something went wrong before we had the output area
          LogPage.LogInfor("outputText is null,so log the infor as \n'"+st.toString()+"'");
        }
        halt();
      }
    }

    synchronized void wakeUp() {
      this.notifyAll();
    }

    public void halt() {
      try {
        if (rr1 != null) {
          rr1.halt();
        }
        if (rr2 != null) {
          rr2.halt();
        }
        if (inSocket != null) {
          inSocket.close();
        }
        inSocket = null;
        if (outSocket != null) {
          outSocket.close();
        }
        outSocket = null;
      }
      catch (Exception e) {
        LogPage.LogInfor(e.getMessage());
      }
    }

    public void remove() {
      int index = -1;

      try {
        halt();
        index = listener.connections.indexOf(this);
        listener.tableModel.removeRow(index + 1);
        listener.connections.remove(index);
      }
      catch (Exception e) {
        LogPage.LogInfor("index:=" + index + this);
      }
    }
  }


  /**
   * this is the log page
   */
  class LogPage
      extends JPanel {
    // Monitor log section
    ///////////////////////////////////////////////////////////////////
    public  JPanel logPanel = new JPanel(new BorderLayout());
    public static JTextArea textArea = null;
    public LogPage(JTabbedPane notebook, String name) {
      logPanel.setBorder(new TitledBorder(TCPMonitor.getMessage("log01", "TCP Monitor Log")));
      textArea = new JTextArea(null, null, 27, 93);
      logPanel.add(new JScrollPane(textArea),BorderLayout.CENTER);
      this.setLayout(new BorderLayout());
      this.add(logPanel, BorderLayout.CENTER);
      notebook.addTab(name, this);
      notebook.repaint();
      notebook.setSelectedIndex(notebook.getTabCount() - 1);
      textArea.setEditable(true);
    }

    public static void LogInfor(String infor) {
      textArea.append(infor+"\n");
    }
  }
//EOC

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

本文地址:http://com.8s8s.com/it/it17931.htm