Versión 2026.9.0: sgcWebSockets, sgcSign, sgcIndy y sgcOpenAPI

· Versiones
Versión 2026.9.0 de las librerías de componentes de eSeGeCe para Delphi, C++ Builder y .NET

2026.9.0 ya está disponible para todos los productos a la vez: sgcWebSockets, sgcWebSockets .NET, sgcSign, sgcIndy y sgcOpenAPI. Es la versión más grande del año. Dos paquetes completamente nuevos se suman a sgcWebSockets, los motores del servidor se rediseñaron en torno a un problema que llevaba mucho tiempo perdiendo peticiones, y la librería de firma aprendió a verificar una firma contra algo que no fuera ella misma.

Este artículo repasa lo que importa en cada producto, con el código Delphi cuando ayuda. Todo está en el registro de cambios, y las partes que modifican el comportamiento existente están recogidas cerca del final para que puedas leerlas antes de actualizar.

Toda la versión en menos de cuatro minutos. También en YouTube.

ProductoNuevoCorreccionesCambios incompatibles
sgcWebSockets255622
sgcSign257021
sgcOpenAPI9255
sgcWebSockets .NET52410
sgcIndy050

sgcWebSockets 2026.9.0

sgcWebRTC, un motor de medios WebRTC nativo

El nuevo paquete sgcWebRTC convierte TsgcRTCPeerConnection en un endpoint WebRTC completo. Llamadas de audio y vídeo, compartición de pantalla y canales de datos SCTP, todo ello en Pascal, sin navegador, sin control WebView y sin librería de medios externa. Funciona en Windows, Linux, macOS, iOS y Android, y el par del otro extremo puede ser un navegador, porque el SDP que produce y consume es el de verdad.

El intercambio de oferta y respuesta sigue la forma del W3C, así que CreateOffer, CreateAnswer, SetLocalDescription, SetRemoteDescription y AddIceCandidate hacen lo que dicen sus nombres. El SDP lo transportas por el canal de señalización que ya tengas, que puede ser un servidor WebSocket construido con la misma librería.

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;

Los medios funcionan igual. AddTrack añade una pista de audio Opus o G.711, o una pista de vídeo VP8, H.264 o Motion JPEG, SendPCM y SendVideoFrame introducen los medios capturados, y OnAudio y OnVideoFrame te entregan la pista remota ya decodificada.

Los antiguos recursos de la era del navegador fueron en la dirección contraria. Se ha eliminado el soporte del protocolo AppRTC y de la API RTCMultiConnection, y también el respaldo por Flash, que llegó al final de su vida en 2020. Consulta las notas de actualización del final.

sgcCrypto, criptografía sin OpenSSL

El segundo paquete nuevo es sgcCrypto, una implementación en Pascal puro de las primitivas que la mayoría de las aplicaciones usan en la práctica. Cifrado autenticado AES y ChaCha20/XChaCha20-Poly1305, SHA-2 y SHA-3, Argon2, scrypt y HKDF para contraseñas y derivación de claves, Ed25519, Ed448, X25519, X448 y secp256k1, generación de claves RSA, generación de certificados X.509 y de CSR, y los algoritmos poscuánticos ML-KEM, ML-DSA y SLH-DSA.

Cada primitiva es una función normal. No hay objeto de contexto que crear, configurar y liberar, ni DLL que distribuir junto al ejecutable.

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;

Cinco aplicaciones sgcHTML completas

sgcHTML gana cuatro componentes y cinco demos. Los componentes son CameraScanner, un panel de cámara en vivo que lee códigos de barras y códigos QR con el escáner integrado en el navegador y siempre ofrece una alternativa de entrada manual, más NumPad, CommandPalette y EmptyState.

Las cinco demos no son fragmentos sueltos. Cada una es una aplicación entera con inicio de sesión, base de datos e informes imprimibles, y viven en Demos\60.HTML\01.RunTime: gestión de almacén, punto de venta, un portal de informes, un plano de control SaaS multiinquilino y despacho de servicio técnico.

También hay un nuevo tema de ayuda, Runtime vs Design-Time, con demos que muestran cómo construir la misma página soltando componentes en un formulario VCL en lugar de componerla por código.

La dirección real del cliente detrás de un proxy inverso

