sgcQUIC beş dakikada

Yerel Object Pascal'da QUIC ve HTTP/3, OpenSSL içindeki QUIC motoru üzerinde. Dört bileşen gelir. Çalışan bir şeye giden en kısa yol HTTP/3 istemcisidir; bu nedenle bu sayfa tek bir istek yapar, durum kodunu okur ve hangi OpenSSL'e ihtiyacınız olduğu konusunda net olur.

QUIC RFC 9000 ve HTTP/3 RFC 9114
İstemci için OpenSSL 3.2 ve üzeri
All-Access sürümü

İlk istek için gerekenler

Bir bileşen, bir URL ve çalıştırılabilir dosyanızın yanında iki OpenSSL kitaplığı.

Bileşen

SGC QUIC palet sayfasında sgcQUIC.pas içinde bildirilen TsgcHTTP3Client. Sayfa ayrıca TsgcQUICClient, TsgcQUICServer ve TsgcHTTP3Server bileşenlerini de taşır.

Unit

Bileşen için sgcQUIC. TsgcHTTP3Response için sgcHTTP3_Classes, Alt-Svc olayını işliyorsanız sgcHTTP_AltSvc ekleyin.

Çağrı

Get(aURL) gövdeyi bir string olarak döndürür ve hata durumunda istisna oluşturur. Durum kodu ve üst bilgiler ayrı olarak, OnResponse üzerinde gelir.

OpenSSL gereksinimi

İstemci, OpenSSL 3.2 veya üzerindeki QUIC API'sine ya da bir quictls derlemesine ihtiyaç duyar. Sunucu ise yalnızca orada bulunan bir API'yi çağırdığı için 3.5 veya üzerini gerektirir. Her demo klasöründe olduğu gibi libcrypto-3.dll ve libssl-3.dll dosyalarını çalıştırılabilir dosyanızın yanında dağıtın.

Gereksinimler ve sürümler

Sürüm sütunu, kodu kısıtlayan tanımdır; yanında Source/sgcVer.inc içinde bulunduğu satır yer alır.

Konu Değer
IDE Delphi 7'den RAD Studio 13'e ve C++Builder 2007'den 13'e kadar. Ayrı bir sgcQUIC indirmesi yoktur: bileşenler sgcWebSockets paket grubunun içindedir.
Uses yan tümcesi sgcQUIC, ayrıca yanıt nesnesi için sgcHTTP3_Classes ve Alt-Svc türleri için sgcHTTP_AltSvc.
Paket tanımı SGC_PACK_QUIC, 870. satırdan 874. satıra kadar uzanan {$IFDEF SGC_EDT_ALL} bloğunun içinde, 872. satırda tanımlanır. Yani All-Access.
Özellik tanımları 894 ile 899. satırlardaki {$IFDEF SGC_PACK_QUIC} bloğunun içinde: 896. satırda SGC_QUIC, 897. satırda SGC_HTTP3 ve 898. satırda SGC_WEBTRANSPORT. Üçü de 895. satırdaki bir {$IFDEF SGC_INDY_LIB} içinde yer alır; bu nedenle özel Indy kitaplığı olmayan bir derleme bunların hiçbirini almaz.
OpenSSL, istemci 3.2 veya üzeri ya da bir quictls derlemesi. Kitaplık bunu kendisi söyler: QUIC kullanılamadığında oluşturulan hata şöyledir: QUIC is not available. Requires quictls/openssl or OpenSSL 3.2+.
OpenSSL, sunucu 3.5 veya üzeri. QUIC sunucusu SSL_new_listener işlevini çağırır ve bu eksik olduğunda oluşturduğu hata şöyledir: QUIC Server requires OpenSSL 3.5 or later. msquic kullanılmaz ve gerekmez.
Platformlar sgcQUIC.pas, sgcQUIC_Client.pas, sgcHTTP3_Client.pas veya sgcHTTP3_Server.pas üzerinde unit kapsamında bir platform koruması yoktur ve dört bileşenin hepsi ComponentPlatforms(0) ile kaydedilir. Sunucu unit'i, hem Windows hem de POSIX dalıyla, soket API'sini platforma göre seçer.

