HTTP+HTTPS+POP3+IMAP プロキシ サーバーを実装しようとしています。現在、HTTP および HTTPS プロキシを実装しています。しかし、HTTPS プロキシを使用しようとすると、次の例外があります。
an existing connection was forcibly closed by remote host
TCPリスナーからソケットを処理するコードは次のとおりです。
static void PerformConnection(object o)
{
try
{
Socket receiver = o as Socket;
if (receiver != null)
{
NetworkStream ns = new NetworkStream(socket: receiver);
byte[] buffer = new byte[450000];
ns.Read(buffer, 0, Convert.ToInt32(450000));
string data = Encoding.UTF8.GetString(buffer);
string line = data.Replace("\r\n", "\n").Split(new string[] {"\n"}, StringSplitOptions.None)[0];
if (line != "" && line != null)
{
Uri uri = new Uri("http://someforbiddenhost.org");
uri = new Uri(line.Split(new string[] {" "}, StringSplitOptions.None)[1]);
if (uri.Host.Contains("shelesta.org"))
{
string Html = "<html><body><h1>It works!</h1></body></html>";
string response = "HTTP/1.1 200 OK\nContent-type: text/html\nContent-Length:" + Html.Length.ToString() + "\n\n" + Html;
receiver.Send(Encoding.UTF8.GetBytes(response));
}
else
{
if (line.StartsWith("CONNECT"))
{
string host = uri.ToString().Substring(0, uri.ToString().IndexOf(':'));
TcpClient clDestination = new TcpClient();
clDestination.Connect(host, 443);
SslStream sslStream = new SslStream(clDestination.GetStream());
sslStream.AuthenticateAsClient(host);
byte[] request = Encoding.UTF8.GetBytes(String.Format("GET https://{0}:443/ HTTP/1.1\r\nHost: {0}\r\n\r\n", host));
sslStream.Write(request, 0, request.Length);
sslStream.Flush();
int bytes = 10;
receiver.ReceiveTimeout = 6000000;
do
{
bytes = sslStream.Read(buffer, 0, buffer.Length);
Console.Write(Encoding.UTF8.GetString(buffer, 0, bytes));
receiver.Send(buffer,buffer.Length,SocketFlags.Partial);// HERE EXCEPTION RAISES
} while (bytes != 0);
}
else
{
IPHostEntry rh = Dns.GetHostEntry(uri.Host);
Socket webserver = new Socket(rh.AddressList[0].AddressFamily, SocketType.Stream,
ProtocolType.IP);
webserver.Connect(new IPEndPoint(rh.AddressList[0], 80));
byte[] databytes = Encoding.ASCII.GetBytes(data);
webserver.Send(databytes, databytes.Length, SocketFlags.None);
byte[] ReceiverBuffer = new byte[2000048];
webserver.Receive(ReceiverBuffer);
receiver.Send(ReceiverBuffer);
}
}
}
}
}
catch
{
}
}
コードのフォーマットについて申し訳ありませんが、SO WYSIWYG エディターが表示されず、次のメッセージだけが表示されます。スタック オーバーフローには、別のドメインからの外部 JavaScript が必要です。ブロックされているか、読み込みに失敗しています。