Я работаю над созданием простого прокси-сервера, который будет регистрировать определенные запросы, которые передаются через него. Прокси не должен вмешиваться в трафик, проходящий через него (на данный момент в проекте), и поэтому я стараюсь сделать как можно меньше разбора необработанного запроса/ответа как можно затягивающего процесс (запрос и ответ нажаты отключение до очереди для входа в систему вне прокси-сервера).Как определить, завершен ли ответ HTTP
Мой образец работает нормально, за исключением того, что он не может достоверно сказать, когда «ответ» завершен, поэтому у меня есть соединения, которые остаются открытыми дольше, чем необходимо. Соответствующий код приведен ниже:
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'ed и т. Д.), Я не хочу, чтобы декодировать фактический ответ, чтобы получить длину и определить, могу ли я отключить мой сокет.
Я знаю формат HTTP-сообщения, я пытался не искать его вообще, так как в RFC для HTTP Content-Length нужно указывать только, если его * известно * раньше времени, а если нет заголовок «Длина передачи» (я считаю, что я правильно понял), и в любом случае они указывают длину тела * перед кодировкой *. Я посмотрю ваш код в любом случае. Спасибо за ссылку. – GrayWizardx
В HTTP/1.0 уверенная длина содержимого не требуется указывать (соединение закрывается, когда тело передается). Но в HTTP/1.1 это необходимо, так как соединение может оставаться открытым (для других запросов). Есть одно исключение, и именно тогда происходит перекодирование передачи. Но тогда каждая часть тела имеет свою собственную длину, которую нужно проанализировать. – jgauffin