Agir maintenantpeut affecter un système en production
Les atomiques FPC ARM retrouvent leur ordre pendant la refonte des WebSockets HTTP.sys
Cette édition répare les barrières mémoire absentes des verrous mORMot sous FPC ARM et AArch64, où les données protégées pouvaient encore subir des courses malgré le mot de verrouillage. Sous Windows, la gestion des requêtes et WebSockets HTTP.sys est largement refondue puis stabilisée sur le cycle de vie, les E/S overlapped, l’envoi, l’arrêt et le ping. Les utilisateurs directs des wrappers HTTP.sys bas niveau et des index de connexion THttpApiWebSocketServerProtocol doivent migrer leur code.
En bref
- Les verrous FPC ARM et AArch64 appliquent désormais des barrières mémoire complètes ; l’ancien code pouvait perdre des mises à jour ou corrompre l’état partagé.
- Le moteur HTTP.sys traite les corps chunked sans limite, déconnecte les échecs laissant un corps non lu et isole l’état par requête.
- Les connexions WebSocket HTTP.sys utilisent maintenant des ID TLockedList, des structures overlapped séparées pour lecture/réveil et un arrêt protégé.
- THttpServerRequest.FullUrl devient RawUtf8, HttpApiRequest est supprimé et plusieurs signatures HTTP.sys bas niveau changent.
- optCleanMagicJson peut retirer JSON_BASE64_MAGIC des réponses SOA ; SetErrorText, HtmlEscapeShortVar et TLockedList.Find sont nouveaux.
- Adoptez le build 2.4.17497 ; ne restez pas sur les builds de transition HTTP.sys 2.4.17464 à 2.4.17496.
Conseil de mise à jour
Adoptez le build final 2.4.17497. Les déploiements FPC ARM/ARM64 doivent mettre à niveau pour la correction d’ordre mémoire et tester sous charge verrous, pools de threads et timers. Les déploiements Windows HTTP.sys/WebSocket doivent éviter les builds 2.4.17464–2.4.17496, migrer les symboles publics modifiés, puis tester uploads chunked, upgrades, send/close concurrents, déconnexions, arrêt et timeouts de ping.
32 sur 32 entrées · 35 commits upstream
1
Critique
ARM centralise la correction des barrières dans les wrappers atomiques
Le suivi définit des wrappers InterlockedIncrement/InterlockedDecrement avec barrières pour les cibles FPC weak-atomic, ajoute des entrées assembleur AArch64 et redirige verrous, compteurs async et références ECC vers ces primitives.
Correctifs
mormot.core.base+4
c1a131a8+158-133
core: huge refactoring on arm32/64 about atomic operations
Impact
C’est l’implémentation stabilisée de l’ordre mémoire FPC ARM32/ARM64. Elle protège l’état concurrent au-delà du mot de verrouillage, notamment pools de threads, timers et travail référencé.
Mise à jour recommandée
Les systèmes FPC ARM/ARM64 en production doivent passer à 2.4.17497 et rejouer les tests de concurrence et de durée de vie.
2
Critique
Les verrous FPC non-Intel deviennent des barrières mémoire complètes
FPC_WEAKATOMICS marque les cibles non-Intel, les chemins AArch64 LDXR/STLXR ajoutent l’ordre DMB et les autres CPU FPC entourent les atomiques RTL de barrières dans TLightLock, TRWLightLock, TRWLock, TMultiLightLock et TOSLightLock.
Correctifs
mormot.core.base+2
b2b195da+190-8
core: Locked*() are now full memory barriers on FPC non-Intel CPUs
Impact
Sous FPC ARM et AArch64, l’exclusion du mot de verrouillage n’ordonnait pas la mémoire protégée. Le commit documente des incréments et contextes TSynThreadPool perdus ainsi qu’une corruption heap TSynBackgroundTimer.
Mise à jour recommandée
Considérez la mise à niveau comme obligatoire pour les services FPC ARM/ARM64 concurrents, mais utilisez le build final contenant le refactor de suivi.
3
Critique
La refonte dangereuse des connexions WebSocket en classes est annulée
Ce commit annule entièrement la refonte class précédente car TOverlapped doit rester les premiers octets de la structure transmise à IOCP.
Correctifs
mormot.net.server
1ff6986c+120-69
revert "net: rewritten http.sys WS connections list"
Impact
Il supprime un layout Windows invalide pouvant faire interpréter les métadonnées d’objet comme TOverlapped. Les travaux record puis TLockedList le remplacent.
Mise à jour recommandée
N’utilisez pas la révision immédiatement précédente ; adoptez le build final 2.4.17497.
Unités
4
Critique
Une liste de connexions WebSocket en classes introduit un layout IOCP invalide
Le commit convertit temporairement THttpApiWebSocketConnection d’un record/object enraciné sur TOverlapped en class et restructure les tableaux du protocole. Le commit non-merge suivant l’annule entièrement.
Sous le capot
mormot.net.server
91f43c69+69-120
net: rewritten http.sys WS connections list
Impact
Cette révision ne doit pas être déployée : IOCP exige TOverlapped à l’offset zéro, absent d’une instance class. Aucun effet API durable après l’annulation.
Mise à jour recommandée
Ignorez cette révision et utilisez le build final 2.4.17497.
Unités
5
Élevée
Les connexions WebSocket HTTP.sys passent des index aux ID stables
THttpApiWebSocketServerProtocol stocke les connexions dans TLockedList, attribue un ID à chaque THttpApiWebSocketConnection et fait accepter THttpApiWebSocketConnectionID à Send et Close. Des structures overlapped lecture/réveil séparées coordonnent IOCP et arrêt.
Ruptures
mormot.net.server
8bcdf7e7+281-196
net: http.sys WebSockets server now uses TLockList
Impact
Le code qui conservait un index de tableau ou appelait Send/Close avec un integer doit garder Conn.ID et passer cet ID stable. Le runtime gagne un recyclage résistant à l’ABA et un arrêt concurrent plus sûr.
Migration nécessaire
Recherchez THttpApiWebSocketServerProtocol.Send/Close et les index stockés ; capturez plutôt THttpApiWebSocketConnection.ID dans les callbacks.
API publique
THttpApiWebSocketConnectionIDaddedTHttpApiWebSocketConnection.IDaddedTHttpApiWebSocketServerProtocol.Sendsignature-changedTHttpApiWebSocketServerProtocol.Closesignature-changed
Unités
6
Élevée
Un état WebSocket par requête remplace la dernière connexion partagée
THttpApiWebSocketServer stocke la connexion en attente dans THttpApiServerRequest plutôt que fLastConnection, rendant les upgrades concurrents locaux à la requête. THttpServerRequest.FullUrl devient virtual RawUtf8 et la propriété publique HttpApiRequest est supprimée.
Ruptures
mormot.lib.winhttp+1
c852c8cf+92-103
net: several fixed to THttpApiWebSocketServer
Impact
L’état partagé déclaré non thread-safe disparaît. Le code attendant FullUrl en SynUnicode doit utiliser RawUtf8 ; celui lisant HttpApiRequest doit employer les champs supportés ou une extension Windows interne.
Migration nécessaire
Recherchez les déclarations/affectations FullUrl et références HttpApiRequest ; migrez avant compilation puis testez les upgrades concurrents.
API publique
THttpServerRequest.FullUrlsignature-changedTHttpServerRequest.GetFullUrlsignature-changedTHttpServerRequest.HttpApiRequestremoved
7
Élevée
Les helpers HTTP.sys bas niveau changent leurs contrats de sortie
HTTP_RESPONSE.SetStatus renvoie désormais PRawUtf8 au lieu de remplir var RawUtf8, RetrieveHeadersAndGetRemoteIPConnectionID devient une procedure avec var Headers, et LookupTokenVar ainsi que VERB_TEXT sont ajoutés.
Ruptures
mormot.core.os.security+1
9c149153+41-16
lib: some http.sys API wrapper refinements
Impact
Les utilisateurs directs de ces wrappers Windows bas niveau ne compileront plus avant adaptation des paramètres de retour et sortie. Les utilisateurs de haut niveau THttpServer ne sont pas affectés.
Migration nécessaire
Recherchez les appels SetStatus et RetrieveHeadersAndGetRemoteIPConnectionID, supprimez les chaînes status temporaires et passez une variable Headers.
API publique
HTTP_RESPONSE.SetStatussignature-changedRetrieveHeadersAndGetRemoteIPConnectionIDsignature-changedLookupTokenVaraddedVERB_TEXTadded
8
Élevée
Les upgrades et lectures WebSocket échoués sont désormais drainés proprement
Le serveur finalise les upgrades échoués, refuse les nouveaux upgrades pendant l’arrêt, valide les écritures complètes, limite chaque connexion à une lecture en attente, termine les lectures échouées avec zéro octet et attend la fin des E/S avant recyclage.
Correctifs
mormot.net.server
97ab4cc4+64-24
net: some THttpApiWebSocketServer fixes
Impact
Les chemins d’erreur et d’arrêt WebSocket HTTP.sys Windows ne recyclent plus les enregistrements tant que des completions peuvent arriver. Aucune nouvelle migration source n’est introduite.
Mise à jour recommandée
Passez au build final et testez handshake échoué, déconnexion brutale et arrêt serveur sous charge.
Unités
9
Élevée
La completion websocket.dll est traitée comme une opération void
WebSocketApi.CompleteAction passe d’une fonction HRESULT à une procedure, les contrôles de résultat disparaissent et la réception ne démarre qu’après la réponse HTTP 101.
Correctifs
mormot.lib.winhttp+1
6f0344bf+19-45
net: fixed WebSocketApi.CompleteAction usage
Impact
La déclaration Windows correspond désormais à websocket.dll et ne lit plus un résultat inexistant. La séquence d’upgrade ne commence pas non plus la lecture avant la validation du handshake HTTP.
Mise à jour recommandée
Utilisez la déclaration corrigée et validez les upgrades WebSocket réussis et échoués.
API publique
WebSocketApi.CompleteActionsignature-changed
10
Élevée
L’état de réponse HTTP.sys et les échecs Range sont durcis
Le serveur marque les réponses avant envoi, sort après l’échec d’ouverture d’un fichier statique, renvoie 416 pour un Range hors fichier, intercepte les exceptions OnBeforeBody et nettoie l’état de réponse.
Correctifs
mormot.net.server
3b4da68d+34-23
net: some THttpApiServer fixes and cleanup
Impact
Les applications HTTP.sys Windows évitent de poursuivre ou doubler une réponse après erreur et renvoient le bon status pour les ranges invalides.
Mise à jour recommandée
Mettez à niveau et retestez les Range de fichiers statiques ainsi que les exceptions OnBeforeBody.
Unités
11
Élevée
Les opérations WebSocket send et close concurrentes sont sérialisées
THttpApiWebSocketServerProtocol verrouille désormais Close et Send, et la suppression du tableau pending-close reçoit le pointeur du compteur plutôt que celui du tableau.
Correctifs
mormot.net.server
3383af99+28-18
net: some THttpApiWebSocketServerProtocol fixes
Impact
Les backends WebSocket Windows évitent les courses entre threads applicatifs et maintenance du protocole, ainsi que la corruption mémoire due au mauvais compteur pending.
Mise à jour recommandée
Mettez à niveau au lieu de conserver le refactor précédent et testez Send, Close et disconnect concurrents.
Unités
12
Élevée
La déclaration d’envoi WebSocket rejoint son implémentation
La mise à jour de déclaration manquante fait renvoyer à WriteData le succès et le nombre écrit, supprime l’ancien overlapped partagé pour send et envoie les corps de réponse en mode synchrone.
Correctifs
mormot.net.server
c9bcf0ea+16-24
net: missing file in previous commit
Impact
Le commit précédent était incomplet sans cette unité et pouvait ne pas compiler ou conserver un comportement d’envoi incohérent. Aucune API applicative publique ne change.
Mise à jour recommandée
Ne vous arrêtez pas à la révision précédente ; utilisez la série finale complète.
Unités
13
Élevée
HTTP.sys ferme les connexions dont le corps reste non lu
SendError peut ajouter Connection: close et HTTP_SEND_RESPONSE_FLAG_DISCONNECT. Les corps trop grands, rejets de bot, abandons OnBeforeBody et erreurs de lecture utilisent ce chemin.
Correctifs
mormot.net.server
6a2970d5+21-9
net: properly disconnect http.sys client when needed
Impact
Le serveur ne réutilise plus une connexion HTTP.sys dont le corps n’a pas été consommé, évitant de polluer la requête suivante.
Mise à jour recommandée
Retestez les uploads rejetés et keep-alive après mise à niveau.
Unités
14
Élevée
Les échecs de ping n’arrêtent plus le guard WebSocket
THttpApiWebSocketConnection.CheckIsActive ignore désormais les états inactifs, ferme les peers expirés avant un nouveau ping et intercepte les exceptions Ping pour ne fermer que la connexion concernée.
Correctifs
mormot.net.server
21b62bc8+18-9
net: fixed http.sys ping process
Impact
Les services WebSocket HTTP.sys Windows conservent leur thread guard après un échec de ping et ne pingent plus les connexions en fermeture. Les API applicatives Delphi et FPC ne changent pas.
Mise à jour recommandée
Utilisez le build 2.4.17497 et testez les chemins de timeout de ping et d’arrêt.
Unités
15
Élevée
La réception du corps HTTP.sys respecte le contrat de l’API Windows
La déclaration ReceiveRequestEntityBody remplace var cardinal par PCardinal pour pBytesReceived. Les lectures synchrones passent @bytesread, les lectures overlapped WebSocket nil, et les erreurs d’écriture remettent le compte à zéro.
Correctifs
mormot.lib.winhttp+1
e795d965+14-13
net: fixed http.sys API incorrect usage
Impact
Le wrapper accepte désormais le pointeur de sortie nul requis pour les E/S overlapped. Les appels directs au champ fonction doivent passer une adresse ou nil ; ce même commit a temporairement inversé un test d’envoi, corrigé juste après.
Migration nécessaire
Mettez à jour les appels directs à ReceiveRequestEntityBody avec @count ou nil, et adoptez 2.4.17497 plutôt que cette révision intermédiaire.
API publique
THttpApiFunction.ReceiveRequestEntityBodysignature-changed
16
Élevée
Les écritures WebSocket et réponses de fermeture suivent les bons chemins
WriteData ne réussit que pour une écriture complète du corps HTTP.sys, la boucle d’envoi teste l’échec avec la bonne polarité et une frame close cliente reçoit la réponse close correspondante.
Correctifs
mormot.net.server
072bba0e+11-11
net: THttpApiWebSocketConnection fixes
Impact
Cela corrige des régressions de la refonte WebSocket : les builds antérieurs pouvaient interrompre des envois réussis ou mal gérer le handshake de fermeture sous Windows.
Mise à jour recommandée
Ne déployez pas le build intermédiaire du chemin d’envoi ; utilisez 2.4.17497 et testez send et fermeture du peer.
Unités
17
Élevée
Les envois réseau WebSocket déclarent les octets réellement écrits
WEB_SOCKET_SEND_TO_NETWORK_ACTION écrit désormais chaque buffer websocket.dll, cumule les octets réels pour CompleteAction et déconnecte lors d’un échec d’écriture HTTP.sys.
Correctifs
mormot.net.server
4730c107+9-6
net: fixed WEB_SOCKET_SEND_TO_NETWORK_ACTION with http.sys
Impact
Les envois WebSocket HTTP.sys Windows ne déclarent plus la taille demandée si moins d’octets atteignent le réseau, améliorant la détection d’échec et l’état du protocole.
Mise à jour recommandée
Utilisez le build final et testez les envois volumineux ou fragmentés et les déconnexions forcées.
Unités
18
Élevée
Les corps chunked HTTP.sys illimités ne reçoivent plus 413
La garde de longueur n’applique MaximumAllowedContentLength que si la limite est supérieure à zéro ; zéro conserve donc son sens illimité pour les corps chunked.
Correctifs
mormot.net.server
7b05e490+4-3
net: fixed #642 THttpApiServer chunked body gets 413
Impact
Les endpoints HTTP.sys Windows configurés sans limite acceptent les uploads chunked au lieu de répondre HTTP 413.
Mise à jour recommandée
Mettez à niveau si les requêtes chunked utilisent MaximumAllowedContentLength=0 et retestez les uploads limités et illimités.
Unités
19
Élevée
Le traitement HTTP.sys devient un objet par requête
Le chemin monolithique THttpApiServer.DoExecute est séparé en THttpApiServerRequest privé avec requête, réponse, buffers, logging et méthodes send/error. La réutilisation par thread demeure, mais l’état de réponse et d’exception devient explicite.
Sous le capot
mormot.net.http+1
5adc88f8+507-518
net: huge THttpApiServer refactoring/rewrite
Impact
Windows HTTP.sys gagne une meilleure isolation et gestion d’erreurs, mais ce commit ouvre une refonte multi-commit et ne doit pas être adopté seul.
À regarder
20
Élevée
Les enregistrements de connexion gardent overlapped à l’offset zéro
Les connexions reviennent à un stockage record/object avec TOverlapped en premier champ, tandis que l’allocation, la recherche et les tableaux pending-close sont réorganisés autour de pointeurs.
Sous le capot
mormot.net.server
22a41512+61-94
net: some THttpApiWebSocketConnection refactoring
Impact
Cela restaure le layout requis par les callbacks IOCP après la tentative class annulée, mais reste une architecture intermédiaire ensuite remplacée par TLockedList.
À regarder
Unités
21
Moyenne
Un contenu HTTP compressé invalide ne remonte plus en exception
THttpSocketCompressList.UncompressContent entoure le décompresseur d’un try/except, efface le résultat et renvoie nil si le codec lève une exception.
Correctifs
mormot.net.http
f1ec718b+11-7
net: hardened THttpSocketCompressList.UncompressContent
Impact
Une entrée gzip/deflate invalide devient un échec normal au lieu de propager une exception dans le chemin HTTP Delphi/FPC. Les appelants doivent déjà gérer nil.
Mise à jour recommandée
Vérifiez que les appels personnalisés traitent nil comme contenu compressé invalide au lieu d’attendre une exception codec.
API publique
THttpSocketCompressList.UncompressContentbehaviour-changed
Unités
22
Moyenne
Les listes verrouillées peuvent résoudre des identifiants résistants à l’ABA
Un alias public TLockedListID type les séquences et TLockedList.Find recherche un ID non nul sous le verrou de liste. Le carry de LockedInc64 sous FPC 32 bits utilise aussi LockedInc32 pour sa barrière.
Nouveautés
mormot.core.base+1
4824b5db+32-8
core: new TLockedList.Find method
Impact
L’infrastructure peut retrouver des entrées recyclées sans dépendre de pointeurs instables. Les appels Delphi/FPC existants ne changent pas sauf adoption du helper.
À regarder
API publique
TLockedListIDaddedTLockedList.Findadded
23
Moyenne
Les méthodes SOA peuvent renvoyer du JSON sans préfixes binary magic
TInterfaceMethodOption gagne optCleanMagicJson. TInterfaceFactoryServer.ExecuteJson appelle RemoveMagicFromJson sur la réponse lorsque l’option est présente.
Nouveautés
mormot.core.interfaces+1
2ff79bbd+6-2
soa: new optCleanMagicJson option for #402
Impact
Les méthodes d’interface sélectionnées peuvent émettre des chaînes JSON sans le préfixe interne JSON_BASE64_MAGIC. Les services existants ne changent pas sans activation.
À regarder
API publique
TInterfaceMethodOption.optCleanMagicJsonadded
24
Moyenne
Le retrait du magic JSON devient un scan copy-on-write plus rapide
RemoveMagicFromJson analyse d’abord les limites de chaînes, détecte les préfixes JSON_BASE64_MAGIC et n’alloue une copie modifiable que lorsqu’un marqueur doit être retiré.
Performance
mormot.core.json
367cdf5a+46-43
core: rewritten RemoveMagicFromJson()
Impact
Les appels SOA et directs gardent la même procedure publique mais évitent de copier le JSON ordinaire. Le comportement reste limité aux chaînes préfixées magic.
À regarder
Unités
25
Faible
Le texte d’erreur système peut être affecté directement à RawUtf8
Une procedure publique SetErrorText remplit un RawUtf8 existant depuis un code d’erreur OS, par défaut l’erreur courante. GetErrorText lui délègue et le code HTTP réutilise le helper.
Nouveautés
mormot.core.os+2
f47c802c+263-237
core: new SetErrorText() function
Impact
Les appelants peuvent réutiliser une chaîne destination et éviter un temporaire ; le code GetErrorText reste compatible sous Delphi et FPC.
API publique
SetErrorTextadded
26
Faible
L’échappement HTML peut remplir une short string fournie
La procedure publique HtmlEscapeShortVar écrit le RawUtf8 échappé dans une ShortString avec le format choisi ; HtmlEscapeShort délègue désormais au wrapper.
Nouveautés
mormot.core.fmt
5ec9601b+14-4
core: new HtmlEscapeShortVar() wrapper function
Impact
Les appelants Delphi et FPC possédant déjà la destination peuvent éviter un résultat temporaire. Les appels existants restent compatibles.
API publique
HtmlEscapeShortVaradded
Unités
27
Faible
Le réseau async reçoit un nettoyage sans effet fonctionnel
mormot.net.async est reformaté et simplifié sans modifier les branches exécutées ni les déclarations publiques.
Sous le capot
mormot.net.async
29b15f39+17-17
net: some code cleanup with no functional change
Impact
Aucun impact n’est attendu sur le code applicatif Delphi ou FPC.
Unités
28
Faible
L’objet de requête HTTP.sys réécrit reçoit un nettoyage
Le suivi simplifie et reformate la nouvelle implémentation THttpApiServerRequest après la grande refonte, sans modifier son comportement prévu.
Sous le capot
mormot.net.server
6dfbaf34+13-17
net: THttpApiServer cleanup after previous commit
Impact
Aucun impact sur le code applicatif n’est visible ; il s’agit de maintenance interne à HTTP.sys Windows.
Unités
29
Faible
L’exemple documente ses dossiers interface et implementation
Le SAD, README et les guides décrivent la séparation app/<entity>/interface et app/<entity>/implementation, le sens des dépendances et l’exception du mode local.
Documentation
recommended-patterns documentation
76e144c0+147-119
Document the app/<entity>/interface|implementation layout
Impact
Le runtime mORMot ne change pas ; les équipes suivant l’exemple obtiennent un guide architectural plus clair.
30
Faible
La documentation du layout CQRS intègre les corrections de revue
Les documents d’architecture et de développement clarifient les dépendances interface/implementation et ajustent les références du service exemple après revue.
Documentation
recommended-patterns documentation
4ecaf74e+16-15
Address review notes on the interface/implementation docs
Impact
Aucun impact runtime ni API publique ; le commit améliore seulement l’explication recommended-patterns.
31
Faible
Les instructions de build et dépendances de l’exemple sont corrigées
La documentation recommended-patterns retire les étapes de build obsolètes et aligne les dépendances sur l’arborescence réorganisée.
Documentation
recommended-patterns documentation
5b856937+22-8
Fix stale build steps and dependency list in the example docs
Impact
Aucun changement de framework ou runtime ; seuls les développeurs construisant l’exemple voient des instructions corrigées.
32
Faible
L’exemple CQRS sépare contrats et implémentations
Les unités query, command et DTO de recommended-patterns passent dans app/<entity>/interface, les mappers et handlers dans implementation ; les chemins Delphi et FPC sont mis à jour.
Entretien
recommended-patterns example
323eb2c9+70-62
Move CQRS interfaces from dom/ to app/<entity>/interface
Impact
Seuls le layout de l’exemple et ses chemins de build changent. Les utilisateurs du framework ne sont pas affectés sauf copie de cette structure.