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

|