TsgcHTTP3Server › Methoden › SendResponse
Sendet eine HTTP/3-Antwort (HEADERS- und DATA-Frames) auf einem Request-Stream.
procedure SendResponse(const aQUICConn: TsgcQUICServerConnection; aStreamId: Int64; const aResponse: TsgcHTTP3Response); virtual;
| Name | Typ | Beschreibung |
|---|---|---|
aQUICConn | const TsgcQUICServerConnection | QUIC-Verbindung, in die die Antwort geschrieben wird. Es wird nichts gesendet, wenn die Verbindung der HTTP/3-Schicht nicht bekannt ist. |
aStreamId | Int64 | Bezeichner des Anfrage-Streams, zu dem die Antwort gehört. Die Antwort wird auf diesen bestimmten QUIC-Stream geschrieben, wenn der Transport ihn verfolgt, andernfalls auf den Standard-Stream der Verbindung. |
aResponse | const TsgcHTTP3Response | Zu sendende Antwort. Setzen Sie vor dem Aufruf StatusCode, ContentType, optional Headers und den Data-Body. Siehe OnH3Request dazu, wie eine Antwort aufgebaut wird. |
Im normalen Anfrageablauf rufen Sie SendResponse nicht auf. Der Server erstellt eine TsgcHTTP3Response mit StatusCode voreingestellt auf 200, löst OnH3Request aus, damit die Anwendung sie füllen kann, und sendet sie automatisch, wenn der Handler zurückkehrt. Ein Aufruf von SendResponse innerhalb von OnH3Request würde eine zweite Antwort auf demselben Stream senden. Die Methode wird für fortgeschrittene Szenarien bereitgestellt, in denen eine Antwort außerhalb dieses Ablaufs erzeugt werden muss.
SendResponse kodiert den Header-Abschnitt der Antwort per QPACK in einen HEADERS-Frame, hängt einen DATA-Frame an, wenn die Antwort einen Body enthält, und schreibt beide auf den Anfrage-Stream. Den Header-Abschnitt stellt es für Sie zusammen:
:status wird aus aResponse.StatusCode geschrieben.content-type wird hinzugefügt, wenn aResponse.ContentType nicht leer ist.content-length wird automatisch aus der tatsächlichen Länge von aResponse.Data hinzugefügt. Die Eigenschaft ContentLength des Antwortobjekts wird dafür nicht verwendet.aResponse.Headers wird in Kleinbuchstaben im Format name=value angehängt.Zwei Klassen von Headern werden verworfen statt gesendet, weil RFC 9114 sie auf der Leitung verbietet: Pseudo-Header, also jeder Eintrag, dessen Name mit : beginnt, und die verbindungsspezifischen Header connection, keep-alive, proxy-connection, transfer-encoding und upgrade. Setzen Sie den Status über StatusCode, statt selbst einen :status-Eintrag hinzuzufügen.
Eine Antwort auf eine HEAD-Anfrage wird nur als Header-Abschnitt gesendet. Der DATA-Frame wird unterdrückt, auch wenn aResponse.Data gesetzt ist, wie es RFC 9114 Abschnitt 4.1.1 verlangt, sodass ein HEAD-Handler den Body genau wie ein GET-Handler füllen und ihn vom Server entfernen lassen kann.
Bevor der HEADERS-Frame hinausgeht, werden alle ausstehenden QPACK-Encoder-Stream-Anweisungen, die beim Codieren dieser Antwort entstanden sind, auf dem QPACK-Encoder-Stream des Servers geleert, damit ein Client, der mit der dynamischen Tabelle decodiert, die Referenzen auflösen kann.
.NET-Unterschied. Die .NET-Implementierung deklariert SendResponse mit einer Verbindungs-ID-Zeichenfolge statt mit einem Verbindungsobjekt, und die Methode ist derzeit eine Leeroperation, sodass keine Antwort geschrieben wird. Die HTTP/3-Framing- und QPACK-Schicht existiert in .NET, und der Server verwendet sie für den SETTINGS-Handshake sowie für Extended CONNECT / WebTransport, aber SendResponse wurde nie damit verbunden: Der Methodenrumpf ignoriert seine Argumente und kehrt zurück. Verwenden Sie die Delphi/C++Builder-Implementierung, um HTTP/3-Antworten zu senden.
oResponse := TsgcHTTP3Response.Create;
try
oResponse.StatusCode := 200;
oResponse.ContentType := 'text/plain';
// custom headers use name=value
oResponse.Headers.Add('cache-control=no-store');
oResponse.Data := TEncoding.UTF8.GetBytes('Hello HTTP/3');
oServer.SendResponse(aConnection, aStreamId, oResponse);
finally
oResponse.Free;
end;