TsgcHTTP3Server › Ereignisse › OnWebTransportSession

OnWebTransportSession Ereignis

Wird ausgelöst, wenn ein Peer über ein Extended CONNECT eine WebTransport-Sitzung anfordert, sodass die Sitzung angenommen oder abgelehnt werden kann.

Syntax

property OnWebTransportSession: TsgcHTTP3WebTransportSessionEvent;
// TsgcHTTP3WebTransportSessionEvent = procedure(Sender: TObject; const aConnection: TsgcQUICServerConnection; const aSession: TsgcWebTransportSession; var aAccept: Boolean) of object

Standardwert

—

Parameter

NameTypBeschreibung
SenderTObjectDie TsgcHTTP3Server-Instanz, die das Ereignis ausgelöst hat.
aConnectionconst TsgcQUICServerConnectionQUIC-Verbindung, über die die Sitzung ausgehandelt wird.
aSessionconst TsgcWebTransportSessionDie Sitzung, die gerade ausgehandelt wird. Ihre SessionId ist die Id des CONNECT-Streams. Weisen Sie hier ihre Handler OnStream, OnDatagram und OnClose zu, bevor Sie annehmen, damit kein frühes Ereignis verpasst wird.
aAcceptvar BooleanAccept-Flag. Es kommt als True an, eine Sitzung wird also standardmäßig angenommen. Setzen Sie es auf False, um die Sitzung abzulehnen.

Hinweise

OnWebTransportSession wird ausgelöst, wenn ein Client eine WebTransport-Sitzung über HTTP/3 öffnet, das heißt, wenn er eine Extended-CONNECT-Anfrage (RFC 9220) sendet, deren :method CONNECT ist und deren Pseudo-Header :protocol den Wert webtransport hat. Eine solche Anfrage baut eine Sitzung auf, statt eine Ressource anzufordern, daher wird sie niemals an OnH3Request weitergeleitet.

Das Ereignis ist der Entscheidungspunkt für Annahme oder Ablehnung, und das Ergebnis wird durch aAccept bestimmt:

aAcceptWas der Server tut
True (der Wert, mit dem es eintrifft)Antwortet mit :status=200 auf dem CONNECT-Stream, hält diesen Stream für die Lebensdauer der Sitzung offen und registriert die Sitzung, damit ihre Streams und Datagramme an sie weitergeleitet werden.
FalseAntwortet mit :status=404 und verwirft das Sitzungsobjekt. Dafür wird kein weiteres Ereignis ausgelöst.

Sitzungen werden standardmäßig akzeptiert. Den Handler nicht zuzuweisen oder aus ihm zurückzukehren, ohne aAccept zu verändern, akzeptiert die Sitzung. Weisen Sie den Handler zu und setzen Sie aAccept := False, um Authentifizierungs- oder Routing-Regeln anzuwenden.

Das Ereignis wird nur ausgelöst, wenn WebTransport aktiviert ist, das heißt, wenn H3Settings.Settings.WebTransportMaxSessions größer als null ist. Diese Einstellung sorgt auch dafür, dass der Server SETTINGS_ENABLE_CONNECT_PROTOCOL, SETTINGS_H3_DATAGRAM und SETTINGS_WEBTRANSPORT_MAX_SESSIONS gegenüber Clients ankündigt, wenn Sie sie also auf ihrem Standardwert 0 belassen, ist WebTransport vollständig deaktiviert und es wird nie ein Extended CONNECT dafür eintreffen.

Beachten Sie, dass WebTransport-Streams funktionieren, während WebTransport-Datagramme auf diesem Transport nicht übertragen werden können, weil die QUIC-Engine in OpenSSL die DATAGRAM-Erweiterung aus RFC 9221 nicht implementiert. Das Senden eines Datagramms löst TsgcQUICException aus, statt die Payload zu verwerfen. Die Einzelheiten finden Sie unter SendDatagram.

Das Ereignis wird auf dem Hintergrund-Listener-Thread des Servers ausgelöst, es darf daher die Benutzeroberfläche nicht direkt anfassen.

OnWebTransportSession wird nur kompiliert, wenn das bedingte Define SGC_WEBTRANSPORT aktiviert ist.

Beispiel


oServer.H3Settings.Settings.WebTransportMaxSessions := 16; // enables WebTransport
oServer.OnWebTransportSession := OnWebTransportSessionEvent;

procedure OnWebTransportSessionEvent(Sender: TObject; const aConnection:
    TsgcQUICServerConnection; const aSession: TsgcWebTransportSession;
    var aAccept: Boolean);
begin
  // reject everything that does not come from the local network
  if Copy(aConnection.PeerIP, 1, 8) <> '192.168.' then
  begin
    aAccept := False;
    Exit;
  end;

  // wire the session events BEFORE accepting
  aSession.OnStream := OnWTStreamEvent;
  aSession.OnClose := OnWTCloseEvent;
  Log('WebTransport session ' + IntToStr(aSession.SessionId) + ' accepted');
end;

Zurück zu Ereignissen