1

特定のポート (すべての要求は Web ブラウザーからのもの) からのすべての要求をコードとして要求のホスト名にリダイレクトしようとしています。

1 - リクエストからすべての受信データを読み取る

            while (recvRequest)
            {
                this.clientSocket.Receive(requestBuffer);
                string fromByte = ASCIIEncoding.ASCII.GetString(requestBuffer);
                requestPayload += fromByte;

                if (requestPayload.EndsWith(EOL + EOL))
                {
                    recvRequest = false;
                }
            }

2 - クエリの解析 (ホスト、ポート、リクエスト タイプの取得)

            HeaderFields = ParseQuery(requestPayload);
            if (HeaderFields == null || !HeaderFields.ContainsKey("Host"))
            {
                return;
            }
            int Port;
            string Host;
            int Ret;

3 - タイプが等しい場合は CONNECT

            if (HttpRequestType.ToUpper().Equals("CONNECT"))
            { //HTTPS
                Ret = RequestedPath.IndexOf(":");
                if (Ret >= 0)
                {
                    Host = RequestedPath.Substring(0, Ret);
                    if (RequestedPath.Length > Ret + 1)
                        Port = int.Parse(RequestedPath.Substring(Ret + 1));
                    else
                        Port = 443;
                }
                else
                {
                    Host = RequestedPath;
                    Port = 443;
                }


            }

4 - equal post または get と入力した場合

            else
            { //Normal HTTP
                Ret = ((string)HeaderFields["Host"]).IndexOf(":");
                if (Ret > 0)
                {
                    Host = ((string)HeaderFields["Host"]).Substring(0, Ret);
                    Port = int.Parse(((string)HeaderFields["Host"]).Substring(Ret + 1));
                }
                else
                {
                    Host = (string)HeaderFields["Host"];
                    Port = 80;
                }
                if (HttpRequestType.ToUpper().Equals("POST"))
                {
                    int index = requestPayload.IndexOf("\r\n\r\n");
                    m_HttpPost = requestPayload.Substring(index + 4);
                }
            }



            requestPayload = "";
            foreach (string line in requestLines)
            {

                requestPayload += line;
                requestPayload += EOL;
            }

5 - ホストに接続

            Socket destServerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            destServerSocket.Connect(Host, Port);
            //State 2: Sending New Request Information to Destination Server and Relay Response to Client
            destServerSocket.Send(ASCIIEncoding.ASCII.GetBytes(requestPayload));
            //Console.WriteLine("Begin Receiving Response...");

6 - 受信応答をクライアントに送信する

while (destServerSocket.Receive(responseBuffer) != 0) {

                Console.Write(ASCIIEncoding.ASCII.GetString(responseBuffer));
                this.clientSocket.Send(responseBuffer);
            }

            destServerSocket.Disconnect(false);
            destServerSocket.Dispose();
            this.clientSocket.Disconnect(false);
            this.clientSocket.Dispose();

しかし、電子メールを開くと正しく機能しません

4

0 に答える 0