Wydanie 2026.9.0: sgcWebSockets, sgcSign, sgcIndy i sgcOpenAPI

· Wydania
Wydanie 2026.9.0 bibliotek komponentów eSeGeCe dla Delphi, C++ Builder i .NET

2026.9.0 jest już dostępne jednocześnie dla wszystkich produktów: sgcWebSockets, sgcWebSockets .NET, sgcSign, sgcIndy i sgcOpenAPI. To największe wydanie w tym roku. Do sgcWebSockets dołączają dwa całkowicie nowe pakiety, silniki serwera zostały przebudowane wokół problemu, który od dawna powodował gubienie żądań, a biblioteka podpisów nauczyła się weryfikować podpis względem czegoś innego niż on sam.

Ten wpis omawia to, co w każdym produkcie jest najważniejsze, wraz z kodem Delphi tam, gdzie to pomaga. Wszystko znajdziesz w dzienniku zmian, a elementy zmieniające dotychczasowe zachowanie zebraliśmy pod koniec, abyś mógł je przeczytać przed aktualizacją.

Całe wydanie w mniej niż cztery minuty. Także na YouTube.

ProduktNowościPoprawkiZmiany niezgodne wstecz
sgcWebSockets255622
sgcSign257021
sgcOpenAPI9255
sgcWebSockets .NET52410
sgcIndy050

sgcWebSockets 2026.9.0

sgcWebRTC, natywny silnik mediów WebRTC

Nowy pakiet sgcWebRTC zamienia TsgcRTCPeerConnection w kompletny punkt końcowy WebRTC. Połączenia audio i wideo, udostępnianie ekranu oraz kanały danych SCTP, wszystko w Pascalu, bez przeglądarki, bez kontrolki WebView i bez zewnętrznej biblioteki multimedialnej. Działa w systemach Windows, Linux, macOS, iOS i Android, a po drugiej stronie może być przeglądarka, ponieważ SDP, które produkuje i przyjmuje, jest prawdziwe.

Wymiana oferty i odpowiedzi ma kształt zgodny z W3C, więc CreateOffer, CreateAnswer, SetLocalDescription, SetRemoteDescription i AddIceCandidate robią to, co mówią ich nazwy. SDP przenosisz dowolnym kanałem sygnalizacyjnym, którym już dysponujesz, a może nim być serwer WebSocket zbudowany na tej samej bibliotece.

uses
  sgcP2P;

var
  oRTC: TsgcRTCPeerConnection;
begin
  oRTC := TsgcRTCPeerConnection.Create(nil);
  oRTC.RTCOptions.ICEServers.AddURL('stun:stun.l.google.com:19302');
  oRTC.OnLocalDescription      := OnLocalDescriptionHandler;
  oRTC.OnICECandidate          := OnICECandidateHandler;
  oRTC.OnConnectionStateChange := OnConnectionStateChangeHandler;
  oRTC.OnDataChannel           := OnDataChannelHandler;

  oRTC.CreateDataChannel('chat');   // forces RTCOptions.DTLS on
  oRTC.CreateOffer;                 // gathers ICE candidates, builds the SDP offer
end;

procedure TForm1.OnLocalDescriptionHandler(Sender: TObject;
  const aType, aSDP: string);
begin
  // send aType + aSDP to the remote peer over your own signalling channel
end;

Media działają tak samo. AddTrack dołącza ścieżkę audio Opus lub G.711 albo ścieżkę wideo VP8, H.264 czy Motion JPEG, SendPCM i SendVideoFrame wpychają przechwycone media do środka, a OnAudio i OnVideoFrame przekazują Ci zdekodowaną ścieżkę zdalną.

Dawne rozwiązania zastępcze z epoki przeglądarek poszły w drugą stronę. Obsługa protokołu AppRTC i API RTCMultiConnection została usunięta, podobnie jak awaryjny tryb Flash, którego wsparcie zakończyło się w 2020 roku. Zobacz uwagi dotyczące aktualizacji na końcu.

sgcCrypto, kryptografia bez OpenSSL

Drugim nowym pakietem jest sgcCrypto, czysto pascalowa implementacja prymitywów, po które aplikacje faktycznie sięgają. Uwierzytelnione szyfrowanie AES oraz ChaCha20/XChaCha20-Poly1305, SHA-2 i SHA-3, Argon2, scrypt i HKDF do haseł i wyprowadzania kluczy, Ed25519, Ed448, X25519, X448 i secp256k1, generowanie kluczy RSA, generowanie certyfikatów X.509 i żądań CSR oraz postkwantowe algorytmy ML-KEM, ML-DSA i SLH-DSA.

Każdy prymityw to zwykła funkcja. Nie ma obiektu kontekstu, który trzeba utworzyć, skonfigurować i zwolnić, ani biblioteki DLL, którą trzeba dostarczać obok pliku wykonywalnego.

uses
  sgcCrypto_Random, sgcCrypto_AES, sgcCrypto_Keccak, sgcCrypto_Ed25519,
  sgcCrypto_MLKEM;

var
  vKey, vIV, vPlain, vAAD, vTag, vCipher: TBytes;
  vDigest, vSeed, vSignature, vMessage: TBytes;
  vPublicKey, vPrivateKey, vSharedSecret, vCiphertext: TBytes;
begin
  // AES-256-GCM: authenticated encryption in one call
  vKey    := sgcRandomBytes(32);
  vIV     := sgcRandomBytes(12);
  vPlain  := TEncoding.UTF8.GetBytes('confidential payload');
  vCipher := sgcAES_GCM_Encrypt(vKey, vIV, vPlain, vAAD, vTag);

  // SHA-3-256, one call, no context object to manage
  vDigest := sgcSHA3_256(vPlain);

  // Ed25519: sign, then verify
  vSeed      := sgcRandomBytes(32);
  vMessage   := TEncoding.UTF8.GetBytes('sign me');
  vSignature := sgcEd25519_Sign(vSeed, vMessage);

  // ML-KEM-768: post-quantum key encapsulation (FIPS 203)
  sgcMLKEM_GenerateKeyPair(mlkem768, vPublicKey, vPrivateKey);
  sgcMLKEM_Encapsulate(mlkem768, vPublicKey, vCiphertext, vSharedSecret);
end;

Pięć kompletnych aplikacji sgcHTML

sgcHTML zyskuje cztery komponenty i pięć dem. Komponenty to CameraScanner, panel kamery na żywo, który odczytuje kody kreskowe i kody QR skanerem wbudowanym w przeglądarkę i zawsze oferuje ręczne wprowadzenie jako rozwiązanie zapasowe, a także NumPad, CommandPalette i EmptyState.

Te pięć dem to nie fragmenty kodu. Każde z nich jest całą aplikacją z logowaniem, bazą danych i raportami do druku, a znajdziesz je w Demos\60.HTML\01.RunTime: zarządzanie magazynem, punkt sprzedaży, portal raportowy, wielodostępny panel sterowania SaaS oraz dyspozytornia serwisu terenowego.

Pojawił się też nowy temat pomocy, Runtime vs Design-Time, wraz z demami pokazującymi, jak zbudować tę samą stronę, upuszczając komponenty na formularz VCL zamiast składać ją w kodzie.

Prawdziwy adres klienta za odwrotnym proxy

Serwer stojący za nginx, Apache albo chmurowym systemem równoważenia obciążenia widzi na każdym połączeniu adres serwera proxy, co oznacza, że czarna lista, biała lista, GeoIP i Twoje własne reguły patrzyły na niewłaściwego klienta. Nowe ustawienia ForwardedHeaders w TsgcWebSocketFirewall odzyskują adres przekazany przez proxy.

Projekt jest celowo nieufny. Adres z X-Forwarded-For lub X-Real-IP jest brany pod uwagę tylko wtedy, gdy samo połączenie przychodzi z adresu wymienionego w TrustedProxies, więc klient nie może go zmyślić, a łańcuch jest czytany od prawej strony, za liczbą serwerów proxy podaną w TrustedHops, ponieważ skrajny lewy wpis pochodzi od klienta. Ustalanie adresu odbywa się przy każdym żądaniu, ponieważ proxy wykorzystuje jedno połączenie do żądań od różnych rozmówców.

uses
  sgcWebSocket;

begin
  oFirewall.ForwardedHeaders.Enabled := True;
  oFirewall.ForwardedHeaders.TrustedProxies.Add('10.0.0.0/8');
  oFirewall.ForwardedHeaders.TrustedProxies.Add('::1');
  oFirewall.ForwardedHeaders.TrustedHops := 1;

  oServer.Firewall := oFirewall;
end;

procedure TForm1.OnServerConnectHandler(Connection: TsgcWSConnection);
begin
  // Connection.IP is now the end client
  // Connection.PeerIP is still the proxy that opened the socket
end;

Po ustaleniu tego adresu widzi go każdy wpis czarnej listy, każda własna reguła, każde zdarzenie i Twój własny kod obsługi. Ustawienia zachowują się tak samo na serwerze http.sys, jak i na serwerze Indy, a ta sama funkcja trafia do sgcSign Server jako server.firewall.forwarded_headers.

Przeciwciśnienie, które da się zmierzyć

Zapisywanie do wolnego klienta szybciej, niż ten czyta, powiększa kolejkę wychodzącą, aż coś ustąpi. Nie było sposobu, by zobaczyć to z wnętrza aplikacji, więc przekaźniki kończyły na wymianie w trybie zatrzymaj i czekaj po sieci, tylko po to, by zachować bezpieczeństwo.

Zastępują to dwa dodatki. PendingCount w TsgcWSConnection podaje, ile komunikatów wciąż czeka w kolejce danego połączenia na trzech poziomach priorytetu, a jego odczyt niczego nie alokuje, więc można go odpytywać. OnQueueDrained wyzwala się, gdy kolejka połączenia przechodzi ze stanu z komunikatami do stanu pustego, w wątku połączenia, zaraz po opróżnieniu i przed kolejnym odczytem, więc kredyt można przyznać bez żadnego opóźnienia.

procedure TForm1.OnQueueDrainedHandler(Connection: TsgcWSConnection);
begin
  // raised on the connection thread: do not touch the user interface here
  SendNextBatch(Connection);
end;

procedure TForm1.SendIfRoom(Connection: TsgcWSConnection; const aText: string);
begin
  if Connection.PendingCount < 100 then
    Connection.WriteData(aText);
end;

Oba przekraczają granicę DLL, więc dostaje je również wrapper .NET i każdy inny host korzystający z sgcWebSockets.dll. Nowe eksporty zostały dopisane na końcu, więc dotychczasowa kolejność eksportów pozostaje bez zmian.

Silniki EPOLL i IOCP

Wysokowydajne silniki miały całą klasę defektów o jednej przyczynie: zakładały, że żądanie przychodzi w jednym odczycie gniazda. To prawda w teście na pętli zwrotnej i nieprawda na dowolnej granicy MTU, przez VPN albo zawsze wtedy, gdy duża treść żądania rozkłada się na kilka pakietów.

Żądanie, które nie dotarło w całości, było odrzucane wraz z zamknięciem połączenia i bez odpowiedzi, a rekord TLS rozdzielony na dwa segmenty TCP zamykał połączenie od razu. Oba błędy są naprawione, a nowa opcja PartialRequestTimeout ogranicza czas, przez jaki serwer czeka na resztę, w osobnej puli wątków, aby wolny klient nie blokował pozostałych. W silniku EPOLL połączenia serwera nigdy nie były też zwalniane po zamknięciu przez klienta, więc OnDisconnect nigdy się nie wyzwalało, a każde rozgłoszenie nadal zapisywało do martwego połączenia.

To również powód, dla którego WorkOpThreads zmieniło znaczenie. Nie przypina już połączenia do jednego wątku, ponieważ połączenie czekające na resztę żądania blokowało wszystkie pozostałe połączenia w tym wątku. Teraz ustawia najmniejszą liczbę wątków roboczych utrzymywanych w gotowości, a pula rośnie od tej wartości.

QUIC i HTTP/3

Klient i serwer QUIC oraz HTTP/3 mówią teraz w IPv6. Adres zawierający dwukropek jest traktowany jako IPv6, adres URL może go nieść w nawiasach kwadratowych, a nazwa hosta jest rozwiązywana w obu rodzinach, podczas gdy wcześniej próbowano tylko IPv4. Nasłuch HTTP/3 bez ustawionego hosta obsługuje obie rodziny przez jedno gniazdo, a nowa właściwość Host w HTTP3Options przypina go do jednego interfejsu, gdy tego potrzebujesz.

Większa zmiana polega na tym, że żądania HTTP/3 idą teraz tą samą ścieżką co żądania HTTP/1.1. Serwery OpenAPI, MCP i REST API, przekazywanie żądań, CORS, wielodostępność i metryki w ogóle nie odpowiadały przez HTTP/3, ponieważ ten transport miał własną ścieżkę. Teraz wszystkie działają.

Weryfikacja certyfikatu w HTTP/3 to punkt, który warto przeczytać dwa razy. TLSOptions.VerifyCertificate miało w TsgcHTTP3Client domyślnie wartość True, sprawdzenie było wykonywane, a jego wynik następnie odrzucany, więc każdy klient HTTP/3 akceptował dowolny certyfikat od dowolnego urzędu wystawiony na dowolnego hosta. Teraz wynik sprawdzenia jest stosowany, co oznacza, że klient HTTP/3 rozmawiający z punktem końcowym o certyfikacie podpisanym samodzielnie przestaje się łączyć, dopóki magazyn zaufania albo certyfikat nie zostaną poprawione.

Klienty API giełd

Gotowe klienty giełdowe miały problem z ponownym łączeniem, który objawiał się jako dużo dziwniejszy problem. Prywatne subskrypcje, czyli kanały zleceń, sald i realizacji, nigdy nie były odtwarzane po ponownym połączeniu na Bitstamp, Coinbase, Deribit, Huobi, Kraken spot i futures, Kucoin, MEXC oraz ThreeCommas. Komponent raportował ponowne połączenie jako udane, podczas gdy te kanały po cichu znikały. Na BitMEX, Bitfinex, Crypto.com, Deribit i Kraken futures odtwarzanie działo się przed uwierzytelnieniem, co też nie może zadziałać. Ramki niosące krótko żyjące poświadczenie są teraz budowane na nowo ze świeżym poświadczeniem w chwili odtwarzania, zamiast być wysyłane ponownie w niezmienionej postaci.

Kwoty były zaokrąglane, zanim zostały podpisane. Stała maska ośmiu miejsc po przecinku zamieniała wielkość taką jak 0.000000004 w zero, a wartości mogły wychodzić w notacji naukowej albo z przecinkiem jako separatorem, zależnie od ustawień regionalnych systemu. Wartości są teraz zapisywane bezstratnie, w zwykłym zapisie dziesiętnym, z kropką, na Binance, Bybit, Cex, Cryptohopper, Kucoin, MEXC i ThreeCommas.

Nowości w tym samym obszarze: komponent Kraken WebSocket v2 obok wersji v1, klient Huobi, który wewnętrznie otwiera drugie połączenie, dzięki czemu jedna instancja obsługuje naraz dane publiczne i prywatne, UseServerTimeOffset na Binance dla hosta, którego zegar się rozjechał, oraz dwie opcje dławienia, PaceBatch i AsyncResubscribe, które nie pozwalają dużej subskrypcji przekroczyć limitu zapytań giełdy i przenoszą odtwarzanie po ponownym połączeniu do wątku roboczego w tle.

sgcWebSockets .NET 2026.9.0

Biblioteka .NET podąża za wersją Delphi. OnQueueDrained i PendingCount pojawiają się w tym samym znaczeniu, wraz z Throttle.AsyncResubscribe, AllowUnsignedWebhooks w kliencie Cryptohopper oraz nowym zdarzeniem OnBinanceUserStreamSubscribed, dzięki czemu gotowości strumienia danych użytkownika nie trzeba już wykrywać, odpytując właściwość.

Każda wymieniona wyżej poprawka ponownego łączenia i podpisywania na giełdach dotyczy również tej biblioteki, podobnie jak usunięcia. Protokół AppRTC, API RTCMultiConnection i klasy awaryjnego trybu Flash zniknęły, co zmienia numerację TwsTransport. Kod, który zapisywał albo przesyłał liczbową wartość transportu, wymaga przejrzenia.

Dwa wycieki warte wymienienia: komponent API WebSocket zwolniony, gdy jego klient był wciąż połączony, nigdy nie usuwał się z listy, po której przechodzi obsługa komunikatów, a dla każdego niszczonego komponentu wyciekały dwa wątki timera pulsu, przez co czyste zamknięcie czasami kończyło się błędem.

sgcSign 2026.9.0

