⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 msession.java

📁 httptunnel.jar httptunnel java 源码
💻 JAVA
字号:
package net.jumperz.app.MDoorman;

import net.jumperz.net.*;
import net.jumperz.util.*;
import net.jumperz.io.*;
import net.jumperz.security.*;
import java.net.*;
import java.io.*;
import java.util.*;
import java.util.regex.*;

public class MSession
extends MBaseSession
{
public static MThreadPool threadPool;

private MDoorman doorman;
private boolean filterMatches = false;
private BufferedInputStream cIn, sIn;
private OutputStream cOut, sOut;
private String host;
private int port;
private boolean isHeadRequest;
private boolean cKeepAlive, sKeepAlive;
private MPeer oldPeer, peer;
private Socket cSocket;
private MHttpRequest connectRequest;

Socket	sSocket;
private boolean isHttps = false;
// --------------------------------------------------------------------------------
public MSession()
{
	// !!!ONLY XMLDecoder can call this method!!!
init();
}
// --------------------------------------------------------------------------------
public MSession( BufferedInputStream cIn, OutputStream cOut, Socket cSocket )
throws IOException
{
this.cIn = cIn;
this.cOut = cOut;
this.cSocket = cSocket;
xmlFlag = false;

init();
}
// --------------------------------------------------------------------------------
public MSession( BufferedInputStream cIn, OutputStream cOut, BufferedInputStream sIn, OutputStream sOut, MPeer oldPeer, Socket cSocket, Socket sSocket )
{
this.cIn = cIn;
this.cOut = cOut;
this.sIn = sIn;
this.sOut = sOut;
this.oldPeer = oldPeer;
this.cSocket = cSocket;
this.sSocket = sSocket;
xmlFlag = false;

init();
}
//--------------------------------------------------------------------------------
public void setConnectRequest( MHttpRequest r )
{
connectRequest = r;
}
// --------------------------------------------------------------------------------
public String getStateString()
{
return stateString[ state ];
}
// --------------------------------------------------------------------------------
public void setSSocket( Socket sSocket )
{
this.sSocket = sSocket;
if( sSocket != null )
	{
	sSocketString = sSocket.toString();
	}
}
// --------------------------------------------------------------------------------
private void init()
{
time = new Date().toString();
doorman = MDoorman.getInstance();
if( cSocket != null )
	{
	cSocketString = cSocket.toString();
	}
if( sSocket != null )
	{
	sSocketString = sSocket.toString();
	}
}
// --------------------------------------------------------------------------------
public void setHttps()
{
isHttps = true;
}
// --------------------------------------------------------------------------------
public void start()
{
state = RQ_RCVNG;

MRequestReceiver receiver = new MRequestReceiver( cIn );
MRequestReceiverObserver2 observer = new MRequestReceiverObserver2( receiver, this, cSocket );
receiver.register1( observer );
threadPool.addCommand( receiver );
}
// --------------------------------------------------------------------------------
public void onRequestReceived( MHttpRequest request )
{
state = RQ_MODIFY;

method = request.getMethod();

if( isHttps )
	{
	host = peer.getHost();
	port = peer.getPort();
	if( port == 443 )
		{
		uri = "https://" + host + request.getUri();
		}
	else
		{
		uri = "https://" + host + ":" + Integer.toString( port ) + request.getUri();
		}
	/*
	if( doorman.useProxy )
		{
		host = doorman.proxyHost2;
		port = doorman.proxyPort2;
		}
	*/
	}
else
	{
	uri = request.getUri();
	MRequestUri requestUri = new MRequestUri( uri );
	if( doorman.useProxy )
		{
		host = doorman.proxyHost1;
		port = doorman.proxyPort1;
		}
	else
		{
		host = requestUri.getHost();
		port = requestUri.getPort();
		requestUri.setRelative();
		request.setUri( requestUri.toString() );
		}
	peer = new MPeer( host, port );	

		//reusing connection
	if( oldPeer != null )
		{
		if( !oldPeer.equals( peer ) )
			{
			closeServerSide();
			sIn = null;
			sOut = null;
			}
		}
	}

	//filter
List stringList = new ArrayList();
stringList.add( request.getRequestLine() );
stringList.addAll( request.getHeaderList() );
if( conditionMatches( doorman.filterList, stringList ) )
	{
	filterMatches = true;
	}

if( !doorman.useProxy )
	{
	if( request.headerExists( "Proxy-Connection" ) )
		{
		request.setHeaderValue( "Connection", request.getHeaderValue( "Proxy-Connection" ) );
		request.removeHeaderValue( "Proxy-Connection" );
		}
	}
cKeepAlive = request.isKeepAliveRequest();

	//TODO
request.removeHeaderValue( "Accept-Encoding" );

requestByte = request.toByteArray();

updateGui();

	//break
if( conditionMatches( doorman.getBreakList( MBreak.TYPE_REQUEST ), stringList ) 
&& filterMatches == false
 )
	{
	closeServerSide();
	sIn = null;
	sOut = null;
	sSocket = null;
	}
else
	{
	sendRequest();
	}
}
// --------------------------------------------------------------------------------
public void onResponseReceived( MHttpResponse response )
{
state = RS_MODIFY;

statusCode = Integer.toString( response.getStatusCode() );

if( doorman.useProxy )
	{
	sKeepAlive = response.isKeepAliveResponse( "Proxy-Connection" );
	}
else
	{
	sKeepAlive = response.isKeepAliveResponse();
	if( response.headerExists( "Connection" ) )
		{
		response.setHeaderValue( "Proxy-Connection", response.getHeaderValue( "Connection" ) );
		response.removeHeaderValue( "Connection" );
		}
	}

updateGui();

	//break
List stringList = new ArrayList();
stringList.add( response.getStatusLine() );
stringList.addAll( response.getHeaderList() );

setResponseByte( response.toByteArray() );

if( conditionMatches( doorman.getBreakList( MBreak.TYPE_RESPONSE ), stringList ) 
&& filterMatches == false 
  )
	{
	}
else
	{
	sendResponse();
	}
}
// --------------------------------------------------------------------------------
public void sendResponse()
{
state = RS_SNDNG;

MSender sender = new MSender( cOut, getResponseByte() );
MResponseSenderObserver observer = new MResponseSenderObserver( sender, this );
sender.register1( observer );
threadPool.addCommand( sender );

updateGui();
}
// --------------------------------------------------------------------------------
public void onResponseSent()
{
if( isHttps )
	{
	MSystemUtil.sleep( 100 );
	}
if( cKeepAlive && sKeepAlive )
	{
	MSession session = new MSession( cIn, cOut, sIn, sOut, new MPeer( host, port ), cSocket, sSocket );
	if( isHttps )
		{
		session.setHttps();
		session.setPeer( peer );
		}
	session.start();
	}
else
	{
	closeStreams();
	cleanUp();
	}

state = COMPLETED;

updateGui();
}
// --------------------------------------------------------------------------------
public void sendRequest()
{
state = RQ_SNDNG;

if( sIn == null )
	{
	connect();
	}
else
	{
	isHeadRequest = ( MStringUtil.byteArrayToString( requestByte, doorman.getEnc() ).indexOf( "HEAD" ) == 0 );
	MSender sender = new MSender( sOut, requestByte );
	MRequestSenderObserver observer = new MRequestSenderObserver( sender, this );
	sender.register1( observer );
	threadPool.addCommand( sender );
	}

updateGui();
}
// --------------------------------------------------------------------------------
private void connect()
{
state = S_CONNECTING;

MConnector connector = null;

if( isHttps )
	{
	if( doorman.useProxy )
		{
		setupConnectProxy();
		return;
		}
	else
		{
		connector = new MSslConnector( host, port );	
		}
	}
else
	{
	connector = new MConnector( host, port );
	}
MConnectorObserver observer = new MConnectorObserver( connector, this );
connector.register1( observer );
threadPool.addCommand( connector );

updateGui();
}
//--------------------------------------------------------------------------------
private void setupConnectProxy()
{
Socket socket1 = null;
Socket socket3 = null;
Socket socket4 = null;
ServerSocket socket2 = null;
try
	{
	socket1 = new Socket( doorman.proxyHost2, doorman.proxyPort2 );
	OutputStream out1 = socket1.getOutputStream();
	InputStream in1 = socket1.getInputStream();

	out1.write( connectRequest.toByteArray() ); // send connect request
	BufferedInputStream bin1 = new BufferedInputStream( in1 );
	MHttpResponse connectResponse = new MHttpResponse( bin1, true );
	if( connectResponse.getStatusCode() != 200 )
		{
		errorClose();
		return;
		}
	
	socket2 = new ServerSocket( 0, 1, InetAddress.getByName( "127.0.0.1" ) );
	int port2 = socket2.getLocalPort();
	socket3 = MSecurityUtil.getBogusSslSocket( "127.0.0.1", port2 );
	InputStream in3 = socket3.getInputStream();
	OutputStream out3 = socket3.getOutputStream();
	socket4 = socket2.accept();
	socket2.close();
	InputStream in4 = socket4.getInputStream();
	OutputStream out4 = socket4.getOutputStream();
	
	MStreamConnector streamConnector1 = new MStreamConnector( in1, out4 );
	MStreamConnector streamConnector2 = new MStreamConnector( in4, out1 );
//	MStreamConnectorObserver streamConnectorObserver = new MStreamConnectorObserver( streamConnector2 );
//	streamConnectorObserver.addSocket( socket1 );
//	streamConnectorObserver.addSocket( socket3 );
//	streamConnectorObserver.addSocket( socket4 );
//	streamConnector2.register1( streamConnectorObserver );

	MThreadPool threadPool = MDoorman.getInstance().threadPool;
	threadPool.addCommand( streamConnector1 );
	threadPool.addCommand( streamConnector2 );
	
	setSSocket( socket3 );
	onServerConnected( new BufferedInputStream( in3 ), out3 );
	}
catch( IOException e )
	{
	errorClose();
	}
}
// --------------------------------------------------------------------------------
public void receiveResponse()
{
state = RS_RCVNG;

MResponseReceiver receiver = new MResponseReceiver( sIn, isHeadRequest );
MResponseReceiverObserver observer = new MResponseReceiverObserver( receiver, this );
receiver.register1( observer );
threadPool.addCommand( receiver );

updateGui();
}
// --------------------------------------------------------------------------------
public void onServerConnected( BufferedInputStream sIn, OutputStream sOut )
{
state = S_CONNECTED;

this.sIn = sIn;
this.sOut = sOut;

sendRequest();
}
// --------------------------------------------------------------------------------
private boolean conditionMatches( List conditionList, List stringList )
{
Iterator p = conditionList.iterator();
while( p.hasNext() )
	{
	MCondition condition = ( MCondition )p.next();
	if( condition.getEnabled() )
		{
		Pattern pattern = null;
		try
			{
			if( condition.isIgnoreCase() )
				{			
				pattern = Pattern.compile( condition.getPattern(), Pattern.CASE_INSENSITIVE );		
				}
			else
				{
				pattern = Pattern.compile( condition.getPattern() );	
				}			
			}
		catch( PatternSyntaxException e )
			{
			doorman.notifyException( e );
			return false;
			}
		Iterator q = stringList.iterator();
		while( q.hasNext() )
			{
			String input = ( String )q.next();
			if( pattern.matcher( input ).find() )
				{
				return true;
				}						
			}
		}
	}
return false;
}
// --------------------------------------------------------------------------------
private void cleanUp()
{
//request = null;
cIn = null;
cOut = null;
//response = null;
sIn = null;
sOut = null;
}
// --------------------------------------------------------------------------------
public void errorClose()
{
closeStreams();

state = ERROR;
updateGui();
}
// --------------------------------------------------------------------------------
private void closeStreams()
{
closeClientSide();
closeServerSide();
}
// --------------------------------------------------------------------------------
private void closeClientSide()
{
MStreamUtil.closeStream( cIn );
MStreamUtil.closeStream( cOut );
MSystemUtil.closeSocket( cSocket );
}
// --------------------------------------------------------------------------------
public void closeServerSide()
{
MStreamUtil.closeStream( sIn );
MStreamUtil.closeStream( sOut );
MSystemUtil.closeSocket( sSocket );
}
// --------------------------------------------------------------------------------
public void setHost( String host )
{
this.host = host;
}
// --------------------------------------------------------------------------------
public void setPort( int port )
{
this.port = port;
}
// --------------------------------------------------------------------------------
public void setPeer( MPeer p )
{
this.peer = p;
host = p.getHost();
port = p.getPort();
}
// --------------------------------------------------------------------------------
private void updateGui()
{
if( !filterMatches )
	{
	doorman.updateGui( this );
	}
}
// --------------------------------------------------------------------------------
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -