Release 2026.9.0: sgcWebSockets, sgcSign, sgcIndy e sgcOpenAPI

· Versioni
Release 2026.9.0 per le librerie di componenti eSeGeCe per Delphi, C++ Builder e .NET

La 2026.9.0 è disponibile per tutti i prodotti contemporaneamente: sgcWebSockets, sgcWebSockets .NET, sgcSign, sgcIndy e sgcOpenAPI. È la release più grande dell'anno. Due pacchetti completamente nuovi si aggiungono a sgcWebSockets, i motori server sono stati rielaborati attorno a un problema che da molto tempo faceva perdere richieste, e la libreria di firma ha imparato a verificare una firma rispetto a qualcosa di diverso da se stessa.

Questo articolo passa in rassegna ciò che conta in ogni prodotto, con il codice Delphi dove è utile. Tutto è nel changelog, e le parti che modificano il comportamento esistente sono raccolte verso la fine, così puoi leggerle prima di aggiornare.

Tutta la versione in meno di quattro minuti. Anche su YouTube.

ProdottoNovitàCorrezioniIncompatibilità
sgcWebSockets255622
sgcSign257021
sgcOpenAPI9255
sgcWebSockets .NET52410
sgcIndy050

sgcWebSockets 2026.9.0

sgcWebRTC, un motore multimediale WebRTC nativo

Il nuovo pacchetto sgcWebRTC trasforma TsgcRTCPeerConnection in un endpoint WebRTC completo. Chiamate audio e video, condivisione dello schermo e canali dati SCTP, tutto in Pascal, senza browser, senza controllo WebView e senza librerie multimediali esterne. Funziona su Windows, Linux, macOS, iOS e Android, e il peer dall'altra parte può essere un browser, perché l'SDP che produce e consuma è quello vero.

Lo scambio di offer e answer segue la forma definita dal W3C, quindi CreateOffer, CreateAnswer, SetLocalDescription, SetRemoteDescription e AddIceCandidate fanno quello che dice il loro nome. L'SDP viaggia sul canale di signalling che già usi, che può essere un server WebSocket costruito con la stessa libreria.

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;

I contenuti multimediali funzionano allo stesso modo. AddTrack collega una traccia audio Opus o G.711, oppure una traccia video VP8, H.264 o Motion JPEG, SendPCM e SendVideoFrame inviano i contenuti catturati, e OnAudio e OnVideoFrame ti consegnano la traccia remota decodificata.

I vecchi fallback dell'era dei browser hanno preso la direzione opposta. Il supporto per il protocollo AppRTC e per l'API RTCMultiConnection è stato rimosso, e così anche il fallback Flash, arrivato a fine vita nel 2020. Vedi le note di aggiornamento alla fine.

sgcCrypto, crittografia senza OpenSSL

Il secondo pacchetto nuovo è sgcCrypto, un'implementazione in puro Pascal delle primitive che le applicazioni usano davvero. Cifratura autenticata AES e ChaCha20/XChaCha20-Poly1305, SHA-2 e SHA-3, Argon2, scrypt e HKDF per password e derivazione di chiavi, Ed25519, Ed448, X25519, X448 e secp256k1, generazione di chiavi RSA, generazione di certificati X.509 e CSR, e gli algoritmi post-quantum ML-KEM, ML-DSA e SLH-DSA.

Ogni primitiva è una semplice funzione. Non c'è nessun oggetto di contesto da creare, configurare e liberare, e nessuna DLL da distribuire accanto all'eseguibile.

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;

Cinque applicazioni sgcHTML complete

sgcHTML guadagna quattro componenti e cinque demo. I componenti sono CameraScanner, un pannello con la fotocamera dal vivo che legge codici a barre e codici QR con lo scanner integrato nel browser e offre sempre un fallback con inserimento manuale, più NumPad, CommandPalette ed EmptyState.

Le cinque demo non sono frammenti di codice. Ognuna è un'applicazione intera con autenticazione, database e report stampabili, e si trovano sotto Demos\60.HTML\01.RunTime: gestione di magazzino, punto vendita, un portale di reportistica, un pannello di controllo SaaS multi-tenant e la gestione degli interventi tecnici.

C'è anche un nuovo argomento della guida, Runtime vs Design-Time, con demo che mostrano come costruire la stessa pagina trascinando i componenti su un form VCL invece di comporla nel codice.

L'indirizzo reale del client dietro un reverse proxy