Większość tego wydania powstała z próśb klientów i trafia w trzy obszary: wiedzę o tym, którym certyfikatem zaraz podpiszesz, budowanie podpisu, który walidator zaakceptuje jeszcze za dziesięć lat, oraz weryfikowanie podpisu względem czegoś innego niż on sam.

Listy certyfikatów, z których można wybierać

Wyliczanie certyfikatów zwracało dotąd nazwy wyświetlane, co wystarcza do wypełnienia listy rozwijanej, a nie wystarcza do podjęcia decyzji. Dwie karty od tego samego urzędu, wystawione tej samej osobie, wyglądają na takiej liście identycznie. Wyliczanie niesie teraz odcisk SHA-1, identyfikator podatkowy, numer seryjny, wystawcę i daty ważności, tak samo dla magazynu certyfikatów Windows, tokena PKCS#11 i pliku PFX.

uses
  sgcSign_KeyProvider_WinCertStore, sgcSign_X509, sgcSign_Types;

var
  oProvider: TsgcWindowsCertStoreProvider;
  oList: TsgcX509CertificateList;
  i: Integer;
begin
  oProvider := TsgcWindowsCertStoreProvider.Create(nil);
  Try
    // only certificates that are still valid and hold a private key
    oList := oProvider.EnumerateCertificateList([cfNotExpired, cfPrivateKey]);
    Try
      for i := 0 to oList.Count - 1 do
        Memo1.Lines.Add(Format('%s | %s | %s .. %s | %s',
          [oList[i].Subject, oList[i].SerialNumber,
           DateToStr(oList[i].NotBefore), DateToStr(oList[i].NotAfter),
           oList[i].Thumbprint]));

      // and sign with exactly the one that was chosen
      oProvider.SelectCertificateByThumbprint(oList[0].Thumbprint);
    Finally
      oList.Free;
    End;
  Finally
    oProvider.Free;
  End;
end;

Wieloslotową kartę PKCS#11, typową dla polskich kart do podpisu kwalifikowanego, które umieszczają osobne certyfikaty za osobnymi kodami PIN, można teraz zinwentaryzować zupełnie bez kodu PIN. EnumerateCertificateListAllSlots czyta każdy slot, a każdy wpis zapisuje, skąd pochodzi, natomiast TokenSlotCount podaje, ile slotów rzeczywiście zawiera token.

Same certyfikaty również raportują wszystko, co niosą, zamiast siedmiu atrybutów, które parser rozpoznawał wcześniej, z adresem pocztowym rozłożonym na czytelne wiersze i dowolnym atrybutem dostępnym po jego OID.

Podpisy, które pozostają sprawdzalne

PAdES zyskuje dwa profile. spPAdESBasicT podpisuje z osadzonym znacznikiem czasu i bez danych o unieważnieniu, a spPAdESDocumentArchive dokłada archiwalny znacznik czasu na profilu długoterminowym, obejmując cały dokument wraz z jego danymi o unieważnieniu, dzięki czemu plik pozostaje sprawdzalny po upływie okna ważności pierwszego znacznika czasu.

Znalezienie certyfikatu wystawcy było dotąd Twoim problemem, ponieważ większość kart do podpisu kwalifikowanego niesie wyłącznie Twój własny certyfikat. Nowe wywołania GetIssuerCertificate i GetCertificateChain odnajdują certyfikat, który wystawił ten, którym podpisujesz, oraz całą ścieżkę powyżej, dopasowując kryptograficznie, a nie po nazwie, więc urząd, który zmienił klucz podpisujący, nie jest mylony ze swoim poprzednikiem. IssuerLookup decyduje, gdzie szukać: domyślnie w magazynie certyfikatów Windows, w plikach PEM lub DER, które sam dostarczasz, albo pod adresem zapisanym w certyfikacie, co jest domyślnie wyłączone.

Żądania znacznika czasu można teraz podpisywać, czego wymagają niektóre urzędy kwalifikowane, w szczególności polskie. Ustaw RequestFormat na trfCMS, przypisz dostawcę klucza, a OnBeforeSendRequest i OnAfterReceiveResponse przekażą Ci dokładne bajty wysłane i odebrane.

Weryfikacja z kotwicami zaufania

To zmiana, którą trzeba przeczytać uważnie. Do tej pory weryfikator brał certyfikat podpisujący z dokumentu, który sprawdzał, i potwierdzał, że ten klucz podpisał ten dokument, co dowodzi jedynie tego, że ten, kto napisał dokument, napisał też zawarty w nim podpis.