Motorun çalışma zamanında mevcut olduğundan emin değil misiniz? IsOpenSSL_QUIC_Available işlevini çağırın; yüklediğiniz OpenSSL'in QUIC istemci metodunu sunup sunmadığını döndürür. Pakette gelen QUIC istemci demosu tam da bu nedenle bunu başlangıçta günlüğe yazar.

Kurun ve palet sayfasını bulun

Ayrı bir sgcQUIC yükleyicisi yoktur. Bileşenler sgcWebSockets ile gelir ve sürüm onları etkinleştirdiğinde görünür.

1. Zip dosyasını açın

sgcWebSockets indirmesini aşağıda {$DIR} olarak adlandırılan bir klasöre açın.

2. Kitaplık yolu

Tools, Options, Library. {$DIR}\source yolunu ve IDE'niz için lib klasörünü ekleyin; örneğin {$DIR}\libD13\$(Platform).

3. Paketleri derleyin

{$DIR}\Packages\ altında IDE sürümünüz için paket grubunu açın. Önce çalışma zamanı .dpk dosyasını derleyin, ardından tasarım zamanı dcl dosyasını kurun. QUIC'e özgü bir paket yoktur.

4. Paleti kontrol edin

TsgcQUICClient, TsgcQUICServer, TsgcHTTP3Client ve TsgcHTTP3Server bileşenlerini içeren SGC QUIC adlı bir sayfa görünür. Sayfa yoksa derleme All-Access değildir, çünkü SGC_PACK_QUIC yalnızca o bloğun içinde, 872. satırda tanımlanır.

5. OpenSSL'i exe'nin yanına koyun

libcrypto-3.dll ve libssl-3.dll dosyalarını çalıştırılabilir dosyanızın yanına kopyalayın; istemci için 3.2 veya üzeri, sunucu için 3.5 veya üzeri. Demos\22.QUIC_Protocol altındaki her klasör bunları içerir, dolayısıyla oradan kopyalayabilirsiniz.

Tek bir HTTP/3 isteği

İstemciyi oluşturun, üç olayı bağlayın, Get çağırın. Yanıt bir dize olarak döner ve durum kodu OnResponse üzerinde gelir.

FHTTP3Client.pas
uses
  Classes, SysUtils,
  // sgc
  sgcQUIC, sgcHTTP3_Classes;

procedure TfrmHTTP3Client.FormCreate(Sender: TObject);
begin
  FClient := TsgcHTTP3Client.Create(nil);
  FClient.OnConnect := OnH3Connect;
  FClient.OnError := OnH3Error;
  FClient.OnResponse := OnH3Response;
  FClient.TLSOptions.VerifyCertificate := True;
  FClient.ConnectTimeout := 10000;
  FClient.ReadTimeout := 30000;
  FClient.UserAgent := 'sgcWebSockets/HTTP3Client';
end;

procedure TfrmHTTP3Client.btnGetClick(Sender: TObject);
var
  vResult: string;
begin
  try
    // the target comes from the URL, because Host and Port
    // are read-only on this component
    vResult := FClient.Get('https://www.google.com/');
    memoBody.Lines.Text := vResult;
    DoLog('Response received: ' + IntToStr(Length(vResult)) + ' bytes');
  except
    on E: Exception do
      DoLog('Error: ' + E.Message);
  end;
end;

Post, Put ve Delete aynı biçimi alır ve her birinin, bir dizede tutmak istemediğiniz bir gövde için akış aşırı yüklemesi vardır. Connect(const aHost: string; aPort: Integer = 443), ikisini ayırmak istediğinizde bağlantıyı ilk istekten önce açar.