Un server dietro nginx, Apache o un load balancer cloud vede l'indirizzo del proxy su ogni connessione, il che significa che la blacklist, la whitelist, GeoIP e le tue regole guardavano tutti il client sbagliato. Le nuove impostazioni ForwardedHeaders su TsgcWebSocketFirewall recuperano l'indirizzo inoltrato dal proxy.

Il progetto è volutamente diffidente. All'indirizzo contenuto in X-Forwarded-For o X-Real-IP si crede solo quando la connessione stessa arriva da un indirizzo elencato in TrustedProxies, così un client non può inventarsene uno, e la catena viene letta da destra, oltre il numero di proxy indicato in TrustedHops, perché la voce più a sinistra è quella fornita dal client. La risoluzione viene eseguita a ogni richiesta, dato che un proxy riutilizza una sola connessione per richieste provenienti da chiamanti diversi.

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;

Una volta risolto, quell'indirizzo è quello che vedono ogni voce della blacklist, ogni regola personalizzata, ogni evento e il codice dei tuoi handler. Le impostazioni si comportano allo stesso modo sul server http.sys e su quello Indy, e la stessa funzionalità arriva nel sgcSign Server come server.firewall.forwarded_headers.

Backpressure che puoi misurare

Scrivere verso un client lento più velocemente di quanto legga fa crescere la coda in uscita finché qualcosa cede. Non c'era modo di vederlo accadere dall'interno dell'applicazione, quindi i relay finivano per fare uno scambio stop and wait sulla rete solo per restare al sicuro.

Due aggiunte sostituiscono tutto questo. PendingCount su TsgcWSConnection riporta quanti messaggi sono ancora in coda per quella connessione sui tre livelli di priorità, e leggerlo non alloca nulla, quindi può essere interrogato di continuo. OnQueueDrained scatta quando la coda di una connessione passa dall'avere messaggi all'essere vuota, sul thread della connessione, subito dopo lo svuotamento e prima della lettura successiva, così un credito può essere concesso senza alcun ritardo.

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;

Entrambi attraversano il confine della DLL, quindi li ottengono anche il wrapper .NET e qualsiasi altro host che usa sgcWebSockets.dll. I nuovi export sono aggiunti in coda, quindi l'ordine degli export esistenti non cambia.

I motori EPOLL e IOCP

I motori ad alte prestazioni avevano una classe di difetti con un'unica causa: davano per scontato che una richiesta arrivasse in un'unica lettura del socket. È vero in un test su loopback ed è falso a qualsiasi limite di MTU, su una VPN, o ogni volta che un corpo di grandi dimensioni viene diviso su più pacchetti.

Una richiesta che non arrivava tutta insieme veniva scartata con la connessione chiusa e nessuna risposta, e un record TLS diviso su due segmenti TCP chiudeva la connessione senza appello. Entrambi i problemi sono risolti, e la nuova opzione PartialRequestTimeout limita quanto a lungo il server attende il resto, su un pool di thread separato, così un client lento non può bloccare gli altri. Sul motore EPOLL, inoltre, le connessioni del server non venivano mai rilasciate una volta che il client chiudeva, quindi OnDisconnect non scattava mai e ogni broadcast continuava a scrivere su una connessione morta.

È anche per questo che WorkOpThreads ha cambiato significato. Non lega più una connessione a un singolo thread, perché una connessione in attesa del resto di una richiesta bloccava tutte le altre connessioni su quel thread. Ora imposta il numero minimo di worker tenuti pronti, e il pool cresce da lì.

QUIC e HTTP/3

Il client e il server QUIC e HTTP/3 ora parlano IPv6. Un indirizzo che contiene i due punti viene trattato come IPv6, un URL può contenerlo tra parentesi quadre, e un nome host viene risolto su entrambe le famiglie, dove prima veniva provato solo IPv4. Il listener HTTP/3 senza host impostato serve entrambe le famiglie attraverso un solo socket, e una nuova proprietà Host su HTTP3Options lo vincola a una singola interfaccia quando serve.

Il cambiamento più importante è che le richieste HTTP/3 ora seguono lo stesso percorso delle richieste HTTP/1.1. I server API OpenAPI, MCP e REST, l'inoltro delle richieste, CORS, il multi-tenancy e le metriche non rispondevano affatto su HTTP/3, perché quel trasporto aveva un percorso tutto suo. Ora funzionano tutti.

La verifica dei certificati su HTTP/3 è il punto da leggere due volte. TLSOptions.VerifyCertificate era True per impostazione predefinita su TsgcHTTP3Client, il controllo veniva eseguito e il risultato veniva poi buttato via, quindi ogni client HTTP/3 accettava qualsiasi certificato di qualsiasi autorità emesso per qualsiasi host. Ora il controllo viene applicato, il che significa che un client HTTP/3 che dialoga con un endpoint self signed smette di connettersi finché non vengono sistemati il trust store o il certificato.

I client delle API degli exchange

I client pronti all'uso per gli exchange avevano un problema di riconnessione che si manifestava come un problema molto più strano. Le sottoscrizioni private, i feed di ordini, saldi ed esecuzioni, non venivano mai ripristinate dopo una riconnessione su Bitstamp, Coinbase, Deribit, Huobi, Kraken spot e futures, Kucoin, MEXC e ThreeCommas. Il componente segnalava la riconnessione come riuscita mentre quei feed erano spariti in silenzio. Su BitMEX, Bitfinex, Crypto.com, Deribit e Kraken futures il ripristino veniva eseguito prima dell'autenticazione, cosa che non può funzionare nemmeno. I frame che portano una credenziale a vita breve ora vengono ricostruiti con una credenziale nuova al momento del ripristino, invece di essere reinviati così com'erano.

Gli importi venivano arrotondati prima di essere firmati. Una maschera fissa a otto decimali trasformava una dimensione come 0.000000004 in zero, e i valori potevano uscire in notazione scientifica o con la virgola come separatore a seconda del locale di sistema. I valori ora vengono scritti senza perdite, in decimale semplice, con il punto, su Binance, Bybit, Cex, Cryptohopper, Kucoin, MEXC e ThreeCommas.

Novità nella stessa area: un componente Kraken WebSocket v2 accanto a quello v1, un client Huobi che apre internamente una seconda connessione così una sola istanza serve dati pubblici e privati insieme, UseServerTimeOffset su Binance per una macchina il cui orologio è andato alla deriva, e due opzioni di throttling, PaceBatch e AsyncResubscribe, che evitano che una sottoscrizione di grandi dimensioni faccia scattare il rate limit dell'exchange e spostano il ripristino dopo la riconnessione su un worker in background.

sgcWebSockets .NET 2026.9.0

La libreria .NET segue quella Delphi. OnQueueDrained e PendingCount arrivano con lo stesso significato, insieme a Throttle.AsyncResubscribe, AllowUnsignedWebhooks sul client Cryptohopper, e un nuovo evento OnBinanceUserStreamSubscribed, così la disponibilità dello stream dei dati utente non deve più essere scoperta interrogando una proprietà.

Ogni correzione sulla riconnessione e sulla firma elencata sopra vale anche qui, e lo stesso vale per le rimozioni. Il protocollo AppRTC, l'API RTCMultiConnection e le classi del fallback Flash sono spariti, cosa che rinumera TwsTransport. Il codice che salvava o trasmetteva il valore numerico del trasporto va rivisto.

Due perdite di memoria da citare: un componente WebSocket API liberato mentre il suo client era ancora connesso non si rimuoveva dalla lista che il gestore dei messaggi percorre, e due thread dei timer di heartbeat venivano persi per ogni componente distrutto, motivo per cui una chiusura pulita a volte andava in errore.

sgcSign 2026.9.0

La maggior parte di questa release nasce da richieste dei clienti, e riguarda tre aree: sapere con quale certificato stai per firmare, costruire una firma che un validatore accetterà ancora tra dieci anni, e verificare una firma rispetto a qualcosa di diverso da se stessa.

Elenchi di certificati tra cui puoi scegliere

L'enumerazione dei certificati restituiva i nomi visualizzati, che bastano per riempire una combo box e non bastano per prendere una decisione. Due card della stessa autorità, emesse alla stessa persona, appaiono identiche in quell'elenco. L'enumerazione ora porta con sé il thumbprint SHA-1, l'identificativo fiscale, il numero di serie, l'emittente e le date di validità, allo stesso modo per l'archivio certificati di Windows, un token PKCS#11 e un file 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;

Una card PKCS#11 multi-slot, comune tra le card polacche per la firma qualificata che mettono certificati distinti dietro PIN distinti, ora può essere inventariata senza alcun PIN. EnumerateCertificateListAllSlots legge ogni slot, e ogni voce registra da dove proviene, mentre TokenSlotCount riporta quanti slot contengono effettivamente un token.

