TsgcHTTP3Server implementuje serwer HTTP/3 (RFC 9114), który obsługuje żądania HTTP przez QUIC.
TsgcHTTP3Server implementuje serwer HTTP/3 zgodnie z definicją w RFC 9114. HTTP/3 przenosi żądania i odpowiedzi HTTP przez QUIC (transport oparty na UDP z wbudowanym TLS 1.3), więc każde połączenie jest szyfrowane i multipleksowane bez blokowania head-of-line. Domyślnie serwer działa na natywnym nasłuchiwaczu QUIC dostarczonym przez OpenSSL 3.5 lub nowszy, a gdy ten nasłuchiwacz jest niedostępny, korzysta z własnego silnika QUIC sgc (zobacz QUICMode), więc nie jest wymagana żadna zewnętrzna biblioteka HTTP/3.
Należy wykonać poniższe kroki w celu skonfigurowania tego komponentu:
1. Utwórz nową instancję TsgcHTTP3Server i ustaw Port, na którym serwer będzie nasłuchiwać (HTTP/3 używa UDP).
2. Ustaw certyfikat i klucz prywatny we właściwości QUICOptions.SSLOptions. Protokół QUIC wymaga TLS, więc certyfikat jest obowiązkowy.
3. Obsłuż zdarzenie OnH3Request, wypełnij odpowiedź i wywołaj Start. Parametr aResponse jest tworzony przez serwer (domyślny kod statusu to 200); ustaw jego StatusCode, ContentType i treść, a serwer automatycznie odeśle odpowiedź po powrocie z procedury obsługi. przykład:
oServer := TsgcHTTP3Server.Create(nil);
oServer.Port := 443;
oServer.QUICOptions.SSLOptions.CertFile := 'cert.pem';
oServer.QUICOptions.SSLOptions.KeyFile := 'key.pem';
oServer.OnH3Request := OnH3RequestEvent;
oServer.Start;
procedure OnH3RequestEvent(Sender: TObject; const aConnection:
TsgcQUICServerConnection; const aRequest: TsgcHTTP3Request;
const aResponse: TsgcHTTP3Response);
begin
aResponse.StatusCode := 200;
aResponse.ContentType := 'text/plain';
aResponse.Data := TEncoding.UTF8.GetBytes('Hello HTTP/3');
end;
| Nazwa | Opis |
|---|---|
| Port | Port UDP, na którym nasłuchuje serwer HTTP/3. |
| QUICOptions | Opcje transportu QUIC, w tym certyfikat, klucz prywatny i limity połączeń. |
| H3Settings | Ustawienia protokołu HTTP/3 (QPACK i limity sekcji pól) ogłaszane partnerom. |
| Nazwa | Opis |
|---|---|
| Start | Uruchamia nasłuch QUIC i rozpoczyna akceptowanie połączeń HTTP/3. |
| Stop | Zatrzymuje nasłuch i zamyka wszystkie aktywne połączenia. |
| SendResponse | Wysyła odpowiedź HTTP/3 na strumieniu żądania. |
| Nazwa | Opis |
|---|---|
| OnH3Request | Wywoływane po odebraniu kompletnego żądania HTTP/3, aby aplikacja mogła wypełnić odpowiedź. |
| OnH3Connect | Uruchamiane, gdy klient nawiązuje połączenie HTTP/3. |
| OnH3Disconnect | Uruchamiane, gdy połączenie HTTP/3 zostaje zamknięte. |
Poniższy przykład uruchamia serwer HTTP/3, który obsługuje kilka ścieżek i zwraca treść JSON lub zwykłego tekstu. Odpowiedź jest wypełniana wewnątrz OnH3Request i wysyłana automatycznie przez serwer.
oServer := TsgcHTTP3Server.Create(nil);
oServer.Port := 443;
oServer.QUICOptions.SSLOptions.CertFile := 'cert.pem';
oServer.QUICOptions.SSLOptions.KeyFile := 'key.pem';
oServer.OnH3Request := OnH3RequestEvent;
oServer.OnH3Connect := OnH3ConnectEvent;
oServer.OnH3Disconnect := OnH3DisconnectEvent;
oServer.Start;
procedure OnH3ConnectEvent(Sender: TObject; const aConnection:
TsgcQUICServerConnection);
begin
Log('HTTP/3 client connected: ' + aConnection.PeerIP);
end;
procedure OnH3DisconnectEvent(Sender: TObject; const aConnection:
TsgcQUICServerConnection; aCode: Int64; const aReason: string);
begin
Log('HTTP/3 client disconnected');
end;
procedure OnH3RequestEvent(Sender: TObject; const aConnection:
TsgcQUICServerConnection; const aRequest: TsgcHTTP3Request;
const aResponse: TsgcHTTP3Response);
begin
if aRequest.Path = '/api/time' then
begin
aResponse.StatusCode := 200;
aResponse.ContentType := 'application/json';
aResponse.Data := TEncoding.UTF8.GetBytes(
'{"time":"' + DateTimeToStr(Now) + '"}');
end
else
begin
aResponse.StatusCode := 404;
aResponse.ContentType := 'text/plain';
aResponse.Data := TEncoding.UTF8.GetBytes('Not Found');
end;
end;
SGC_HTTP3.sgcHTTP3_Server do klauzuli uses.QUICOptions.SSLOptions.IOHandler = iohOpenSSL. Nie ma rezerwowej opcji na starszym OpenSSL. Z iohNativeTLS OpenSSL nie jest potrzebny.