Nowe właściwości TrustedCertificates i TrustedCertificateStore mówią, którym korzeniom ufasz, a RequireTrustedChain, CheckKeyUsage i RequireCompleteRevocationCheck decydują o surowości wyniku. Kotwica jest dopasowywana po odcisku SHA-256 albo przez weryfikację jej własnym kluczem, nigdy po nazwie. Weryfikator bez kotwicy zwraca ten sam werdykt co wcześniej, ale raport ETSI TS 119 102-2 nie mówi już total-passed dla podpisu, który nigdy nie został powiązany z kotwicą, więc zapisane raporty wytworzone bez kotwicy wymagają ponownego wygenerowania.

Podpisywanie Authenticode może teraz osadzać dodatkowe certyfikaty, dokładnie to samo, co robi signtool /ac, dzięki czemu podpis sterownika trybu jądra może prowadzić do Microsoft Code Verification Root przez swój certyfikat krzyżowy.

Jeden transport HTTP, z obsługą proxy

Każde żądanie wykonywane przez bibliotekę przechodzi teraz przez jeden transport ze wspólną właściwością HTTPOptions: klient znaczników czasu, klienci OCSP i list unieważnień, pobieranie unijnej listy zaufania oraz chmurowi dostawcy kluczy. Niesie on ustawienia proxy, którym może być proxy systemowe, brak proxy, jawny adres albo to, które maszyna rozwiązuje osobno dla każdego adresu, poświadczenia dla proxy, które o nie prosi, certyfikat klienta, najniższą akceptowaną wersję TLS oraz user agent. Każde ustawienie domyślnie odpowiada temu, co te żądania robiły wcześniej, a nowe zdarzenie OnHTTPRequest w całości zastępuje transport dla bramy, której te ustawienia nie potrafią opisać.

Serwer podpisujący

Klucze API i użytkownicy, którzy je tworzą, są teraz izolowani w obrębie projektu, więc administrator projektu zarządza kluczami we własnym projekcie, nie widząc cudzych. Klucze można włączać i wyłączać, a nie tylko jednorazowo unieważniać, ich limit zapytań i dzienny przydział można edytować po utworzeniu, a dziennik audytu można wreszcie filtrować po adresie klienta, zarówno w konsoli, jak i w eksporcie CSV.

Podpis Authenticode może teraz nieść więcej niż dwa zagnieżdżone podpisy, każdy z innym certyfikatem, czego wymaga dostarczanie jednego pliku podpisanego wygasającym certyfikatem i jego następcą. Można podpisywać pliki katalogów Windows, a nowy punkt końcowy /api/v1/sign/raw podpisuje skrót, który już obliczyłeś, i zwraca wyłącznie wartość podpisu, czyli dokładnie to, o co prosi signtool przez swoje wywołanie zwrotne /dlib. Ponieważ podpisze dowolny przekazany mu skrót, jest domyślnie wyłączony i włącza się go osobno dla każdego dostawcy.

Kilka domyślnych ustawień serwera zmieniło się nie bez powodu. Ustawienie server.listen naprawdę wiąże teraz podany adres, działania administracyjne wymagają wysłania formularza z jednorazowym tokenem, a dostarczenia webhooków przez HTTPS sprawdzają certyfikat adresu, na który są wysyłane. Wszystkie trzy są w uwagach dotyczących aktualizacji.

sgcIndy 2026.9.0

Niewielkie wydanie, a każda pozycja w nim to poprawka warta uwagi.

Nazwa protokołu uzgodniona przez ALPN była zapisywana czterema bajtami do pojedynczego bajtu, który OpenSSL przeznacza na jej długość, więc każdy handshake, który wynegocjował protokół, nadpisywał sąsiadującą pamięć. Serwer TLS na silniku IOCP lub EPOLL zużywał cały czas procesora jednego wątku, gdy druga strona prosiła o renegocjację, ponawiając zapis w kółko zamiast wysłać to, co OpenSSL już przygotował. W systemie Linux aplikacja TLS była zamykana przez system operacyjny, gdy druga strona resetowała połączenie w trakcie zapisu, ponieważ OpenSSL zapisuje w sposób, który nie pozwala poprosić systemu o wyciszenie sygnału przerwanego potoku. Ten sam problem pod FPC i Lazarusem również jest naprawiony, łącznie z połączeniami przyjętymi przez serwer na macOS, które wciąż były narażone.