Un servidor detrás de nginx, Apache o un balanceador de carga en la nube ve la dirección del proxy en cada conexión, lo que significa que la lista negra, la lista blanca, GeoIP y tus propias reglas estaban mirando al cliente equivocado. Los nuevos ajustes ForwardedHeaders de TsgcWebSocketFirewall recuperan la dirección que el proxy reenvió.

El diseño es deliberadamente desconfiado. La dirección que viaja en X-Forwarded-For o X-Real-IP solo se cree cuando la propia conexión llega desde una dirección incluida en TrustedProxies, de modo que un cliente no puede inventarse una, y la cadena se lee desde la derecha, más allá del número de proxies indicado en TrustedHops, porque la entrada más a la izquierda es la que suministró el cliente. La resolución se ejecuta en cada petición, ya que un proxy reutiliza una misma conexión para peticiones de distintos clientes.

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 vez resuelta, esa dirección es la que ven todas las entradas de la lista negra, todas las reglas personalizadas, todos los eventos y tu propio código. Los ajustes se comportan igual en el servidor http.sys que en el de Indy, y la misma funcionalidad llega al servidor de sgcSign como server.firewall.forwarded_headers.

Contrapresión que puedes medir

Escribir a un cliente lento más rápido de lo que lee hace crecer la cola de salida hasta que algo cede. No había forma de ver eso desde dentro de la aplicación, así que los relés acababan haciendo un intercambio de parada y espera por el cable solo para ir sobre seguro.

Dos añadidos sustituyen a eso. PendingCount en TsgcWSConnection informa de cuántos mensajes siguen encolados para esa conexión en los tres niveles de prioridad, y leerlo no reserva memoria, así que se puede consultar de forma continua. OnQueueDrained se dispara cuando la cola de una conexión pasa de contener mensajes a estar vacía, en el hilo de la conexión, justo después del vaciado y antes de la siguiente lectura, de modo que se puede entregar un crédito sin ninguna demora.

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;

Ambos cruzan la frontera de la DLL, así que el wrapper de .NET y cualquier otro anfitrión que consuma sgcWebSockets.dll también los reciben. Las nuevas exportaciones se añaden al final, así que el orden de exportación existente no cambia.

Los motores EPOLL e IOCP

Los motores de alto rendimiento tenían toda una clase de defectos con una sola causa: daban por hecho que una petición llega en una única lectura del socket. Eso es cierto en una prueba por loopback y falso en cualquier límite de MTU, sobre una VPN, o siempre que un cuerpo grande se reparte entre varios paquetes.

Una petición que no llegaba entera se descartaba cerrando la conexión y sin respuesta, y un registro TLS repartido entre dos segmentos TCP cerraba la conexión directamente. Los dos casos están corregidos, y la nueva opción PartialRequestTimeout limita cuánto espera el servidor al resto, en un pool de hilos independiente para que un cliente lento no pueda retener a los demás. En el motor EPOLL, además, las conexiones del servidor nunca se liberaban una vez que el cliente cerraba, así que OnDisconnect nunca se disparaba y cada difusión seguía escribiendo en una conexión muerta.

Este es también el motivo por el que WorkOpThreads cambió de significado. Ya no fija una conexión a un hilo, porque una conexión que esperaba el resto de una petición retenía a todas las demás conexiones de ese hilo. Ahora establece el número mínimo de trabajadores que se mantienen listos, y el pool crece a partir de ahí.

QUIC y HTTP/3

El cliente y el servidor QUIC y HTTP/3 ya hablan IPv6. Una dirección que lleva dos puntos se trata como IPv6, una URL puede llevarla entre corchetes, y un nombre de host se resuelve en ambas familias, donde antes solo se intentaba IPv4. El listener HTTP/3 sin host configurado sirve las dos familias a través de un único socket, y una nueva propiedad Host en HTTP3Options lo fija a una sola interfaz cuando lo necesitas.

El cambio mayor es que las peticiones HTTP/3 siguen ahora el mismo camino que las peticiones HTTP/1.1. Los servidores de API OpenAPI, MCP y REST, el reenvío de peticiones, CORS, la multitenencia y las métricas nunca respondían por HTTP/3, porque ese transporte tenía un camino propio. Ahora todos funcionan.

