TsgcHTTP3Client › Methoden › ExtendedConnect
Führt einen Extended-CONNECT-Handshake (RFC 9220) durch und hält den Anfrage-Stream als Tunnel offen.
function ExtendedConnect(const aURL, aProtocol: string): Boolean;
| Name | Typ | Beschreibung |
|---|---|---|
aURL | const string | Absolute URL des Tunnel-Endpunkts. Host, Port und Pfad füllen die Pseudo-Header :authority und :path. |
aProtocol | const string | Wert des Pseudo-Headers :protocol, zum Beispiel websocket oder webtransport. |
True, wenn der Server mit einem 2xx-Status geantwortet hat und der Tunnel aufgebaut ist, False, wenn der Server Extended CONNECT nicht unterstützt oder die Anfrage abgelehnt hat. (Boolean)
ExtendedConnect implementiert die in RFC 9220 für HTTP/3 definierte Extended-CONNECT-Methode, das Gegenstück zu RFC 8441 für HTTP/2. Sie öffnet die QUIC-Verbindung zum Host in aURL oder verwendet sie erneut und sendet eine Anfrage, deren Pseudo-Header :method=CONNECT, :protocol=aProtocol, :scheme=https sowie :authority und :path aus der URL sind.
Der Server muss SETTINGS_ENABLE_CONNECT_PROTOCOL in seinem SETTINGS-Frame angekündigt haben, andernfalls gibt die Methode False zurück, ohne etwas zu senden. Der Client wartet zuerst auf das Eintreffen der Peer-SETTINGS, begrenzt durch ConnectTimeout, und der angekündigte Wert kann über PeerSettings eingesehen werden.
Der Aufruf blockiert dann, bis die Antwort-Header eintreffen, begrenzt durch ReadTimeout. Anders als bei einer gewöhnlichen Anfrage wartet er nicht auf das Ende des Streams, denn ein Tunnel hält den Anfrage-Stream offen (RFC 9114 Abschnitt 4.4). Bei einem 2xx-Status wird der Stream als Tunnel beibehalten und True zurückgegeben; jeder andere Status gibt False zurück.
Sobald der Tunnel steht, schreiben Sie mit TunnelSend hinein und lesen daraus, indem Sie TunnelPump aufrufen, das eingehende Bytes über OnTunnelData bereitstellt. Um eine WebTransport-Sitzung aufzubauen, verwenden Sie WebTransportConnect, das diesen Handshake mit dem Protokoll webtransport durchführt und das Ergebnis in ein Sitzungsobjekt kapselt.
Dieses Mitglied ist derzeit nur in der Delphi/C++Builder-Implementierung verfügbar.
if oClient.ExtendedConnect('https://www.example.com/tunnel', 'websocket') then
begin
oClient.OnTunnelData := OnTunnelDataEvent;
oClient.TunnelSend(TEncoding.UTF8.GetBytes('hello'));
oClient.TunnelPump(1000);
end;