特定のポート (すべての要求は 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();
しかし、電子メールを開くと正しく機能しません