2026.9.0 is uit voor alle producten tegelijk: sgcWebSockets, sgcWebSockets .NET, sgcSign, sgcIndy en sgcOpenAPI. Het is de grootste release van het jaar. Twee volledig nieuwe pakketten komen erbij in sgcWebSockets, de serverengines zijn herzien rond een probleem dat al lange tijd verzoeken verloor, en de handtekeningbibliotheek heeft geleerd een handtekening te verifiëren tegen iets anders dan zichzelf.
Dit bericht loopt langs wat er in elk product toe doet, met de Delphi-code waar die helpt. Alles staat in de changelog, en de onderdelen die bestaand gedrag veranderen zijn achteraan verzameld zodat u ze kunt lezen voordat u upgradet.
De hele release in minder dan vier minuten. Ook op YouTube.
| Product | Nieuw | Opgelost | Breaking |
|---|---|---|---|
| sgcWebSockets | 25 | 56 | 22 |
| sgcSign | 25 | 70 | 21 |
| sgcOpenAPI | 9 | 25 | 5 |
| sgcWebSockets .NET | 5 | 24 | 10 |
| sgcIndy | 0 | 5 | 0 |
sgcWebSockets 2026.9.0
sgcWebRTC, een native WebRTC-media-engine
Het nieuwe sgcWebRTC-pakket maakt van TsgcRTCPeerConnection een volwaardig WebRTC-eindpunt. Audio- en videogesprekken, schermdeling en SCTP-datakanalen, alles in Pascal, zonder browser, zonder WebView-control en zonder externe mediabibliotheek. Het draait op Windows, Linux, macOS, iOS en Android, en de peer aan de andere kant mag een browser zijn, want de SDP die het produceert en verwerkt is de echte.
De uitwisseling van offer en answer volgt de W3C-vorm, dus CreateOffer, CreateAnswer, SetLocalDescription, SetRemoteDescription en AddIceCandidate doen wat hun namen zeggen. U vervoert de SDP over het signalleringskanaal dat u al heeft, en dat kan een WebSocket-server zijn die met dezelfde bibliotheek is gebouwd.
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 werkt op dezelfde manier. AddTrack koppelt een Opus- of G.711-audiotrack, of een VP8-, H.264- of Motion JPEG-videotrack, SendPCM en SendVideoFrame duwen opgenomen media naar binnen, en OnAudio en OnVideoFrame geven u de gedecodeerde track van de andere kant.
De oude terugvalopties uit het browsertijdperk gingen de andere kant op. Ondersteuning voor het AppRTC-protocol en de RTCMultiConnection-API is verwijderd, en de Flash-fallback ook, die in 2020 het einde van zijn leven bereikte. Zie de upgradenotities aan het eind.
sgcCrypto, cryptografie zonder OpenSSL
Het tweede nieuwe pakket is sgcCrypto, een implementatie in pure Pascal van de primitieven waar de meeste toepassingen echt naar grijpen. AES en ChaCha20/XChaCha20-Poly1305 authenticated encryption, SHA-2 en SHA-3, Argon2, scrypt en HKDF voor wachtwoorden en sleutelafleiding, Ed25519, Ed448, X25519, X448 en secp256k1, RSA-sleutelgeneratie, generatie van X.509-certificaten en CSR's, en de post-quantumalgoritmen ML-KEM, ML-DSA en SLH-DSA.
Elke primitieve is een gewone functie. Er is geen contextobject om aan te maken, te configureren en vrij te geven, en geen DLL om naast het uitvoerbare bestand mee te leveren.
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;
Vijf complete sgcHTML-applicaties
sgcHTML krijgt er vier componenten en vijf demo's bij. De componenten zijn CameraScanner, een live camerapaneel dat barcodes en QR-codes leest met de scanner die in de browser is ingebouwd en dat altijd handmatige invoer als terugvaloptie biedt, plus NumPad, CommandPalette en EmptyState.
De vijf demo's zijn geen fragmenten. Elk ervan is een volledige applicatie met aanmelden, een database en afdrukbare rapporten, en ze staan onder Demos\60.HTML\01.RunTime: magazijnbeheer, kassasysteem, een rapportageportaal, een multi-tenant SaaS-controlevlak en de planning van buitendienst.
Er is ook een nieuw helponderwerp, Runtime vs Design-Time, met demo's die laten zien hoe u dezelfde pagina bouwt door componenten op een VCL-formulier te plaatsen in plaats van hem in code samen te stellen.
Het echte clientadres achter een reverse proxy
Een server achter nginx, Apache of een cloudloadbalancer ziet bij elke verbinding het adres van de proxy, wat betekent dat de blacklist, de whitelist, GeoIP en uw eigen regels allemaal naar de verkeerde client keken. De nieuwe ForwardedHeaders-instellingen op TsgcWebSocketFirewall halen het adres terug dat de proxy heeft doorgegeven.
Het ontwerp is bewust wantrouwig. Het adres in X-Forwarded-For of X-Real-IP wordt alleen geloofd wanneer de verbinding zelf binnenkomt vanaf een adres dat in TrustedProxies staat, zodat een client er geen kan verzinnen, en de keten wordt van rechts gelezen, voorbij het aantal proxy's dat in TrustedHops is opgegeven, omdat de meest linkse waarde degene is die de client heeft aangeleverd. De resolutie draait bij elk verzoek, omdat een proxy één verbinding hergebruikt voor verzoeken van verschillende aanroepers.
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;
Zodra het is bepaald, is dat adres wat elke blacklistvermelding, elke eigen regel, elke gebeurtenis en uw eigen handlercode te zien krijgen. De instellingen gedragen zich op de http.sys-server hetzelfde als op de Indy-server, en dezelfde functie komt in de sgcSign Server beschikbaar als server.firewall.forwarded_headers.
Backpressure die u kunt meten
Naar een trage client schrijven sneller dan hij leest laat de uitgaande wachtrij groeien tot er iets bezwijkt. Er was geen manier om dat vanuit de applicatie te zien, dus eindigden relays met een stop-en-wacht-uitwisseling over de lijn, alleen om veilig te blijven.
Twee toevoegingen vervangen dat. PendingCount op TsgcWSConnection meldt hoeveel berichten er voor die verbinding nog in de wachtrij staan over de drie prioriteitsniveaus, en het uitlezen ervan alloceert niets, dus het kan gepold worden. OnQueueDrained vuurt wanneer de wachtrij van een verbinding overgaat van berichten bevatten naar leeg zijn, op de verbindingsthread, meteen na het leeglopen en vóór de volgende lees, zodat er zonder enige vertraging krediet kan worden uitgedeeld.
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;
Beide steken de DLL-grens over, dus de .NET-wrapper en elke andere host die sgcWebSockets.dll gebruikt krijgen ze ook. De nieuwe exports zijn achteraan toegevoegd, dus de bestaande exportvolgorde is ongewijzigd.
De EPOLL- en IOCP-engines
De highperformance-engines hadden een klasse defecten met één oorzaak: ze gingen ervan uit dat een verzoek in één socketlees binnenkomt. Dat klopt bij een loopbacktest en het klopt niet bij enige MTU-grens, over een VPN, of wanneer een grote body over meerdere pakketten wordt verdeeld.
Een verzoek dat niet volledig aankwam werd weggegooid met de verbinding gesloten en zonder antwoord, en een TLS-record dat over twee TCP-segmenten was verdeeld sloot de verbinding meteen. Beide zijn opgelost, en de nieuwe optie PartialRequestTimeout begrenst hoe lang de server op de rest wacht, op een aparte threadpool zodat een trage client de andere niet kan ophouden. Op de EPOLL-engine werden serververbindingen bovendien nooit vrijgegeven zodra de client sloot, dus OnDisconnect vuurde nooit en elke broadcast bleef naar een dode verbinding schrijven.
Dit is ook waarom WorkOpThreads van betekenis is veranderd. Het bindt een verbinding niet langer aan één thread, omdat een verbinding die op de rest van een verzoek wachtte elke andere verbinding op die thread ophield. Het stelt nu het kleinste aantal werkers in dat gereed wordt gehouden, en de pool groeit vanaf daar.
QUIC en HTTP/3
De QUIC- en HTTP/3-client en -server spreken nu IPv6. Een adres met een dubbele punt wordt als IPv6 behandeld, een URL kan het tussen vierkante haken meedragen, en een hostnaam wordt over beide families opgelost, waar eerder alleen IPv4 werd geprobeerd. De HTTP/3-listener zonder ingestelde host bedient beide families via één socket, en een nieuwe Host-eigenschap op HTTP3Options pint hem vast op één interface wanneer u dat nodig heeft.
De grotere verandering is dat HTTP/3-verzoeken nu hetzelfde pad volgen als HTTP/1.1-verzoeken. De OpenAPI-, MCP- en REST-API-servers, het doorsturen van verzoeken, CORS, multi-tenancy en metrics antwoordden helemaal nooit over HTTP/3, omdat dat transport een eigen pad had. Ze werken nu allemaal.
Certificaatverificatie op HTTP/3 is het punt om twee keer te lezen. TLSOptions.VerifyCertificate stond standaard op True bij TsgcHTTP3Client, de controle werd uitgevoerd, en het resultaat werd vervolgens weggegooid, dus elke HTTP/3-client accepteerde elk certificaat van elke autoriteit, uitgegeven aan elke host. De controle wordt nu toegepast, wat betekent dat een HTTP/3-client die met een zelfondertekend eindpunt praat stopt met verbinden totdat de trust store of het certificaat in orde is gebracht.
De exchange-API-clients
De kant-en-klare exchangeclients hadden een reconnectprobleem dat zich als een veel vreemder probleem liet aanzien. Privéabonnementen, de order-, saldo- en fill-feeds, werden na een reconnect nooit opnieuw afgespeeld op Bitstamp, Coinbase, Deribit, Huobi, Kraken spot en futures, Kucoin, MEXC en ThreeCommas. Het component meldde de reconnect als geslaagd terwijl die feeds stilletjes weg waren. Op BitMEX, Bitfinex, Crypto.com, Deribit en Kraken futures liep het opnieuw afspelen vóór de authenticatie, wat ook niet kan werken. Frames met een kortlevende credential worden nu bij het opnieuw afspelen met een verse credential opgebouwd in plaats van opnieuw verstuurd.
Geld werd afgerond voordat het werd ondertekend. Een vast masker van acht decimalen maakte van een omvang als 0.000000004 een nul, en waarden konden in wetenschappelijke notatie of met een komma als scheidingsteken naar buiten gaan, afhankelijk van de systeemlocale. Waarden worden nu verliesvrij geschreven, in gewone decimalen, met een punt, op Binance, Bybit, Cex, Cryptohopper, Kucoin, MEXC en ThreeCommas.
Nieuw op hetzelfde vlak: een Kraken WebSocket v2-component naast die voor v1, een Huobi-client die intern een tweede verbinding opent zodat één instantie tegelijk publieke en private data bedient, UseServerTimeOffset op Binance voor een host waarvan de klok is afgedreven, en twee throttle-opties, PaceBatch en AsyncResubscribe, die voorkomen dat een groot aantal abonnementen tegen de rate limit van de exchange aanloopt en die het opnieuw afspelen bij een reconnect naar een achtergrondwerker verplaatsen.
sgcWebSockets .NET 2026.9.0
De .NET-bibliotheek volgt de Delphi-versie. OnQueueDrained en PendingCount komen met dezelfde betekenis, samen met Throttle.AsyncResubscribe, AllowUnsignedWebhooks op de Cryptohopper-client, en een nieuwe gebeurtenis OnBinanceUserStreamSubscribed, zodat de gereedheid van de user data stream niet langer via het pollen van een eigenschap ontdekt hoeft te worden.
Elke reconnect- en ondertekeningsfix die hierboven staat geldt hier ook, en de verwijderingen evenzeer. Het AppRTC-protocol, de RTCMultiConnection-API en de Flash-fallbackklassen zijn weg, wat TwsTransport hernummert. Code die de numerieke transportwaarde bewaarde of doorgaf moet worden nagelopen.
Twee lekken die het noemen waard zijn: een WebSocket-API-component die werd vrijgegeven terwijl zijn client nog verbonden was verwijderde zichzelf nooit uit de lijst die de berichtenhandler doorloopt, en er lekten twee heartbeat-timerthreads voor elk vernietigd component, wat de reden is dat een nette afsluiting af en toe een fout gaf.
sgcSign 2026.9.0
Het grootste deel van deze release komt voort uit verzoeken van klanten, en het landt op drie vlakken: weten met welk certificaat u op het punt staat te ondertekenen, een handtekening bouwen die een validator over tien jaar nog accepteert, en een handtekening verifiëren tegen iets anders dan zichzelf.
Certificaatlijsten waaruit u kunt kiezen
Certificaten opsommen gaf vroeger weergavenamen terug, wat genoeg is om een keuzelijst te vullen en niet genoeg om een beslissing te nemen. Twee kaarten van dezelfde autoriteit, uitgegeven aan dezelfde persoon, zien er in die lijst identiek uit. De opsomming draagt nu de SHA-1-vingerafdruk, het fiscale identificatienummer, het serienummer, de uitgever en de geldigheidsdata, op dezelfde manier voor de Windows-certificaatopslag, een PKCS#11-token en een PFX-bestand.
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;
Een PKCS#11-kaart met meerdere slots, gebruikelijk bij Poolse kaarten voor gekwalificeerde handtekeningen die aparte certificaten achter aparte pincodes zetten, kan nu zonder enige pincode geïnventariseerd worden. EnumerateCertificateListAllSlots leest elk slot, waarbij elke vermelding vastlegt waar die vandaan komt, en TokenSlotCount meldt hoeveel slots er daadwerkelijk een token bevatten.
Certificaten zelf melden ook alles wat ze bevatten in plaats van de zeven attributen die de parser vroeger herkende, met het postadres gedecodeerd naar leesbare regels, en elk attribuut bereikbaar via zijn OID.
Handtekeningen die controleerbaar blijven
PAdES krijgt er twee profielen bij. spPAdESBasicT ondertekent met een ingebedde tijdstempel en zonder intrekkingsgegevens, en spPAdESDocumentArchive voegt een archieftijdstempel toe bovenop het langetermijnprofiel, die het hele document dekt inclusief de intrekkingsgegevens, zodat het bestand controleerbaar blijft zodra het geldigheidsvenster van de eerste tijdstempel zelf is verstreken.
Het uitgevende certificaat vinden was vroeger uw probleem, want de meeste kaarten voor gekwalificeerde handtekeningen dragen alleen uw eigen certificaat. Nieuwe aanroepen GetIssuerCertificate en GetCertificateChain vinden het certificaat dat het certificaat waarmee u ondertekent heeft uitgegeven, en het hele pad daarboven, waarbij cryptografisch wordt gematcht in plaats van op naam, zodat een autoriteit die haar ondertekeningssleutel heeft gewijzigd niet met haar voorganger wordt verward. IssuerLookup bepaalt waar er gezocht wordt: standaard de Windows-certificaatopslag, PEM- of DER-bestanden die u meelevert, of het adres in het certificaat, dat standaard uit staat.
Tijdstempelverzoeken kunnen nu ondertekend worden, wat sommige gekwalificeerde autoriteiten vereisen, de Poolse in het bijzonder. Zet RequestFormat op trfCMS, wijs een key provider toe, en OnBeforeSendRequest en OnAfterReceiveResponse geven u precies de bytes die verstuurd en ontvangen zijn.
Verificatie met vertrouwensankers
Dit is de verandering om aandachtig te lezen. Tot nu toe haalde de verificatie het ondertekeningscertificaat uit het document dat het aan het controleren was en bevestigde dat die sleutel dat document had ondertekend, wat alleen bewijst dat wie het document schreef ook de handtekening erin schreef.
Nieuwe eigenschappen TrustedCertificates en TrustedCertificateStore geven aan welke roots u vertrouwt, en RequireTrustedChain, CheckKeyUsage en RequireCompleteRevocationCheck bepalen hoe streng de uitkomst is. Een anker wordt gematcht op SHA-256-vingerafdruk of door verificatie onder zijn eigen sleutel, nooit op naam. Een verificatie zonder anker geeft hetzelfde oordeel terug als voorheen, maar het ETSI TS 119 102-2-rapport zegt niet langer total-passed voor een handtekening die nooit aan een anker is geketend, dus opgeslagen rapporten die zonder anker zijn gemaakt moeten opnieuw gegenereerd worden.
Authenticode-ondertekening kan nu extra certificaten insluiten, hetzelfde wat signtool /ac doet, zodat de handtekening van een kernelmodus-driver via zijn cross-certificaat aan de Microsoft Code Verification Root kan ketenen.
Eén HTTP-transport, met proxy's
Elk verzoek dat de bibliotheek doet gaat nu door één transport met een gedeelde HTTPOptions-eigenschap: de tijdstempelclient, de OCSP- en intrekkingslijstclients, het downloaden van de EU-trustlijst en de cloud key providers. Het draagt de proxy mee, die de systeemproxy kan zijn, geen enkele, een expliciet adres of degene die de machine per adres oplost, de inloggegevens voor een proxy die erom vraagt, het clientcertificaat, de laagst aanvaarde TLS-versie en de user agent. Elke instelling valt standaard terug op wat die verzoeken eerder deden, en een nieuwe gebeurtenis OnHTTPRequest vervangt het transport volledig voor een gateway die deze instellingen niet kunnen beschrijven.
De ondertekeningsserver
API-sleutels en de gebruikers die ze aanmaken zijn nu per project geïsoleerd, zodat een projectbeheerder de sleutels in zijn eigen project beheert zonder die van anderen te zien. Sleutels kunnen in- en uitgeschakeld worden in plaats van alleen eenmalig ingetrokken, hun rate limit en dagquotum kunnen na het aanmaken bewerkt worden, en het auditlogboek kan eindelijk op clientadres gefilterd worden, zowel in de console als in de CSV-export.
Een Authenticode-handtekening kan nu meer dan twee geneste handtekeningen dragen met voor elk een ander certificaat, wat nodig is om één bestand uit te leveren dat is ondertekend door een verlopend certificaat en door zijn vervanger. Windows-catalogusbestanden kunnen ondertekend worden, en een nieuw eindpunt /api/v1/sign/raw ondertekent een digest die u al heeft berekend en geeft alleen de handtekeningwaarde terug, wat precies is wat signtool via zijn /dlib-callback vraagt. Omdat het elke digest ondertekent die het krijgt aangereikt, staat het standaard uit en wordt het per provider aangezet.
Verscheidene serverstandaarden zijn met goede reden veranderd. De instelling server.listen bindt nu daadwerkelijk het adres dat u hebt opgegeven, beheeracties vereisen een formulierpost met een eenmalig token, en webhookafleveringen over HTTPS controleren het certificaat van het adres waarnaar ze gestuurd worden. Alle drie staan in de upgradenotities.
sgcIndy 2026.9.0
Een kleine release, en elk item erin is een fix die het waard is.
De protocolnaam die via ALPN was afgesproken werd met vier bytes geschreven in de ene byte die OpenSSL voor de lengte bewaart, dus elke handshake die een protocol onderhandelde overschreef het geheugen ernaast. Een TLS-server op de IOCP- of EPOLL-engine gebruikte alle CPU van één thread wanneer de andere kant om heronderhandeling vroeg, waarbij hij de schrijfactie keer op keer opnieuw probeerde in plaats van te sturen wat OpenSSL al had klaargezet. Op Linux werd een TLS-applicatie door het besturingssysteem afgesloten wanneer de andere kant de verbinding tijdens een schrijfactie reset, omdat OpenSSL schrijft op een manier die het systeem niet kan vragen het broken pipe-signaal te onderdrukken. Hetzelfde probleem onder FPC en Lazarus is ook opgelost, inclusief de door de server geaccepteerde verbindingen op macOS, die nog steeds kwetsbaar waren.
Voor de Community-setup werden de voorgecompileerde Delphi 13-binaries uit de Delphi 12-projecten geproduceerd, dus droegen ze de 290-namen in plaats van de 370-namen die het Delphi 13-installatieprogramma verwacht, en Windows ARM64EC werd helemaal niet gebouwd. Delphi 13 bouwt nu zijn eigen projecten voor elk ondersteund platform.
sgcOpenAPI 2026.9.0
De parser is gestopt met stilletjes falen. Elk document komt nu terug met een Warnings-lijst met een ontbrekend openapi- of info-element, een element met het verkeerde JSON-type, een operatie die niet gegenereerd kon worden, een onopgeloste verwijzing naar een path item en elk JSON Schema-sleutelwoord dat wel wordt gelezen maar nog niet gehonoreerd.
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;
Hij weet ook welke versie van de specificatie hij leest, dus een 3.0-document en een 3.1-document worden niet langer als hetzelfde behandeld, waarbij exclusiveMinimum en exclusiveMaximum het voor de hand liggende geval zijn. OpenAPI 3.1-webhooks, jsonSchemaDialect, components.pathItems, de licentie-identificatie, het mutualTLS-beveiligingsschema, een type dat als array is gedeclareerd zoals ["string","null"] en een schema dat als boolean is gedeclareerd worden allemaal ondersteund, en de OpenAPI 3.2-queryoperatie en de additionalOperations-map ook.
Generatie is beter geworden op de plekken waar die het vroeger opgaf. Een inline objectschema genereert nu zijn eigen klasse in plaats van te vervallen tot een string, items wordt als een volledig schema gelezen, en de gegenereerde client ondersteunt cookieparameters en de volledige serialisatieregels voor parameters: matrix, label, simple, form, spaceDelimited, pipeDelimited en deepObject, met explode en allowReserved.
De opdrachtregel is eindelijk bruikbaar in een buildscript. Hij zet een exitcode, 0 bij succes en 1 tot 7 voor de verschillende fouten, en fouten gaan altijd naar standaardfout. Een nieuwe schakelaar -r converteert een YAML- of Swagger 2.0-document via de publieke converter, standaard uit.
Dezelfde OpenAPI-verbeteringen zitten in sgcWebSockets, waar de validator aan serverzijde nu ook header- en cookieparameters controleert, met ValidateHeaderParams, ValidateCookieParams en EnforceRequired.
Voordat u upgradet
Elk product heeft deze keer breaking changes. Dit zijn de changes die u het waarschijnlijkst raken.
- Verwijderd uit sgcWebSockets en .NET. AppRTC, RTCMultiConnection en de Flash-fallback zijn weg. Verwijder de
FallBack.Flash-regels uit elke.dfmdie ze bevat, anders geeft het formulier een fout dat de eigenschap niet bestaat, en let erop dat het rangnummer van elkTwsTransport-lid natrpFlashmet één is opgeschoven. WorkOpRoundRobinis weg enWorkOpThreadsbindt een verbinding niet langer aan een thread. Van alles wat per thread werd bewaard, zoals een databaseverbinding of een thread-local cache, kan niet langer worden aangenomen dat het een verbinding volgt.- Certificaatverificatie wordt nu afgedwongen waar dat niet gebeurde. Op de OpenSSL-backend bindt
TLSOptions.VerifyCertificatehet certificaat aan de host, zoals SChannel en Apple al deden. Op HTTP/3 wordt het resultaat van de controle niet langer weggegooid.DTLSOptions.VerifyCertificatedwingt nu zijn resultaat af, enDTLSOptions.RootCertFileis de trust store in plaats van het eigen certificaat van dit eindpunt, dat inCertFilethuishoort. WriteTimeoutop de clients staat standaard op 60 seconden in plaats van geen limiet, en het geldt nu ook op Linux, macOS, iOS en Android, waar het eerder alleen op Windows effect had. Zet het negatief om nooit te verlopen.- Retries zijn beperkter. Alleen GET, HEAD en OPTIONS worden standaard opnieuw geprobeerd, omdat een POST die de server al had uitgevoerd twee keer verstuurd kon worden en een tweede order kon plaatsen. Voeg POST toe aan
RetryOptions.Methodsals u op het oude gedrag vertrouwde. - sgcSign heeft één enkele
TsgcX509Certificate. De bibliotheek declareerde drie klassen onder die naam. Code die certificaten opsomt heeftsgcSign_X509in zijn uses-clausule nodig, en de bijbehorende.hpp-include in C++ Builder. - ASiC-E CAdES-containers die door eerdere versies zijn gebouwd bevatten geen cryptografische koppeling met de documenten erin, omdat elke digest in het manifest als een leeg element werd geschreven. Reeds uitgegeven containers zouden opnieuw uitgegeven moeten worden, en aanroepers die ASiC-E produceren moeten overstappen op de nieuwe
BuildCAdES-overload die een ondertekeningscallback aanneemt. - Inloggegevens die in de Object Inspector zijn ingetypt worden niet langer in de
.dfmgeschreven. Veertien eigenschappen verspreid over elf sgcSign-units, waaronder de AWS-geheime sleutel, de JSON van het Google Cloud-serviceaccount en de PKCS#11-pincode, zijn nu als niet opgeslagen gemarkeerd. Ze blijven vanuit code toewijsbaar, en een bestaande.dfmlaadt nog steeds, maar de waarde verdwijnt de volgende keer dat het formulier wordt opgeslagen. - De sgcSign Server bindt
server.listennu echt. Een deployment die voor 127.0.0.1 was geconfigureerd maar in feite vanaf het hele netwerk bereikbaar was wordt onbereikbaar, en dat is wat de configuratie vroeg. - Gegenereerde OpenAPI-clients verifiëren het servercertificaat. Zet
TLSOptions.VerifyCertificateop False voor een zelfondertekend eindpunt. De request body is nu UTF-8, een lege string serialiseert als"field": "", en een response geeft een door de aanroeper aangeleverdeResponseStreamniet langer vrij.
De volledige lijst, met de reden voor elk punt, staat in de changelog van elk product.
Verkrijgbaarheid
Release 2026.9.0 is nu beschikbaar, met volledige broncode en een jaar updates, voor Delphi 7 tot en met Delphi 13 Florence, de bijbehorende C++ Builder-versies, en .NET.
sgcWebSockets · sgcWebRTC · sgcCrypto · sgcHTML · sgcSign · sgcIndy · sgcOpenAPI
Vragen of feedback? Neem contact op, u krijgt antwoord van de mensen die de code hebben geschreven.
