TsgcHTTPServer › Eigenschaften › HTTP3Options
Aktiviert den HTTP/3-Listener (QUIC), der HTTP-Anfragen neben HTTP/1.1 und HTTP/2 über UDP bedient.
property HTTP3Options: TsgcWSHTTP3Server_Options read FHTTP3Options write SetHTTP3Options;
Enabled=False, Port=0, Host='', AltSvc.Enabled=True
Standardmäßig lauscht der Server nicht auf HTTP/3. Setzen Sie HTTP3Options.Enabled auf True, um zusätzlich zum bestehenden TCP/TLS-Listener einen QUIC-Listener zu öffnen; dafür sind das bereits in SSLOptions konfigurierte Zertifikat und der Schlüssel erforderlich (CertFile/KeyFile sowie Password, wenn der private Schlüssel verschlüsselt ist) sowie OpenSSL 3.5 oder neuer. SSLOptions.IOHandler muss iohOpenSSL oder iohNativeTLS sein, jeder andere Wert löst beim Start des Listeners einen Fehler aus. Mit iohNativeTLS läuft der HTTP/3-Listener auf der sgc-QUIC-Engine mit dem TLS-1.3-Handshake auf der nativen TLS-Engine und dem Paketschutz auf sgcCrypto, sodass kein OpenSSL erforderlich ist, siehe SSL ohne OpenSSL. Der HTTP/3-Listener liest SSLOptions.Password genau so wie der HTTPS-Listener, sodass ein einziger Satz aus CertFile/KeyFile/Password sowohl den TCP/TLS-Listener als auch den HTTP/3-Listener bedient. Port legt den UDP-Port fest, an den der Listener bindet; belassen Sie ihn bei 0, um den bereits in SSLOptions.Port gesetzten Port wiederzuverwenden. Host legt die Adresse fest, an die der Listener bindet; lassen Sie sie leer, der Standardwert, um jede Schnittstelle zu binden. Sie akzeptiert eine IPv4-Adresse, eine IPv6-Adresse oder einen Hostnamen. Der HTTP/3-Listener besitzt einen eigenen einzelnen UDP-Socket und liest Bindings nicht, diese Eigenschaft kann daher nicht verwendet werden, um den Listener auf eine Schnittstelle zu legen. Über HTTP/3 eintreffende Anfragen werden über dieselbe DocumentRoot-Auslieferung statischer Dateien sowie dieselben Ereignisse OnCommandGet und OnCommandOther weitergeleitet, die auch für HTTP/1.1 und HTTP/2 verwendet werden, sodass bestehender Code zur Anfrageverarbeitung meist unverändert funktioniert; zwei Unterschiede sind zu beachten: ARequestInfo.Version meldet für diese Anfragen 'HTTP/3', und der an den Handler übergebene Parameter AContext ist nil (hinter einer HTTP/3-Anfrage steht keine TCP-Verbindung), sodass jeder Code, der ihn dereferenziert, diesen Fall abfangen muss. AltSvc.Enabled (standardmäßig aktiviert) sorgt dafür, dass HTTPS-Antworten einen Alt-Svc-Header mit einer Ankündigung des HTTP/3-Endpunkts tragen, sobald der Listener läuft, sodass Browser und Clients ihn erkennen und selbstständig darauf umschalten können; wenn beide aktiviert sind, wird dies mit der HTTP/2-Alt-Svc-Ankündigung zu einem einzigen Header zusammengeführt. Authentication.Basic wird bei HTTP/3-Anfragen durchgesetzt. Sitzungen, OAuth2-, JWT- und WebAuthn-Authentifizierung sowie die Anfrageweiterleitung benötigen einen TCP-Verbindungszustand, den eine HTTP/3-Anfrage nicht besitzt, sodass sie auf diesem Transport nicht ausgewertet werden können; ein Server, der mit einem dieser Verfahren konfiguriert ist, weist HTTP/3-Anfragen mit 401 zurück, statt sie unauthentifiziert zu bedienen. Konfigurieren Sie die Basic-Authentifizierung, wenn der HTTP/3-Listener authentifizierte Anfragen bedienen soll. Falls der HTTP/3-Listener nicht starten kann (Port bereits belegt, Zertifikat fehlt oder ist ungültig, OpenSSL 3.5 nicht verfügbar), läuft der reguläre HTTP/1.1- und HTTP/2-Server unbeeinträchtigt weiter, und der Fehler wird über OnException gemeldet. Für die Kompilierung mit HTTP/3-Unterstützung muss die Compiler-Direktive für das HTTP3-Pack aktiviert sein.
oServer := TsgcHTTPServer.Create(nil);
oServer.SSL := true;
oServer.SSLOptions.CertFile := 'c:\certificates\mycert.pem';
oServer.SSLOptions.KeyFile := 'c:\certificates\mycert.pem';
oServer.HTTP3Options.Enabled := true;
oServer.Active := true;