是否可以GET在TIdHTTPServer.OnConnect不干擾后續OnCommandGet事件的情況下讀取Indy事件中的 HTTP 標頭(特別是標頭)?
如果我嘗試用ReadLn's回圈拉動它們,則OnCommandGet永遠不會觸發。我需要先看一下它們,而不必將它們從輸入緩沖區中拉出來。
uj5u.com熱心網友回復:
是否可以
GET在TIdHTTPServer.OnConnect不干擾后續OnCommandGet事件的情況下讀取Indy事件中的 HTTP 標頭(特別是標頭)?
有可能,因為您可以使用該TIdIOHandler.WaitFor()方法等待標頭終止符到達TIdIOHandler.InputBuffer,回傳在它之前收到的所有內容而不從緩沖區中洗掉任何內容,例如:
procedure TMyForm.IdHTTPServer1Connect(AContext: TIdContext);
var
headers: String;
begin
header := AContext.Connection.IOHandler.WaitFor(EOL EOL, False);
...
end;
但是,這有一些限制:
它假設每一行都由位元組序列終止
$0D $0A,因此頭部由位元組序列終止$0D $0A $0D $0A。根據 HTTP 標準,這在技術上是正確的,通常也是如此。但是,某些客戶端確實以 just 終止行,$0A因此標頭將以$0A $0A.TIdHTTPServer通常會處理得很好,但使用WaitFor()不會。更強大的解決方案將涉及
TIdIOHandler.CheckForDataOnSource()在回圈中使用,手動掃描TIdIOHandler.InputBuffer直到在緩沖區中找到$0D $0A $0D $0A或$0A $0A。如果在同一個連接上有多個 HTTP 請求,這將不起作用,如果使用 HTTP 保持活動或 HTTP 流水線,就會發生這種情況。您將“偷看”連接上僅第一個 HTTP 請求的標頭。
如果我嘗試用
ReadLn's回圈拉動它們,則OnCommandGet永遠不會觸發。
正確,因為TIdHTTPServer期望是從InputBuffer. 如果您事先閱讀它們,將不會有任何內容可供TIdHTTPServer閱讀,因此它甚至不知道每個 HTTP 請求是什么樣的。
我需要先看一下它們,而不必將它們從輸入緩沖區中拉出來。
為什么?如果你能得到它們,你想用它們做什么?
您應該檢查該TIdHTTPServer.OnHeadersAvailable活動是否符合您的需要。它在每個 HTTP 請求開始時觸發,在從 中讀取標頭之后InputBuffer但在讀取請求正文之前。
uj5u.com熱心網友回復:
根據 Remy 的建議,我通過查看 Inputbuffer 使其作業:
procedure TForm1.IdHTTPServer1Connect(AContext: TIdContext);
var
s: string;
Done: boolean;
begin
Done := False;
repeat
Sleep(10);
if AContext.Connection.IOHandler.CheckForDataOnSource then
begin
s := AContext.Connection.IOHandler.InputBuffer.AsString;
if (Pos(#13#10#13#10, s) > 0) or (Pos(#10#10, s) > 0) then Done := True;
end;
until Done;
...
end;
我可以看到發生的一個問題是一個機器人在我的埠上建立 TCP 連接,并且由于沒有標頭到來,該回圈永無止境。我需要添加某種超時檢查。
使用 OnHeadersAvailable 的另一個建議對我不起作用,因為它每次都在 OnCommandGet 之前被呼叫(即,當 KeepAlive 為 True 時,每個連接多次呼叫)所以如果我走那條路,我不妨在 OnCommandGet 中進行測驗。
編輯:
我也只是嘗試在 OnConnect 處理程式中執行此操作:
s := AContext.Connection.IOHandler.WaitFor(#10, False, True, nil, 1000);
因為我只需要 GET 行并且它總是第一個(對嗎?)如果它被包含在內,我只需要找到第一個換行符。這解決了行終止符問題,并且有一個超時引數可以解決機器人問題。雖然這確實讀取了第一行標題,但它也會導致立即斷開連接,并且永遠不會呼叫 CommandGet。我究竟做錯了什么?
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/315630.html
