TsgcHTTP3Server › Methoden › TunnelSend

TunnelSend Methode

Sendet Bytes über einen bestehenden CONNECT-Tunnel-Stream zurück.

Syntax

procedure TunnelSend(const aConnection: TsgcQUICServerConnection; aStreamId: Int64; const aData: TBytes); virtual;

Parameter

NameTypBeschreibung
aConnectionconst TsgcQUICServerConnectionQUIC-Verbindung, der der Tunnel gehört. Es wird nichts gesendet, wenn dies nil ist.
aStreamIdInt64Bezeichner des CONNECT-Anfrage-Streams, der zum Tunnel wurde. Verwenden Sie die von OnH3TunnelData gemeldete aStreamId.
aDataconst TBytesZu tunnelnde Bytes. Sie werden zur Payload eines einzelnen DATA-Frames. Ein leeres Array sendet nichts.

Hinweise

TunnelSend ist die Schreibseite eines mit CONNECT aufgebauten HTTP/3-Tunnels, entweder mit der einfachen CONNECT-Methode aus RFC 9114 Abschnitt 4.4 oder mit dem Extended CONNECT aus RFC 9220. Eine CONNECT-Anfrage, die Ihr OnH3Request-Handler mit einem 2xx-Status beantwortet, verwandelt den Anfrage-Stream in einen Tunnel: Der Server hält den Stream offen, behandelt eingehende DATA-Frames nicht mehr als Anfrage-Body und leitet sie an OnH3TunnelData weiter. TunnelSend schiebt Bytes in die entgegengesetzte Richtung und verpackt aData in einem DATA-Frame auf demselben Stream.

Bytes werden genau so gesendet, wie sie übergeben werden, ohne eigenes Framing über den HTTP/3-DATA-Frame hinaus, sodass das getunnelte Protokoll vollständig der Anwendung überlassen bleibt. Auf Tunnelebene gibt es auch keine Garantie für Pufferung oder Reassemblierung: Ein Peer kann einen einzelnen TunnelSend-Aufruf als mehrere Blöcke lesen, daher benötigt ein über den Tunnel transportiertes Protokoll eigene Nachrichtengrenzen.

Wenn der Tunnel auf einem zusätzlichen Anfrage-Stream liegt, schreibt der Server auf genau diesen QUIC-Stream. Liegt er auf dem ersten (Standard-)Anfrage-Stream der Verbindung, geht der Schreibvorgang an den Standard-Stream der Verbindung. Beide Fälle werden anhand der von Ihnen übergebenen aStreamId behandelt, sodass es immer korrekt ist, einfach die von OnH3TunnelData erhaltene ID zurückzugeben.

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

Beispiel


// 1. accept the CONNECT so the stream becomes a tunnel
procedure OnH3RequestEvent(Sender: TObject; const aConnection:
    TsgcQUICServerConnection; const aRequest: TsgcHTTP3Request;
    const aResponse: TsgcHTTP3Response);
begin
  if aRequest.Method = h3meConnect then
    aResponse.StatusCode := 200 // 2xx establishes the tunnel
  else
    aResponse.StatusCode := 404;
end;

// 2. echo every byte that arrives on the tunnel back to the peer
procedure OnH3TunnelDataEvent(Sender: TObject; const aConnection:
    TsgcQUICServerConnection; aStreamId: Int64; const aData: TBytes);
begin
  TsgcHTTP3Server(Sender).TunnelSend(aConnection, aStreamId, aData);
end;

Zurück zu Methoden