我正在建立一個簡單的代理,它將記錄通過它傳遞的某些請求。代理不需要干擾通過它的流量(此時在項目中),所以我試圖儘可能少地解析原始請求/響應(在請求和響應被推送關閉隊列以在代理之外記錄)。如何確定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消息的格式,我試圖避免必須根據HTTP Content-Length的RFC來搜索它,只需要在* *提前知道它*的情況下指定,並且如果沒有一個Transfer-length頭部(我相信我讀的是正確的),並且無論哪種方式,他們都指定* *之前的身體長度。我會以任何方式看看你的代碼。感謝您的參考。 – GrayWizardx 2010-07-26 18:29:06
在HTTP/1.0中,不需要指定內容長度(傳輸正文時連接關閉)。但在HTTP/1.1中是必需的,因爲連接可以保持打開狀態(用於其他請求)。有一個例外,它是傳輸編碼被分塊的時候。但是,每個身體部位都有它自己的長度,你需要解析。 – jgauffin 2010-07-26 20:09:46