FHTTP3Client.pas
// OnConnect and OnDisconnect are plain TNotifyEvent on this
// component: one parameter, no connection object.
procedure TfrmHTTP3Client.OnH3Connect(Sender: TObject);
begin
  DoLog('Connected to ' + FClient.Host + ':' + IntToStr(FClient.Port));
end;

procedure TfrmHTTP3Client.OnH3Error(Sender: TObject; const aError: string);
begin
  DoLog('Error: ' + aError);
end;

procedure TfrmHTTP3Client.OnH3Response(Sender: TObject;
  const aResponse: TsgcHTTP3Response);
begin
  DoLog('Status: ' + IntToStr(aResponse.StatusCode));
  memoHeaders.Lines.Assign(aResponse.Headers);
end;

OnConnect içinde FClient.Host ve FClient.Port değerlerini okumak, bu iki özelliğin tam olarak ne için olduğudur. Bağlantıyı bildirirler, yapılandırmazlar.

FQUICClient.pas
uses
  Classes, SysUtils,
  // sgc
  sgcIdSSLOpenSSLHeaders;

procedure TfrmQUICClient.FormCreate(Sender: TObject);
begin
  DoLog('OpenSSL QUIC Support:');
  DoLog('  quictls API: ' +
    BoolToStr(IsOpenSSL_QUIC_TLS_Available, True));
  DoLog('  Builtin QUIC (3.2+): ' +
    BoolToStr(IsOpenSSL_QUIC_Available, True));
end;

Bunu her şeyden önce bir kez çalıştırın. İkisi de false bildirirse, çalıştırılabilir dosyanızın yanındaki OpenSSL'de QUIC yoktur ve bundan sonraki her bağlantı hatası ağın değil bu tek gerçeğin belirtisidir.

İlk iki sekme, form denetimleri sabit değerlerle değiştirilmiş olarak paketle gelen Demos\22.QUIC_Protocol\03.HTTP3_Client\FHTTP3Client.pas demosundan alınmıştır. Üçüncüsü 01.QUIC_Client\FQUICClient.pas içindeki çalışma zamanı kullanılabilirlik denetimidir. Bu klasörde bir WebTransport çifti dahil altı QUIC demosu vardır.

Yalnızca gövdeyi değil durum kodunu da okuyun

Get gövdeyi döndürür. Yanıt nesnesi geri kalan her şeyi taşır ve kendi olayında gelir.

Dönüş değeri

Get, yanıt gövdesini bir string olarak döndürür ve hata durumunda istisna oluşturur; bu nedenle demo onu bir try except içine sarar. Beklediğiniz uzunlukta bir gövde ilk kanıttır.

OnResponse

procedure(Sender: TObject; const aResponse: TsgcHTTP3Response). Gerçekten istediğiniz sayı StatusCode değeridir, Headers bir TStringList nesnesidir ve GetDataAsString gövdeyi yanıt nesnesinden size yeniden verir.

OnConnect

Düz bir TNotifyEvent. Tetiklenmesi, QUIC'in anlaştığı ve HTTP/3 oturumunun açıldığı anlamına gelir; bu, ilk çalıştırmada başarısız olma olasılığı en yüksek kısımdır.

Kodu suçlamadan önce

IsOpenSSL_QUIC_Available, önce sorulması gereken tek soruyu yanıtlar. QUIC ayrıca UDP 443 üzerinden çalışır ve TCP 443'e izin veren bir ağ buna mutlaka izin vermez.

İlk seferde genellikle ne ters gider

Başarısız olan ilk isteklerin neredeyse tamamı altı sorundan kaynaklanır.

Host veya Port atanamıyor

TsgcHTTP3Client üzerinde salt okunurdurlar ve property Host: string read FHost ile property Port: Integer read FPort olarak bildirilmişlerdir. İstemcinin nereye bağlı olduğunu bildirirler. Hedef seçmek için Get çağrısına tam bir URL verin veya Connect(aHost, aPort) çağırın.

QUIC kullanılamıyor