Anche i certificati stessi ora riportano tutto ciò che contengono, invece dei sette attributi che il parser riconosceva prima, con l'indirizzo postale decodificato in righe leggibili e qualsiasi attributo raggiungibile tramite il suo OID.

Firme che restano verificabili

PAdES guadagna due profili. spPAdESBasicT firma con un timestamp incorporato e senza dati di revoca, e spPAdESDocumentArchive aggiunge un timestamp di archivio sopra il profilo a lungo termine, coprendo l'intero documento inclusi i suoi dati di revoca, così il file resta verificabile anche dopo che la finestra di validità del primo timestamp è scaduta.

Trovare il certificato emittente era un problema tuo, perché la maggior parte delle card per la firma qualificata porta solo il tuo certificato. Le nuove chiamate GetIssuerCertificate e GetCertificateChain trovano il certificato che ha emesso quello con cui stai firmando, e l'intero percorso sopra di esso, con una corrispondenza crittografica invece che per nome, così un'autorità che ha cambiato la propria chiave di firma non viene confusa con quella che l'ha preceduta. IssuerLookup decide dove cercare: l'archivio certificati di Windows per impostazione predefinita, i file PEM o DER che distribuisci, oppure l'indirizzo contenuto nel certificato, che è disattivato per impostazione predefinita.

Le richieste di timestamp ora possono essere firmate, cosa che alcune autorità qualificate richiedono, quelle polacche in particolare. Imposta RequestFormat su trfCMS, assegna un key provider, e OnBeforeSendRequest e OnAfterReceiveResponse ti consegnano i byte esatti inviati e ricevuti.

Verifica con ancore di fiducia

Questo è il cambiamento da leggere con attenzione. Fino a ora il verificatore prendeva il certificato di firma dal documento che stava controllando e confermava che quella chiave aveva firmato quel documento, il che dimostra solo che chi ha scritto il documento ha scritto anche la firma al suo interno.

Le nuove proprietà TrustedCertificates e TrustedCertificateStore indicano di quali root ti fidi, e RequireTrustedChain, CheckKeyUsage e RequireCompleteRevocationCheck decidono quanto è severo l'esito. Un'ancora viene riconosciuta tramite il thumbprint SHA-256 o verificandola sotto la sua stessa chiave, mai per nome. Un verificatore senza ancora restituisce lo stesso verdetto di prima, ma il report ETSI TS 119 102-2 non riporta più total-passed per una firma che non è mai stata concatenata a un'ancora, quindi i report archiviati prodotti senza ancora vanno rigenerati.

La firma Authenticode ora può incorporare certificati aggiuntivi, la stessa cosa che fa signtool /ac, così la firma di un driver in kernel-mode può concatenarsi alla Microsoft Code Verification Root attraverso il suo cross-certificate.

Un unico trasporto HTTP, con i proxy

Ogni richiesta che la libreria effettua passa ora attraverso un unico trasporto con una proprietà HTTPOptions condivisa: il client dei timestamp, i client OCSP e delle liste di revoca, il download della trust list europea e i cloud key provider. Porta con sé il proxy, che può essere quello di sistema, nessuno, un indirizzo esplicito o quello che la macchina risolve per ciascun indirizzo, le credenziali per un proxy che le richiede, il certificato client, la versione TLS minima accettata e lo user agent. Ogni impostazione ha come valore predefinito quello che quelle richieste facevano prima, e un nuovo evento OnHTTPRequest sostituisce completamente il trasporto per un gateway che queste impostazioni non riescono a descrivere.

Il server di firma

Le chiavi API e gli utenti che le creano sono ora isolati per progetto, così un amministratore di progetto gestisce le chiavi del proprio progetto senza vedere quelle degli altri. Le chiavi possono essere abilitate e disabilitate invece di essere solo revocate in modo definitivo, il loro rate limit e la quota giornaliera possono essere modificati dopo la creazione, e il registro di audit può finalmente essere filtrato per indirizzo del client, sia nella console sia nell'esportazione CSV.

Una firma Authenticode ora può portare più di due firme annidate con un certificato diverso per ciascuna, che è quello che serve per distribuire un unico file firmato da un certificato in scadenza e dal suo sostituto. I file catalogo di Windows possono essere firmati, e un nuovo endpoint /api/v1/sign/raw firma un digest che hai già calcolato e restituisce solo il valore della firma, che è esattamente quello che signtool chiede attraverso la sua callback /dlib. Dato che firma qualsiasi digest gli venga passato, è disattivato per impostazione predefinita e si abilita un provider alla volta.