La verificación de certificados en HTTP/3 es el punto que hay que leer dos veces. TLSOptions.VerifyCertificate valía True por defecto en TsgcHTTP3Client, la comprobación se realizaba, y luego el resultado se descartaba, así que cualquier cliente HTTP/3 aceptaba cualquier certificado de cualquier autoridad emitido para cualquier host. Ahora la comprobación se aplica, lo que significa que un cliente HTTP/3 que habla con un endpoint autofirmado deja de conectar hasta que se arregle el almacén de confianza o el certificado.

Los clientes de API de exchanges

Los clientes de exchange ya preparados tenían un problema de reconexión que se manifestaba como un problema mucho más raro. Las suscripciones privadas, los feeds de órdenes, saldos y ejecuciones, nunca se reproducían tras una reconexión en Bitstamp, Coinbase, Deribit, Huobi, Kraken spot y futuros, Kucoin, MEXC y ThreeCommas. El componente informaba de la reconexión como correcta mientras esos feeds habían desaparecido en silencio. En BitMEX, Bitfinex, Crypto.com, Deribit y Kraken futuros la reproducción se ejecutaba antes de la autenticación, lo que tampoco puede funcionar. Los frames que llevan una credencial de vida corta ahora se reconstruyen con una nueva en el momento de la reproducción, en lugar de reenviarse tal cual.

El dinero se redondeaba antes de firmarse. Una máscara fija de ocho decimales convertía un tamaño como 0.000000004 en cero, y los valores podían salir en notación científica o con coma como separador según la configuración regional del sistema. Ahora los valores se escriben sin pérdida, en decimal simple, con punto, en Binance, Bybit, Cex, Cryptohopper, Kucoin, MEXC y ThreeCommas.

Novedades en la misma área: un componente Kraken WebSocket v2 junto al de v1, un cliente Huobi que abre internamente una segunda conexión para que una sola instancia sirva datos públicos y privados a la vez, UseServerTimeOffset en Binance para un equipo cuyo reloj se ha desviado, y dos opciones de regulación, PaceBatch y AsyncResubscribe, que evitan que una suscripción grande dispare el límite de peticiones del exchange y trasladan la reproducción de la reconexión a un trabajador en segundo plano.

sgcWebSockets .NET 2026.9.0

La librería .NET sigue a la de Delphi. OnQueueDrained y PendingCount llegan con el mismo significado, junto con Throttle.AsyncResubscribe, AllowUnsignedWebhooks en el cliente de Cryptohopper, y un nuevo evento OnBinanceUserStreamSubscribed para que la disponibilidad del user data stream ya no tenga que descubrirse consultando una propiedad.

Todas las correcciones de reconexión y de firma de los exchanges que se enumeran arriba se aplican también aquí, y las eliminaciones igual. El protocolo AppRTC, la API RTCMultiConnection y las clases de respaldo por Flash han desaparecido, lo que renumera TwsTransport. El código que guardaba o transmitía el valor numérico del transporte hay que revisarlo.

Dos fugas que merece la pena nombrar: un componente de API WebSocket liberado mientras su cliente seguía conectado nunca se quitaba de la lista que recorre el manejador de mensajes, y dos hilos de temporizador de heartbeat se filtraban por cada componente destruido, que es la razón por la que un cierre limpio fallaba de vez en cuando.

sgcSign 2026.9.0

La mayor parte de esta versión salió de peticiones de clientes, y aterriza en tres áreas: saber con qué certificado vas a firmar, construir una firma que un validador siga aceptando dentro de diez años, y verificar una firma contra algo que no sea ella misma.

Listas de certificados entre las que puedes elegir

Enumerar certificados devolvía nombres para mostrar, que basta para rellenar un combo y no basta para tomar una decisión. Dos tarjetas de la misma autoridad, emitidas a la misma persona, se ven idénticas en esa lista. La enumeración lleva ahora la huella SHA-1, el identificador fiscal, el número de serie, el emisor y las fechas de validez, de la misma forma para el almacén de certificados de Windows, un token PKCS#11 y un archivo 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 tarjeta PKCS#11 de varios slots, habitual en las tarjetas polacas de firma cualificada que colocan certificados distintos tras PIN distintos, se puede inventariar ahora sin ningún PIN. EnumerateCertificateListAllSlots lee todos los slots, y cada entrada registra de dónde procede, y TokenSlotCount informa de cuántos slots contienen realmente un token.

