TsgcHTTP3Server › Ereignisse › OnH3TunnelData

OnH3TunnelData Ereignis

Wird ausgelöst, wenn Payload auf einem etablierten CONNECT-Tunnel-Stream eintrifft.

Syntax

property OnH3TunnelData: TsgcHTTP3ServerTunnelDataEvent;
// TsgcHTTP3ServerTunnelDataEvent = procedure(Sender: TObject; const aConnection: TsgcQUICServerConnection; aStreamId: Int64; const aData: TBytes) of object

Standardwert

—

Parameter

NameTypBeschreibung
SenderTObjectDie TsgcHTTP3Server-Instanz, die das Ereignis ausgelöst hat.
aConnectionconst TsgcQUICServerConnectionQUIC-Verbindung, der der Tunnel gehört. Übergeben Sie sie an TunnelSend zurück, um zu antworten.
aStreamIdInt64Bezeichner des CONNECT-Anfrage-Streams, der als Tunnel fungiert. Gibt an, zu welchem Tunnel die Bytes gehören, wenn eine Verbindung mehrere hat.
aDataconst TBytesPayload des DATA-Frames, also die getunnelten Bytes genau so, wie der Peer sie geframt hat.

Hinweise

OnH3TunnelData ist die Leseseite eines HTTP/3-Tunnels (RFC 9114 Abschnitt 4.4 und Extended CONNECT gemäß RFC 9220). Ein Request-Stream wird zu einem Tunnel, wenn eine CONNECT-Anfrage aus OnH3Request mit einem 2xx-Status beantwortet wird. Ab diesem Zeitpunkt hält der Server den Stream offen und interpretiert DATA-Frames darauf nicht mehr als Request-Body: Jeder DATA-Frame wird stattdessen hier zugestellt, und der Stream mündet nie in ein weiteres OnH3Request.

Das Ereignis wird daher nur bei Streams ausgelöst, die bereits als Tunnel akzeptiert wurden. Es wird nie für ein CONNECT ausgelöst, das Sie mit einem Nicht-2xx-Status abgelehnt haben, da ein solcher Stream wie jede gewöhnliche Anfrage beantwortet und abgeschlossen wird.

Jedes Ereignis liefert einen DATA-Frame. HTTP/3 sichert nicht zu, dass die logische Nachricht eines Peers auf einen Frame abgebildet wird, daher muss ein über den Tunnel geführtes Protokoll eigene Nachrichtengrenzen definieren, statt anzunehmen, dass ein Ereignis einer Nachricht entspricht. Antworten Sie über denselben Tunnel mit TunnelSend und übergeben Sie dabei die hier empfangenen aConnection und aStreamId.

Eine innerhalb des Handlers ausgelöste Ausnahme wird vom Server abgefangen und verworfen, damit ein fehlschlagender Tunnel-Handler die Verbindung nicht trennen kann. Das bedeutet, dass Fehler still bleiben: Behandeln und protokollieren Sie sie innerhalb des Handlers, wenn Sie sie sehen möchten.

Das Ereignis wird auf dem Hintergrund-Listener-Thread des Servers ausgelöst, demselben Thread, der die QUIC-Verbindung liest, daher darf es die Benutzeroberfläche nicht direkt anfassen und sollte schnell zurückkehren, da die Verbindung während der Ausführung des Handlers nicht bedient wird.

Dieses Mitglied ist derzeit nur in der Delphi/C++Builder-Implementierung verfügbar.

Beispiel


oServer.OnH3Request := OnH3RequestEvent;
oServer.OnH3TunnelData := OnH3TunnelDataEvent;

procedure OnH3RequestEvent(Sender: TObject; const aConnection:
    TsgcQUICServerConnection; const aRequest: TsgcHTTP3Request;
    const aResponse: TsgcHTTP3Response);
begin
  // a 2xx answer to a CONNECT turns the stream into a tunnel
  if aRequest.Method = h3meConnect then
    aResponse.StatusCode := 200
  else
    aResponse.StatusCode := 404;
end;

procedure OnH3TunnelDataEvent(Sender: TObject; const aConnection:
    TsgcQUICServerConnection; aStreamId: Int64; const aData: TBytes);
begin
  Log('tunnel ' + IntToStr(aStreamId) + ': ' + IntToStr(Length(aData)) + ' bytes');
  // echo the payload back through the same tunnel
  TsgcHTTP3Server(Sender).TunnelSend(aConnection, aStreamId, aData);
end;

Zurück zu Ereignissen