Diversi valori predefiniti del server sono cambiati, per buoni motivi. L'impostazione server.listen ora vincola davvero l'indirizzo che le hai indicato, le azioni di amministrazione richiedono un post di form con un token monouso, e le consegne dei webhook su HTTPS verificano il certificato dell'indirizzo a cui vengono inviate. Tutte e tre sono nelle note di aggiornamento.

sgcIndy 2026.9.0

Una release piccola, e ogni voce al suo interno è una correzione che vale la pena avere.

Il nome del protocollo concordato tramite ALPN veniva scritto con quattro byte nel singolo byte che OpenSSL riserva alla sua lunghezza, quindi ogni handshake che negoziava un protocollo sovrascriveva la memoria adiacente. Un server TLS sul motore IOCP o EPOLL consumava tutta la CPU di un thread quando l'altra parte chiedeva di rinegoziare, riprovando la scrittura all'infinito invece di inviare quello che OpenSSL aveva già preparato. Su Linux, un'applicazione TLS veniva chiusa dal sistema operativo quando l'altra parte resettava la connessione durante una scrittura, perché OpenSSL scrive in un modo che non permette di chiedere al sistema di sopprimere il segnale di broken pipe. Lo stesso problema sotto FPC e Lazarus è risolto, comprese le connessioni accettate dal server su macOS, che erano ancora esposte.

Per il setup Community, i binari Delphi 13 precompilati erano stati prodotti dai progetti Delphi 12, quindi portavano i nomi 290 invece dei nomi 370 che l'installer di Delphi 13 si aspetta, e Windows ARM64EC non veniva compilato affatto. Delphi 13 ora compila i propri progetti per ogni piattaforma supportata.

sgcOpenAPI 2026.9.0

Il parser ha smesso di fallire in silenzio. Ogni documento ora torna con una lista Warnings che contiene un membro openapi o info mancante, un membro con il tipo JSON sbagliato, un'operazione che non è stato possibile generare, un riferimento a path item non risolto e qualsiasi parola chiave JSON Schema che viene letta ma non ancora rispettata.

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;

Sa anche quale versione della specifica sta leggendo, quindi un documento 3.0 e un documento 3.1 non vengono più trattati come la stessa cosa, con exclusiveMinimum ed exclusiveMaximum come caso più evidente. I webhook di OpenAPI 3.1, jsonSchemaDialect, components.pathItems, l'identificatore di licenza, lo schema di sicurezza mutualTLS, un tipo dichiarato come array tipo ["string","null"] e uno schema dichiarato come booleano sono tutti supportati, e lo sono anche l'operazione query di OpenAPI 3.2 e la mappa additionalOperations.

La generazione è migliorata proprio dove prima si arrendeva. Uno schema di oggetto inline ora genera una classe propria invece di degradare a stringa, items viene letto come uno schema completo, e il client generato supporta i parametri cookie e tutte le regole di serializzazione dei parametri: matrix, label, simple, form, spaceDelimited, pipeDelimited e deepObject, con explode e allowReserved.

La riga di comando è finalmente utilizzabile in uno script di build. Imposta un exit code, 0 in caso di successo e da 1 a 7 per i diversi errori, e gli errori vanno sempre sullo standard error. Un nuovo switch -r converte un documento YAML o Swagger 2.0 attraverso il convertitore pubblico, disattivato per impostazione predefinita.

Gli stessi miglioramenti OpenAPI arrivano dentro sgcWebSockets, dove il validatore lato server ora controlla anche i parametri header e cookie, con ValidateHeaderParams, ValidateCookieParams ed EnforceRequired.

Prima di aggiornare

Questa volta ogni prodotto ha modifiche incompatibili. Queste sono quelle che più probabilmente ti riguardano.

L'elenco completo, con la motivazione di ciascuna voce, è nel changelog di ogni prodotto.

Come ottenerla

La release 2026.9.0 è disponibile da subito, con il codice sorgente completo e un anno di aggiornamenti, per Delphi 7 fino a Delphi 13 Florence, le versioni corrispondenti di C++ Builder, e .NET.

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

Scarica la versione di prova · Changelog

Domande o commenti? Contattaci, riceverai una risposta dalle persone che hanno scritto il codice.