TsgcHTTP3Client › Ereignisse › OnTunnelData
Wird für jedes DATA-Frame ausgelöst, das auf einem aufgebauten Extended-CONNECT-Tunnel eintrifft.
TsgcHTTP3TunnelDataEvent = procedure(Sender: TObject;
const aData: TBytes) of object;
property OnTunnelData: TsgcHTTP3TunnelDataEvent read FOnTunnelData
write FOnTunnelData;
| Name | Typ | Beschreibung |
|---|---|---|
Sender | TObject | Die TsgcHTTP3Client-Instanz, die das Ereignis ausgelöst hat. |
aData | const TBytes | Die rohen getunnelten Bytes, die ein DATA-Frame transportiert. Dies ist die Payload des getunnelten Protokolls, kein HTTP-Antwort-Body. |
Sobald ExtendedConnect einen Tunnel aufgebaut hat, bleibt der Anfrage-Stream offen und verhält sich nicht mehr wie eine Anfrage (RFC 9114 Abschnitt 4.4). Jeder darauf eintreffende DATA-Frame trägt getunnelte Bytes, er wird daher hier zugestellt, statt in einem Antwort-Body gesammelt zu werden. OnResponse wird für Tunnelverkehr nicht ausgelöst.
Die Bytes werden genau so weitergereicht, wie sie empfangen wurden, mit einem Ereignis je DATA-Frame. Frame-Grenzen haben für das getunnelte Protokoll keine Bedeutung, eine Nachricht kann daher über mehrere Ereignisse verteilt sein, oder mehrere Nachrichten können sich eines teilen. Das Zusammensetzen liegt in der Verantwortung des Aufrufers: Puffern Sie die Bytes und werten Sie sie gemäß dem Protokoll aus, das im Tunnel läuft.
Das Ereignis wird nur ausgelöst, während die QUIC-Ereignisschleife angetrieben wird, das heißt innerhalb eines TunnelPump-Aufrufs und daher in dem Thread, der ihn aufgerufen hat. Um in die andere Richtung zu senden, verwenden Sie TunnelSend.
Dieses Mitglied ist derzeit nur in der Delphi/C++Builder-Implementierung verfügbar.
oClient.OnTunnelData := OnTunnelDataEvent;
if oClient.ExtendedConnect('https://www.example.com/tunnel', 'websocket') then
oClient.TunnelPump(1000);
procedure TfrmMain.OnTunnelDataEvent(Sender: TObject; const aData: TBytes);
begin
Log(Format('tunnel: %d bytes', [Length(aData)]));
end;