通過する特定のリクエストをログに記録する単純なプロキシの構築に取り組んでいます。プロキシは、(プロジェクトのこの時点で) 通過するトラフィックに干渉する必要がないため、プロセス中に生の要求/応答の解析をできるだけ少なくしようとしています (要求と応答はプッシュされます)。プロキシの外でログに記録されるようにキューにオフにします)。
私のサンプルは正常に動作しますが、「応答」がいつ完了したかを確実に判断できないため、接続が必要以上に長く開いたままになっています。関連するコードは次のとおりです。
var request = getRequest(url);
byte[] buffer;
int bytesRead = 1;
var dataSent = false;
var timeoutTicks = DateTime.Now.AddMinutes(1).Ticks;
Console.WriteLine(" Sending data to address: {0}", url);
Console.WriteLine(" Waiting for response from host...");
using (var outboundStream = request.GetStream()) {
while (request.Connected && (DateTime.Now.Ticks < timeoutTicks)) {
while (outboundStream.DataAvailable) {
dataSent = true;
buffer = new byte[OUTPUT_BUFFER_SIZE];
bytesRead = outboundStream.Read(buffer, 0, OUTPUT_BUFFER_SIZE);
if (bytesRead > 0) { _clientSocket.Send(buffer, bytesRead, SocketFlags.None); }
Console.WriteLine(" pushed {0} bytes to requesting host...", _backBuffer.Length);
}
if (request.Connected) { Thread.Sleep(0); }
}
}
Console.WriteLine(" Finished with response from host...");
Console.WriteLine(" Disconnecting socket");
_clientSocket.Shutdown(SocketShutdown.Both);
私の質問は、ヘッダーを解析せずに応答が完了したことを簡単に伝える方法があるかどうかです。この応答は何でもかまいません (エンコード、暗号化、gzip など)。実際の応答をデコードして長さを取得し、ソケットを切断できるかどうかを判断する必要はありません。