Yüklediğiniz OpenSSL çok eski ya da QUIC olmadan derlenmiş. İstemci 3.2 veya üzerini ya da quictls gerektirir. Ağı suçlamadan önce çalışma zamanında IsOpenSSL_QUIC_Available ile kontrol edin.

Sunucu başlamıyor

QUIC sunucusu SSL_new_listener işlevini çağırdığı için OpenSSL 3.5 veya üzerini gerektirir. 3.2 derlemesi istemci için yeterlidir, sunucu için değil ve hata iletisi bunu açıkça söyler.

OnConnect üzerinde yanlış parametre sayısı

Bu bileşendeki OnConnect ve OnDisconnect düz birer TNotifyEvent olduğundan işleyici yalnızca Sender: TObject alır. WebSocket bileşenlerinin aksine size bir bağlantı nesnesi vermezler.

UDP engellenmiş

QUIC, 443 numaralı port üzerinden UDP ile çalışır ve birçok kurumsal ağ TCP 443'e izin verip UDP 443'ü düşürür. Bir tarayıcı ana makineye HTTP/3 üzerinden ulaşabiliyor ve uygulamanız ulaşamıyorsa, koddan önce güvenlik duvarından şüphelenin.

Palet sayfası yok

SGC_PACK_QUIC yalnızca All-Access bloğunun içinde, 872. satırda tanımlanır. Ayrıca SGC_INDY_LIB gerektirir, çünkü 894 ile 899. satırlardaki paket bloğunun tamamı bu korumanın içinde yer alır.

İlk isteğin ötesinde

Dört yön, hepsi aynı paketin içinde.

Bir HTTP/3 sunucusu çalıştırın

TsgcHTTP3Server, HTTP/3'ü doğrudan QUIC üzerinden sunar. Sunucu tarafında OpenSSL 3.5 alt sınırını unutmayın.

HTTP/3 sunucusu bileşeni

HTTP olmadan ham QUIC

TsgcQUICClient ve TsgcQUICServer, HTTP/3 katmanı olmadan QUIC akışları sunar; bu, head of line blocking olmadan çoklama gerektiren özel bir protokol için istediğiniz şeydir.

QUIC istemcisi ve QUIC sunucusu

WebTransport

HTTP/3 üzerinden bir tarayıcıya çift yönlü akışlar ve datagramlar; 898. satırdaki SGC_WEBTRANSPORT ile kısıtlanır. İki demo gelir.

sgcQUIC özellikleri

HTTP/3'ü HTTP/2'den keşfedin

Bir sunucu HTTP/3'ü bir Alt-Svc üst bilgisiyle duyurur. OnAltSvc olayını işleyin; kaynak sunucu QUIC sunduğunda mevcut bir bağlantıyı QUIC'e yükseltebilirsiniz.

HTTP/2 istemcisi

Başvuru, demolar ve belgeler

Demo projeleri indirmenin içinde, Demos\22.QUIC_Protocol altında gelir. Altı tanedir.

HTTP/3 istemci bileşeni TsgcHTTP3Client bileşeninin sunduğu her şey, özellik özellik.
HTTP/3 sunucu bileşeni OpenSSL 3.5 gereksinimi dahil sunucu tarafı.
QUIC istemci bileşeni HTTP/3 katmanı olmadan ham QUIC akışları.
sgcQUIC özellikleri QPACK, 0-RTT, bağlantı geçişi, WebTransport ve diğerleri.
Denemeyi indirin IDE sürümü başına bir yükleyici, QUIC bileşenleri zaten içinde.
Çevrimiçi yardım Oluşturulan başvuru, her zaman güncel sürümle uyumludur.

İlgili okumalar: QUIC istemci ve sunucu bileşenleri ve HTTP/3 bileşenleri. Taşıma katmanları arasında seçim yapıyorsanız, gerçek zamanlı taşıma rehberi bunları karşılaştırır. Her ürünün kendi hızlı başlangıcı vardır ve başlarken sayfasında listelenir.

sgcQUIC hızlı başlangıç soruları

