TsgcHTTP3Server, QUIC üzerinden HTTP isteklerini sunan bir HTTP/3 sunucusu (RFC 9114) uygular.
TsgcHTTP3Server, RFC 9114'te tanımlandığı şekliyle bir HTTP/3 sunucusu uygular. HTTP/3, HTTP isteklerini ve yanıtlarını yerleşik TLS 1.3 ile UDP tabanlı bir taşıma olan QUIC üzerinden taşır; böylece her bağlantı şifreli ve çoğullanmış olup kuyruk başı engelleme yoktur. Sunucu varsayılan olarak OpenSSL 3.5 veya üzeri tarafından sağlanan yerel QUIC dinleyicisi üzerinde çalışır ve bu dinleyici kullanılamadığında sgc QUIC motoruna geri döner (bkz. QUICMode); bu nedenle harici bir HTTP/3 kütüphanesi gerekmez.
Bu bileşeni yapılandırmak için aşağıdaki adımları izleyin:
1. TsgcHTTP3Server'ın yeni bir örneğini oluşturun ve sunucunun dinleyeceği Port'unu ayarlayın (HTTP/3 UDP kullanır).
2. Sertifikayı ve özel anahtarı QUICOptions.SSLOptions'ta ayarlayın. QUIC, TLS'yi zorunlu kılar; bu nedenle bir sertifika gereklidir.
3. OnH3Request olayını işleyin, yanıtı doldurun ve Start metodunu çağırın. aResponse parametresi sunucu tarafından oluşturulur (durum kodu varsayılan olarak 200'dür); StatusCode, ContentType ve gövdesini ayarlayın; işleyici döndüğünde sunucu yanıtı otomatik olarak gönderir. örnek:
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;
| Name | Açıklama |
|---|---|
| Port | HTTP/3 sunucusunun dinlediği UDP portu. |
| QUICOptions | QUIC taşıma seçenekleri; sertifika, özel anahtar ve bağlantı sınırları dahil. |
| H3Settings | Eşlere duyurulan HTTP/3 protokolü ayarları (QPACK ve alan bölümü sınırları). |
| Name | Açıklama |
|---|---|
| Start | QUIC dinleyicisini başlatır ve HTTP/3 bağlantılarını kabul etmeye başlar. |
| Stop | Dinleyiciyi durdurur ve tüm etkin bağlantıları kapatır. |
| SendResponse | Bir istek akışında HTTP/3 yanıtı gönderir. |
| Name | Açıklama |
|---|---|
| OnH3Request | Tam bir HTTP/3 isteği alındığında, uygulamanın yanıtı doldurabilmesi için tetiklenir. |
| OnH3Connect | Bir istemci HTTP/3 bağlantısı kurduğunda tetiklenir. |
| OnH3Disconnect | Bir HTTP/3 bağlantısı kapatıldığında tetiklenir. |
Aşağıdaki örnek, birkaç yolu yönlendirip JSON veya düz metin gövdesi döndüren bir HTTP/3 sunucusu başlatır. Yanıt OnH3Request içinde doldurulur ve sunucu tarafından otomatik olarak gönderilir.
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 koşullu tanımını etkin olarak derleyin.sgcHTTP3_Server birimini uses yan tümcesine ekleyin.QUICOptions.SSLOptions.IOHandler = iohOpenSSL ile yerel QUIC dinleyicisini sağlayan OpenSSL 3.5 veya üzeri gerektirir; daha eski bir OpenSSL'de yedekleme yoktur. iohNativeTLS ile OpenSSL gerekmez.