Los propios certificados informan también de todo lo que llevan, en lugar de los siete atributos que el parser reconocía antes, con la dirección postal decodificada en líneas legibles, y cualquier atributo accesible por su OID.

Firmas que siguen siendo comprobables

PAdES gana dos perfiles. spPAdESBasicT firma con una marca de tiempo embebida y sin datos de revocación, y spPAdESDocumentArchive añade una marca de tiempo de archivo encima del perfil de largo plazo, cubriendo el documento entero incluidos sus datos de revocación, para que el archivo siga siendo comprobable una vez que haya pasado la ventana de validez de la primera marca de tiempo.

Encontrar el certificado emisor era antes tu problema, porque la mayoría de las tarjetas de firma cualificada llevan solo tu propio certificado. Las nuevas llamadas GetIssuerCertificate y GetCertificateChain encuentran el certificado que emitió aquel con el que estás firmando, y toda la ruta por encima de él, emparejando criptográficamente en lugar de por nombre, de modo que una autoridad que ha cambiado su clave de firma no se confunde con su predecesora. IssuerLookup decide dónde buscar: el almacén de certificados de Windows por defecto, archivos PEM o DER que distribuyas tú, o la dirección que va dentro del certificado, que está desactivada por defecto.

Las peticiones de marca de tiempo se pueden firmar ahora, cosa que exigen algunas autoridades cualificadas, las polacas en particular. Pon RequestFormat a trfCMS, asigna un proveedor de claves, y OnBeforeSendRequest y OnAfterReceiveResponse te entregan los bytes exactos enviados y recibidos.

Verificación con anclas de confianza

Este es el cambio que hay que leer con atención. Hasta ahora el verificador tomaba el certificado de firma del propio documento que estaba comprobando y confirmaba que esa clave había firmado ese documento, lo que solo demuestra que quien escribió el documento escribió también la firma que contiene.

Las nuevas propiedades TrustedCertificates y TrustedCertificateStore indican en qué raíces confías, y RequireTrustedChain, CheckKeyUsage y RequireCompleteRevocationCheck deciden cuán estricto es el resultado. Un ancla se empareja por huella SHA-256 o verificando bajo su propia clave, nunca por nombre. Un verificador sin ancla devuelve el veredicto que devolvía antes, pero el informe ETSI TS 119 102-2 ya no dice total-passed para una firma que nunca se encadenó a un ancla, así que los informes guardados que se produjeron sin ancla hay que regenerarlos.

La firma Authenticode puede incrustar ahora certificados adicionales, lo mismo que hace signtool /ac, de modo que la firma de un driver en modo kernel puede encadenarse hasta el Microsoft Code Verification Root a través de su certificado cruzado.

Un único transporte HTTP, con proxies

Todas las peticiones que hace la librería pasan ahora por un único transporte con una propiedad HTTPOptions compartida: el cliente de marcas de tiempo, los clientes de OCSP y de listas de revocación, la descarga de la lista de confianza de la UE y los proveedores de claves en la nube. Lleva el proxy, que puede ser el del sistema, ninguno, una dirección explícita o el que la máquina resuelve por dirección, las credenciales para un proxy que las pida, el certificado de cliente, la versión mínima de TLS aceptada y el user agent. Cada ajuste toma por defecto lo que esas peticiones hacían antes, y un nuevo evento OnHTTPRequest sustituye el transporte por completo para una pasarela que estos ajustes no puedan describir.

El servidor de firma

Las claves de API y los usuarios que las crean están ahora aislados por proyecto, así que un administrador de proyecto gestiona las claves de su propio proyecto sin ver las de nadie más. Las claves se pueden activar y desactivar, en lugar de solo revocarse sin vuelta atrás, su límite de peticiones y su cuota diaria se pueden editar después de crearlas, y el registro de auditoría por fin se puede filtrar por dirección de cliente, tanto en la consola como en la exportación a CSV.

Una firma Authenticode puede llevar ahora más de dos firmas anidadas con un certificado distinto para cada una, que es lo que hace falta para distribuir un mismo archivo firmado por un certificado que caduca y por su sustituto. Se pueden firmar archivos de catálogo de Windows, y un nuevo endpoint /api/v1/sign/raw firma un digest que ya has calculado y devuelve solo el valor de la firma, que es exactamente lo que pide signtool a través de su callback /dlib. Como firmará cualquier digest que se le entregue, viene desactivado por defecto y se activa proveedor a proveedor.

