TsgcHTTP3Server

TsgcHTTP3Server, QUIC üzerinden HTTP isteklerini sunan bir HTTP/3 sunucusu (RFC 9114) uygular.

Giriş

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;

Başvuru

Temel Özellikler

NameAçıklama
PortHTTP/3 sunucusunun dinlediği UDP portu.
QUICOptionsQUIC taşıma seçenekleri; sertifika, özel anahtar ve bağlantı sınırları dahil.
H3SettingsEşlere duyurulan HTTP/3 protokolü ayarları (QPACK ve alan bölümü sınırları).

Temel Yöntemler

NameAçıklama
StartQUIC dinleyicisini başlatır ve HTTP/3 bağlantılarını kabul etmeye başlar.
StopDinleyiciyi durdurur ve tüm etkin bağlantıları kapatır.
SendResponseBir istek akışında HTTP/3 yanıtı gönderir.

Temel Olaylar

NameAçıklama
OnH3RequestTam bir HTTP/3 isteği alındığında, uygulamanın yanıtı doldurabilmesi için tetiklenir.
OnH3ConnectBir istemci HTTP/3 bağlantısı kurduğunda tetiklenir.
OnH3DisconnectBir HTTP/3 bağlantısı kapatıldığında tetiklenir.

Tam Örnek

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;

Gereksinimler