Я работаю над созданием простого прокси, который будет регистрировать определенные запросы, которые передаются через него.Прокси не должен мешать трафику, проходящему через него (на данном этапе в проекте), и поэтому я пытаюсь сделать как можно меньше анализа необработанного запроса / ответа во время процесса (запрос и ответ выдвигаютсяв очередь для входа за пределы прокси).
Мой пример работает нормально, за исключением того, что я не могу достоверно сказать, когда «ответ» завершен, поэтому у меня остаются открытые соединения дольше, чем необходимо.Ниже приведен соответствующий код:
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'ом и т. Д.), Я не хочу декодировать фактический ответ, чтобы получить длину и определить, могу ли я отключить свой сокет.