in tcpmon/src/main/java/org/apache/axis/utils/tcpmon.java [904:1228]
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());
int listenPort = Integer.parseInt(listener.portField.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 " ) ||
bufferedData.startsWith( "PUT " ) ||
bufferedData.startsWith( "DELETE " ) ) {
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 + ":" + listenPort + "\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();
boolean numeric = listener.numericBox.isSelected();
//this is the channel to the endpoint
rr1 = new SocketRR(this, inSocket, tmpIn1, outSocket,
tmpOut2, inputText, format, numeric,
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, numeric,
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.
// while( !rr2.isDone() )
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;
}
// Thread.sleep( 10 );
synchronized ( this) {
this.wait(1000); //Safety just incase we're not told to wake up.
}
}
// System.out.println("Done ");
// rr1.halt();
// rr2.halt();
active = false ;
/*
if ( inSocket != null ) {
inSocket.close();
inSocket = null ;
}
outSocket.close();
outSocket = null ;
*/
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
System.out.println(st.toString());
}
halt();
}
}