W zestawie Community wstępnie skompilowane binaria dla Delphi 13 powstawały z projektów Delphi 12, więc niosły nazwy z numerem 290 zamiast nazw z numerem 370, których oczekuje instalator Delphi 13, a Windows ARM64EC nie było budowane w ogóle. Delphi 13 buduje teraz własne projekty dla każdej obsługiwanej platformy.

sgcOpenAPI 2026.9.0

Parser przestał zawodzić po cichu. Każdy dokument wraca teraz z listą Warnings, zawierającą brakujący element openapi lub info, element o niewłaściwym typie JSON, operację, której nie udało się wygenerować, nierozwiązane odwołanie do elementu ścieżki oraz każde słowo kluczowe JSON Schema, które jest odczytywane, ale jeszcze nieuwzględniane.

uses
  sgcOpenAPI_Classes, sgcOpenAPI_Parser_Client_Pascal;

var
  oParser: TsgcOpenAPI_Parser_Client_Pascal;
  i: Integer;
begin
  oParser := TsgcOpenAPI_Parser_Client_Pascal.Create;
  Try
    oParser.OpenAPIClassName := 'TPetStoreClient';
    oParser.OutputFileName := 'PetStoreClient.pas';

    oParser.ReadFromFile('petstore.json');

    for i := 0 to oParser.Warnings.Count - 1 do
      Memo1.Lines.Add('warning: ' + oParser.Warnings[i]);

    oParser.SaveToFile('PetStoreClient.pas');
  Finally
    oParser.Free;
  End;
end;

Wie też, którą wersję specyfikacji czyta, więc dokument 3.0 i dokument 3.1 nie są już traktowane tak samo, a oczywistym przypadkiem są exclusiveMinimum i exclusiveMaximum. Obsługiwane są webhooki OpenAPI 3.1, jsonSchemaDialect, components.pathItems, identyfikator licencji, schemat zabezpieczeń mutualTLS, typ zadeklarowany jako tablica, na przykład ["string","null"], oraz schemat zadeklarowany jako wartość logiczna, a także operacja query z OpenAPI 3.2 i mapa additionalOperations.

Generowanie stało się lepsze tam, gdzie wcześniej się poddawało. Osadzony schemat obiektu generuje teraz własną klasę, zamiast degradować się do łańcucha znaków, items jest czytane jako pełny schemat, a wygenerowany klient obsługuje parametry cookie i pełne reguły serializacji parametrów: matrix, label, simple, form, spaceDelimited, pipeDelimited i deepObject, wraz z explode i allowReserved.

Wiersz poleceń jest wreszcie użyteczny w skrypcie budowania. Ustawia kod wyjścia, 0 przy powodzeniu i od 1 do 7 dla poszczególnych rodzajów błędów, a błędy zawsze trafiają na standardowe wyjście błędów. Nowy przełącznik -r konwertuje dokument YAML lub Swagger 2.0 przez publiczny konwerter, domyślnie wyłączony.

Te same ulepszenia OpenAPI trafiają do sgcWebSockets, gdzie walidator po stronie serwera sprawdza teraz również parametry nagłówków i ciasteczek, za pomocą ValidateHeaderParams, ValidateCookieParams i EnforceRequired.

Zanim zaktualizujesz

Tym razem każdy produkt ma zmiany niezgodne wstecz. Oto te, które najprawdopodobniej Cię dotyczą.

Pełna lista, z uzasadnieniem każdej pozycji, znajduje się w dzienniku zmian każdego produktu.

Gdzie to pobrać

Wydanie 2026.9.0 jest już dostępne, z pełnym kodem źródłowym i rokiem aktualizacji, dla Delphi 7 do Delphi 13 Florence, odpowiadających wersji C++ Builder oraz .NET.

sgcWebSockets · sgcWebRTC · sgcCrypto · sgcHTML · sgcSign · sgcIndy · sgcOpenAPI

Pobierz wersję próbną · Dziennik zmian

Masz pytania lub uwagi? Skontaktuj się z nami, odpowiedź otrzymasz od osób, które napisały ten kod.