Varios valores por defecto del servidor cambiaron por un buen motivo. El ajuste server.listen enlaza ahora de verdad la dirección que le diste, las acciones de administración exigen un envío de formulario con un token de un solo uso, y las entregas de webhook sobre HTTPS comprueban el certificado de la dirección a la que se envían. Los tres están en las notas de actualización.

sgcIndy 2026.9.0

Una versión pequeña, y cada punto que trae es una corrección que merece la pena.

El nombre de protocolo acordado mediante ALPN se escribía con cuatro bytes en el único byte que OpenSSL reserva para su longitud, así que cada handshake que negociaba un protocolo sobrescribía la memoria contigua. Un servidor TLS sobre el motor IOCP o EPOLL consumía toda la CPU de un hilo cuando la otra parte pedía renegociar, reintentando la escritura una y otra vez en lugar de enviar lo que OpenSSL ya había preparado. En Linux, una aplicación TLS era cerrada por el sistema operativo cuando la otra parte reiniciaba la conexión durante una escritura, porque OpenSSL escribe de una forma que no puede pedir al sistema que suprima la señal de tubería rota. El mismo problema bajo FPC y Lazarus está corregido también, incluidas las conexiones aceptadas por el servidor en macOS, que seguían expuestas.

Para el instalador Community, los binarios precompilados de Delphi 13 se producían desde los proyectos de Delphi 12, así que llevaban los nombres 290 en lugar de los nombres 370 que espera el instalador de Delphi 13, y Windows ARM64EC no se compilaba en absoluto. Delphi 13 compila ahora sus propios proyectos para todas las plataformas soportadas.

sgcOpenAPI 2026.9.0

El parser dejó de fallar en silencio. Cada documento vuelve ahora con una lista Warnings que recoge un miembro openapi o info ausente, un miembro con el tipo JSON equivocado, una operación que no se pudo generar, una referencia a path item sin resolver y cualquier palabra clave de JSON Schema que se lee pero todavía no se respeta.

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;

También sabe qué versión de la especificación está leyendo, así que un documento 3.0 y un documento 3.1 ya no se tratan como lo mismo, siendo exclusiveMinimum y exclusiveMaximum el caso más evidente. Los webhooks de OpenAPI 3.1, jsonSchemaDialect, components.pathItems, el identificador de licencia, el esquema de seguridad mutualTLS, un tipo declarado como array tal que ["string","null"] y un esquema declarado como booleano están todos soportados, y también la operación query de OpenAPI 3.2 y el mapa additionalOperations.

La generación mejoró en los puntos donde antes se rendía. Un esquema de objeto en línea genera ahora su propia clase en lugar de degradar a una cadena, items se lee como un esquema completo, y el cliente generado soporta parámetros de cookie y todas las reglas de serialización de parámetros: matrix, label, simple, form, spaceDelimited, pipeDelimited y deepObject, con explode y allowReserved.

La línea de comandos por fin es utilizable en un script de compilación. Establece un código de salida, 0 si todo fue bien y de 1 a 7 para los distintos fallos, y los errores van siempre a la salida de error estándar. Un nuevo modificador -r convierte un documento YAML o Swagger 2.0 mediante el conversor público, desactivado por defecto.

Las mismas mejoras de OpenAPI se incluyen dentro de sgcWebSockets, donde el validador del lado del servidor comprueba ahora también los parámetros de cabecera y de cookie, con ValidateHeaderParams, ValidateCookieParams y EnforceRequired.

Antes de actualizar

Todos los productos traen cambios incompatibles esta vez. Estos son los que más probablemente te afecten.

La lista completa, con el motivo de cada punto, está en el registro de cambios de cada producto.

Cómo conseguirlo

La versión 2026.9.0 está disponible ya, con el código fuente completo y un año de actualizaciones, para Delphi 7 hasta Delphi 13 Florence, las versiones equivalentes de C++ Builder, y .NET.

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

Descargar la versión de prueba · Registro de cambios

¿Preguntas o comentarios? Ponte en contacto, recibirás respuesta de las personas que escribieron el código.