Click here to Skip to main content
15,887,350 members
Please Sign up or sign in to vote.
5.00/5 (1 vote)
See more:
Hi All
I have to trace the HTTP traffic .It work without Https. I try for the https, it successfully get the response via Sslstream through the certificate. When i forward ssl response for the relay but it doesn’t getting the response.

Please let me how to relay SSL response?

Please check the following code for the same.

Thanks

C#
//This mange the http request and response.
public void ThreadHandleHTTPClient(object o)
        {
 try
            {
                Socket client = (Socket)o;
                NetworkStream ns = new NetworkStream(client);
                //RECEIVE CLIENT DATA
                byte[] buffer = new byte[2048];
                int rec = 0, sent = 0, transferred = 0, rport = 0;
                string data = "";
                do
                {
                    rec = ns.Read(buffer, 0, buffer.Length);
                    data += Encoding.ASCII.GetString(buffer, 0, rec);
                } while (rec == buffer.Length);

                //PARSE DESTINATION AND SEND REQUEST
                string line = data.Replace("\r\n", "\n").Split(new string[] { "\n" }, StringSplitOptions.None)[0];
                string e=line.Split(new string[] { " " }, StringSplitOptions.None)[1];
                Uri uri = new Uri(e);
                if (uri.Scheme == "https" || line.Contains("CONNECT"))
                {
                    rport = 443;
                    //Make tunnel for the HTTPS which is authentic host with the right certificate.
                   SslStream sslStream = sslTunnel(ns, uri.OriginalString, "1.0");
                   string remoteUri = "https://" + uri.Scheme;
                   StreamReader clientStreamReader = new StreamReader(sslStream);
                 
                   string httpCmd = clientStreamReader.ReadLine();
                   string[] splitBuffer = httpCmd.Split(_spaceSplit, 3);
                   remoteUri = remoteUri + splitBuffer[1];

                   myQuery = string.Empty;
                   //Read the SSL Stream save command in myQuery variable.
                   readRequestHeadersEx(clientStreamReader);
                   data = myQuery;
                   data = "GET ";
                   data += remoteUri;
                   data += " ";
                   data += "HTTP/1.0";
                   data += "\r\n";
                   data += myQuery;
                   data += "\r\n";

                   line = data.Replace("\r\n", "\n").Split(new string[] { "\n" }, StringSplitOptions.None)[0];
                   uri = new Uri(line.Split(new string[] { " " }, StringSplitOptions.None)[1]);
                  
                }
                else
                {
                    rport = 80;
                }
                IPHostEntry rh = Dns.GetHostEntry(uri.Host);
                Socket remoteserver = new Socket(rh.AddressList[0].AddressFamily, SocketType.Stream, ProtocolType.IP);
                remoteserver.Connect(new IPEndPoint(rh.AddressList[0], rport));
                byte[] databytes = Encoding.ASCII.GetBytes(data);
                remoteserver.Send(databytes, databytes.Length, SocketFlags.None);

                //START RELAY
                buffer = new byte[2048];
                rec = 0;
                data = "";
                do
                {

                    transferred = 0;
                    do
                    {
                        rec = remoteserver.Receive(buffer, buffer.Length, SocketFlags.None);
                        sent = client.Send(buffer, rec, SocketFlags.None);
                        transferred += rec;
                        //data += Encoding.ASCII.GetString(serverbytes, 0, rec);
                    } while (rec == buffer.Length);

                    if (transferred == 0)
                        break;

                } while (transferred > 0);

                client.Close();
            }
            catch (Exception ex)
            {
                
            }           
        }


//Start The thread
C#
public void Start(IPAddress ip, int port)
           {
TcpListener listener = new TcpListener(ip, port);
               listener.Start(100);
               while (true)
               {
                   Socket client = listener.AcceptSocket();
                   Thread th = new Thread(ThreadHandleHTTPClient);
                   th.Start(client);
               }

               listener.Stop();
           }
Posted
Comments
Mohammed Hameed 18-May-13 2:01am    
Very interesting question asked. But not have much time to check it out and try. +5 for it.

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900