SGC QUIC palet sayfasındaki sgcQUIC unit'inden TsgcHTTP3Client. OnResponse parametre türü olan TsgcHTTP3Response için sgcHTTP3_Classes, OnAltSvc olayını işliyorsanız sgcHTTP_AltSvc ekleyin. Palet sayfası ayrıca TsgcQUICClient, TsgcQUICServer ve TsgcHTTP3Server bileşenlerini de taşır.
Hangi tarafı oluşturduğunuza bağlıdır. İstemci, OpenSSL 3.2 ile eklenen QUIC API'sine ya da bir quictls derlemesine ihtiyaç duyar ve kitaplık bunu oluşturduğu iletide söyler: QUIC is not available. Requires quictls/openssl or OpenSSL 3.2+. Sunucu, SSL_new_listener işlevini çağırdığı için 3.5 veya üzerini gerektirir ve hata iletisi bu sürümü açıkça belirtir. libcrypto-3.dll ve libssl-3.dll dosyalarını çalıştırılabilir dosyanızın yanında dağıtın. msquic kullanılmaz.
Çünkü salt okunurdurlar. TsgcHTTP3Client bunları property Host: string read FHost ve property Port: Integer read FPort olarak bildirir; bu nedenle geçerli bağlantıyı yapılandırmak yerine bildirirler. Get, Post, Put veya Delete çağrısına tam bir URL verin ya da önce Connect(const aHost: string; aPort: Integer = 443) çağırın.
Düz bir TNotifyEvent, yani procedure(Sender: TObject). OnDisconnect için de aynıdır. Bu, olayları size bir TsgcWSConnection veren WebSocket bileşenlerinden farklıdır ve ilk derleme hatasının sık görülen bir kaynağıdır. OnResponse, procedure(Sender: TObject; const aResponse: TsgcHTTP3Response) biçimindedir ve OnError, procedure(Sender: TObject; const aError: string) biçimindedir.
OnResponse üzerindeki yanıt nesnesinden. TsgcHTTP3Response, StatusCode, bir TStringList olarak Headers ve gövde için GetDataAsString sunar. Get metodunun kendisi yalnızca gövdeyi bir dize olarak döndürür; demonun OnResponse olayını da bağlamasının nedeni budur.
SGC_PACK_QUIC, sgcVer.inc dosyasının 872. satırında, 870 ile 874. satırlar arasındaki {$IFDEF SGC_EDT_ALL} bloğunun içinde tanımlanır. Yani All-Access. 894 ile 899. satırlardaki paket bloğunun kendisi de bir {$IFDEF SGC_INDY_LIB} içinde yer alır; bu nedenle özel Indy kitaplığının da derlemenin parçası olması gerekir. Bu blokta SGC_QUIC 896. satır, SGC_HTTP3 897. satır ve SGC_WEBTRANSPORT 898. satırdır.
Hayır. Deneme yükleyicisi IDE sürümü başınadır ve QUIC ile HTTP/3 bileşenlerini zaten içerir; QUIC'e özgü bir paket dosyası da yoktur. sgcWebSockets'i kurun, sürüm etkinleştirdiğinde SGC QUIC palet sayfası görünür.
Evet ve denetlemelisiniz. IsOpenSSL_QUIC_Available, yüklenen OpenSSL'in QUIC istemci metodunu sunup sunmadığını döndürür; IsOpenSSL_QUIC_TLS_Available ise aynısını QUIC TLS geri çağrıları için yapar. Pakette gelen QUIC istemci demosu ikisini de başlangıçta günlüğüne yazar; bu da gizemli bir bağlantı hatasını tek satırlık bir yanıta dönüştürür.
En avantajlı seçenek: All-AccessTüm eSeGeCe ürünleri, Premium Destek dahil, yılda €1,059'dan itibaren.
All-Access fiyatlarına bakın

Delphi'den HTTP/3'ü denemeye hazır mısınız?

Denemeyi indirin ve HTTP/3 istemci demosunu gerçek bir kaynak sunucuya karşı çalıştırın.