hi every body. i want capture browser traffic and resend it also i want get response stream and resend it to browser. everything is ok but in some case the result webpage dose not appear correctly.
its my first function :
private void StartHttpListening()
{
while (true)
{
TcpListener tcpListener = new TcpListener(IPAddress.Any, 9090);
tcpListener.Start();
TcpClient tcpClient = tcpListener.AcceptTcpClient();
NetworkStream browserStream = tcpClient.GetStream();
tcpListener.Stop();
Thread thr = new Thread(new ParameterizedThreadStart(ListenToHTTPStream));
thr.IsBackground = true;
thr.Start(browserStream);
}
}
i use this function for get request from browser
private void ListenToHTTPStream(object netStreamObj)
{
NetworkStream netStream = (NetworkStream)netStreamObj;
byte[] requestByte = new byte[65535];
int readLenght = 0;
readLenght = netStream.Read(requestByte, 0, 65535);
GetHTTPResp(netStream, requestByte);
}
i use this function for get response from server and send it too my browser:
private void GetHTTPResp(NetworkStream browserStream, byte[] requestByte)
{
string hostName = GetHostName(requestByte);
if (hostName == null) return;
TcpClient serverConnection;
try
{
serverConnection = new TcpClient(hostName, 80);
}
catch { return; }
byte[] requestBuffer = Encoding.UTF8.GetBytes(Encoding.UTF8.GetString(requestByte));
NetworkStream serverStream = serverConnection.GetStream();
serverStream.Write(requestBuffer, 0, requestBuffer.Length);
byte[] readBuffer = new byte[65535 * 200];
int numberOfBytesRead = 0;
int zeroReadTime = 0;
string s = "";
while (true)
{
try
{
numberOfBytesRead = serverStream.Read(readBuffer, 0, 65536);
Thread.Sleep(50);
if (numberOfBytesRead == 0)
{
zeroReadTime++;
}
else
{
browserStream.Write(readBuffer, 0, numberOfBytesRead);
zeroReadTime = 0;
}
if (zeroReadTime == 20)
{
browserStream.Close();
serverStream.Close();
serverConnection.Close();
return;
}
}
catch
{
browserStream.Close();
serverStream.Close();
serverConnection.Close();
return;
}
}
browserStream.Close();
serverStream.Close();
serverConnection.Close();
}