mORMot2 DailyЕжедневный обзор коммитов апстрима

HTTP-клиенты и WebSocket стабилизированы после широкой оптимизации ECC

В этом выпуске закрыты несколько проблем жизненного цикла HTTP.sys WebSocket и исправлена обработка response headers в WinINet, WinHTTP, HTTP-клиенте Delphi и libcurl. Эта же серия переписывает многие арифметические пути ECC P-256 для ARM, i386 и x86-64 и восстанавливает сборку Delphi 7/2007 и Delphi POSIX. Пользователям POSIX Kerberos также нужно учесть два изменения публичных сигнатур keytab.

Коротко

  • Используйте build 2.4.17531: в нём завершена серия исправлений HTTP headers и все последующие compatibility fixes.
  • Build 2.4.17513–2.4.17515 содержит отдельный token fixme в mormot.core.base и не должен использоваться.
  • TServerSspiKeyTab.PrepareKeyTab теперь возвращает boolean, а ServerForceKeytab принимает RawUtf8 вместо TFileName.
  • Очистка HTTP.sys WebSocket, idle callbacks, учёт ping и обработка failed send переработаны в семи commits.

Рекомендации по обновлению

Переходите сразу на build 2.4.17531, а не на промежуточную revision. Пересоберите callers TServerSspiKeyTab.PrepareKeyTab и ServerForceKeytab, затем проверьте shutdown HTTP.sys WebSocket, failed sends, idle callbacks, redirects libcurl и response headers Windows-клиентов. Не используйте build 2.4.17513-2.4.17515: mormot.core.base содержит недопустимый отдельный token fixme.

Сборка2.4.17497 → 2.4.17531
Коммиты33
Строки+3540 -1049
Чтение6 мин

30 из 30 записей · 33 коммитов в апстриме

# Запись Категория Модули
1 Высокий POSIX keytab handling получает lock, UTF-8 и возвращаемый результат TServerSspiKeyTab защищает filename/sequence через fSafe, преобразует TFileName в UTF-8 перед GSSAPI и сохраняет активный keytab при invalid replacement. PrepareKeyTab становится boolean function, ServerForceKeytab принимает RawUtf8. Несовместимые изменения mormot.lib.gssapi 4059a7dd+53-38

lib: several TServerSspiKeyTab fixes

Влияние

Direct callers нужно пересобрать из-за двух signature changes. Delphi POSIX filenames передаются GSSAPI в UTF-8, concurrent readers больше не видят незащищённое имя keytab.

Требуется миграция

Найдите PrepareKeyTab и обработайте либо явно проигнорируйте boolean result; в прямые ServerForceKeytab передавайте UTF-8 RawUtf8. Используйте build 2.4.17505 или новее.

Публичный API

  • TServerSspiKeyTab.PrepareKeyTabsignature-changed — Procedure становится function PrepareKeyTab: boolean.
  • ServerForceKeytabsignature-changed — Параметр меняется с TFileName на UTF-8 RawUtf8.

Модули

Arnaud Bouchez · 09:15 UTC · открыть коммит на GitHub →

2 Высокий Очистка выравнивания временно делает mormot.core.base некомпилируемым У ряда records снят packed для лучшего ARM alignment, включая THash128Rec, THash256Rec, THash512Rec, TDebugSymbol и TDebugBlock. Тот же diff случайно добавляет отдельный token fixme перед InterlockedIncrement. Несовместимые изменения mormot.core.base+3 b66d0984+13-13

core: don't use "packed record" unless really needed

Влияние

Build 2.4.17513–2.4.17515 не компилирует mormot.core.base из-за invalid Pascal token fixme. После исправления ARM access может ускориться; consumers raw record layout следует пересобрать вместе.

Публичный API

  • THash128Rec, THash256Rec, THash512Rec, TDebugSymbol, TDebugBlock and related recordsbehaviour-changed — packed снят там, где достаточно natural alignment; пересоберите consumers binary layout.

Arnaud Bouchez · 14:37 UTC · открыть коммит на GitHub →

3 Высокий Ошибки HTTP.sys response и WebSocket teardown становятся видимыми и ограниченными HttpSendResponse/SendResponse возвращают реальный success, static-file и invalid Range paths сразу выходят, failed WebSocket handshake освобождает native handles, disconnect callback вызывается только после connect, teardown ждёт максимум пять секунд. Исправления mormot.net.server cc55fa88+58-40

net: several THttpApiServer/THttpApiWebSocketServer fixes

Влияние

HTTP.sys callers не считают failed submission успешным, invalid file/range прекращает processing, partial WebSocket upgrade не течёт handles, shutdown не ждёт connections бесконечно.

Модули

Arnaud Bouchez · 06:39 UTC · открыть коммит на GitHub →

4 Высокий HTTP.sys WebSocket send закрывается при ошибке и продолжает drain очереди Broadcast перехватывает send exception каждой connection и начинает close, active/closed state sets централизованы, shutdown пропускает уже закрытые connections, ProcessActions продолжает без double completion. Исправления mormot.net.server 6e02ccef+37-25

net: some http.sys WebSockets fixes

Влияние

Один сломанный WebSocket больше не прерывает broadcast, failed sends отражаются в boolean result, а receive/close actions реже зависают или завершаются дважды.

Модули

Arnaud Bouchez · 06:55 UTC · открыть коммит на GitHub →

5 Высокий Регистрация keytab повторяется после per-thread ошибки GSSAPI PrepareKeyTab копирует main sequence под lock, но обновляет threadvar только после успеха ServerForceKeytab. SetKeyTab проверяет изменения файла и FileIsKeyTab под fSafe. Исправления mormot.lib.gssapi 0a647b66+29-21

lib: minor TServerSspiKeyTab fixes

Влияние

Heimdal или transient registration failure повторяется на том же thread и не считается prepared; concurrent refresh не конфликтует с cached file metadata.

Модули

Arnaud Bouchez · 09:33 UTC · открыть коммит на GitHub →

6 Высокий Новые ARM asm selectors также исправляют сломанную core declaration mormot.defines.inc вводит ASMARM64/ASMINTELARM и сбрасывает их при NOASMBLOCK. mormot.core.base применяет ASMINTELARM к atomic declarations и удаляет отдельный token fixme из build 17513. Исправления mormot.core.base+1 6f93fc70+24-16

core: new ASMINTELARM/ASMARM64 conditionals

Влияние

Build 2.4.17513–2.4.17515 содержит invalid Pascal в mormot.core.base; build 2.4.17516 восстанавливает сборку и даёт стабильные selectors для последующего ECC asm.

Arnaud Bouchez · 14:51 UTC · открыть коммит на GitHub →

7 Высокий HTTP.sys servers возвращают периодический logging, telemetry и OnIdle THttpApiServer создаёт TSynBackgroundThreadProcess HttpApiIdle, каждую секунду вызывает virtual DoIdle с monotonic time и освобождает worker до основного teardown. Исправления mormot.net.server df25cd22+25-6

net: fixed logger + telemetry + OnIdle() support in THttpApiServer

Влияние

Windows HTTP.sys backends снова flush logs, consolidируют telemetry, вызывают OnIdle и обслуживают blacklist/keytab даже без request traffic.

Модули

Arnaud Bouchez · 09:54 UTC · открыть коммит на GitHub →

8 Высокий libcurl теперь возвращает только headers конечного ответа TCurlHttp устанавливает CurlWriteLastResponseHeader как header callback. При новой строке HTTP status накопленный блок очищается, затем добавляются headers текущего ответа. Исправления mormot.net.client b9bdb628+16-3

net: fix TCurlHttp intermediate response headers

Влияние

Redirects и другие multi-response обмены больше не смешивают промежуточные headers в TCurlHttp.Header; callers видят headers конечного status code.

Модули

Arnaud Bouchez · 09:32 UTC · открыть коммит на GitHub →

9 Высокий Windows request headers получают стабильное Unicode-хранилище и чистые имена TWinHttp.InternalAddHeader хранит результат Utf8ToSynUnicode в локальной SynUnicode и передаёт фактическую wide-char длину. TDelphiNetHttp.InternalAddHeader отдельно обрезает имена и значения. Исправления mormot.net.client 59a88c92+11-7

net: TWinHttp and TDelphiNetHttp client fixes

Влияние

TWinHttp избегает pointer на временную строку и несоответствия длины UTF-8/wide; клиент Delphi больше не передаёт пробелы вокруг custom headers.

Модули

Arnaud Bouchez · 09:23 UTC · открыть коммит на GitHub →

10 Высокий Delphi 7/2007 сохраняют совместимый fallback редукции P-256 _modMultN разделён по HASQWORD: современные compiler используют Barrett reduction, а Delphi 7/2007 сохраняют прежний shift-and-subtract без unsigned UInt64 semantics. Компилятор и платформы mormot.crypt.ecc256r1 597b691f+61-7

crypt: circumvent Delphi 7/2007 compiler restriction

Влияние

Legacy Delphi снова собирается и вычисляет P-256 через более медленный проверенный путь; новые backends сохраняют optimized reducer.

Arnaud Bouchez · 17:21 UTC · открыть коммит на GitHub →

11 Высокий Delphi POSIX снова получает helper широкого умножения mormot.core.base добавляет Delphi-реализацию mul64x64 вне ветки FPC. В ECC carry expressions добавлены явные ordinal и PtrUInt/QWord conversions для Delphi POSIX. Компилятор и платформы mormot.core.base+2 c763b013+23-9

crypt: fixed Delphi POSIX compilation

Влияние

Delphi POSIX targets снова компилируют новую ECC arithmetic; это только compiler compatibility без изменения application API.

Arnaud Bouchez · 17:29 UTC · открыть коммит на GitHub →

12 Высокий Обрезка HTTP headers компилируется на поддерживаемых Delphi TDelphiNetHttp.InternalAddHeader сохраняет результаты TrimCopy в явные переменные RawUtf8 перед преобразованием в string для THTTPClient.AddHeader. Компилятор и платформы mormot.net.client 0a8341fb+8-5

net: fixed TDelphiNetHttp header trimming compilation

Влияние

Предыдущее inline-использование procedure-overload TrimCopy не компилировалось; backends Delphi с TDelphiNetHttp снова собираются без изменений приложения.

Модули

Arnaud Bouchez · 09:26 UTC · открыть коммит на GitHub →

13 Средний Закрытие HTTP.sys WebSocket и учёт ping объединены в один путь THttpApiWebSocketConnection.DoClose централизует close status, context и BeginClose. Ping timestamp ставится до отправки, ping/pong не обновляет обычную activity, а close sites используют DoClose. Исправления mormot.net.server 303139a2+23-29

net: new THttpApiWebSocketConnection.DoClose internal method

Влияние

Idle WebSocket connections не поддерживаются только server ping, а failure paths дают согласованное close state; application API не меняется.

Стоит взглянуть

Модули

Arnaud Bouchez · 10:33 UTC · открыть коммит на GitHub →

14 Средний WinINet и WinHTTP больше не возвращают HTTP status line как header RemoveHeadInHeaders удаляет пробелы и начальную HTTP status line. TWinHttpApi.InternalRetrieveAnswer и TCurlHttp применяют её до выдачи или разбора response headers. Исправления mormot.net.client e46374f3+21-12

net: fixed WinINet/WinHttp retrieved headers

Влияние

Callers получают нормализованный блок без pseudo-header со строкой HTTP/1.x status. Поиск headers согласован между Windows и curl clients.

Модули

Arnaud Bouchez · 08:02 UTC · открыть коммит на GitHub →

15 Средний WebSocket buffers и action queues корректно переживают сбои callback DoOnMessage очищает fBuffer в finally, ProcessActions после завершения send action продолжает цикл, а UpgradeToWebSocket обрезает имя каждого requested subprotocol. Исправления mormot.net.server a2fab1d6+8-9

net: minor THttpApiWebSocketServer tweaks

Влияние

Исключение OnMessage не оставляет stale payload для следующего сообщения, send completion не ломает processing, а списки protocol с пробелами согласуются правильно.

Модули

Arnaud Bouchez · 09:43 UTC · открыть коммит на GitHub →

16 Средний HTTP servers получают единый virtual hook idle maintenance THttpServerGeneric добавляет protected virtual DoIdle(tix64, sec32). Socket servers переносят туда logger, analyzer, OnIdle, blacklist и POSIX keytab maintenance; async server переиспользует путь. Новые возможности mormot.defines+2 ddb42855+37-42

net: new THttpServerGeneric.DoIdle virtual method

Влияние

Server subclasses могут единообразно расширять periodic maintenance, а существующие socket/async backends сохраняют callbacks через общую реализацию.

Стоит взглянуть

Публичный API

  • THttpServerGeneric.DoIdleadded — Protected virtual procedure DoIdle(tix64: Int64; sec32: cardinal) централизует periodic server work.

Arnaud Bouchez · 09:42 UTC · открыть коммит на GitHub →

17 Средний i386 получает нативное 128- и 256-битное умножение mormot.crypt.core.asmx86 добавляет _mult128/_mult256. Pascal unit направляет все ASMINTEL targets, включая i386, на нативные multiply/square routines. Производительность mormot.crypt.core+1 afce8c72+602-98

crypt: new i386 asm for _mult256() and _mult128()

Влияние

32-bit Intel/AMD ECC operations обходят generic Pascal multiplication; source и cryptographic wire formats не меняются.

Arnaud Bouchez · 17:20 UTC · открыть коммит на GitHub →

18 Средний Редукция простого P-256 переносится в архитектурный Intel asm _mmodP объявлен в mormot.crypt.core для ASMINTEL и реализован в include-файлах i386/x86-64; Pascal reducer остаётся только для non-Intel. Производительность mormot.crypt.core+3 15884e94+497-4

crypt: x86_64/i386 asm specific mormot.crypt.ecc256r1 computation of _mmodP

Влияние

P-256 multiplication на i386/x86-64 использует architecture-specific modular reduction; public keys, signatures и API не меняются.

Arnaud Bouchez · 16:27 UTC · открыть коммит на GitHub →

19 Средний ARMv7 atomics получают нативные реализации с корректными barriers AArch64 include переименован в mormot.core.base.asmarm.inc и дополнен ARMv7 LDREX/STREX loops с DMB ISH. ASMARM выбирает их на AArch64 и ARMv7+ с CPUARM_HAS_DMB. Производительность mormot.core.base+2 a1079132+320-164

core: ARMv7 asm for Locked*() - in a single mormot.core.base.asmarm.inc

Влияние

FPC ARMv7 locks/reference counters сохраняют full memory-barrier semantics с меньшим числом RTL barriers; старые ARM остаются на защищённом RTL fallback.

zen010101 · 08:22 UTC · открыть коммит на GitHub →

20 Средний ARMv8 получает развёрнутую wide-integer арифметику для ECC mormot.core.base.asmarm.inc добавляет AArch64 add/subtract/shift и 128/256-bit multiply routines; mormot.crypt.core выбирает их через ASMARM64 вместо более медленных Pascal-вариантов. Производительность mormot.core.base+2 284915df+357-44

crypt: new unrolled ARMv8 64-bit asm for 128-bit and 256-bit computation

Влияние

AArch64 Delphi/FPC crypto workloads используют нативную wide arithmetic, ускоряя прежде всего ECC internals без изменений приложения.

Arnaud Bouchez · 14:52 UTC · открыть коммит на GitHub →

21 Средний AArch64 получает отдельную процедуру редукции простого P-256 ASMARM64 теперь предоставляет AArch64-реализацию _mmodP из mormot.core.base.asmarm.inc, а mormot.crypt.ecc256r1 исключает Pascal-вариант на этой target. Производительность mormot.core.base+2 1dec0f83+153-2

crypt: specific mormot.crypt.ecc256r1 computation in pure aarch64 asm

Влияние

Внутренние multiplication/signing ECC P-256 используют нативную AArch64 reduction; публичные форматы и вызовы не меняются.

Arnaud Bouchez · 19:48 UTC · открыть коммит на GitHub →

22 Средний Редукция скаляров P-256 переходит на алгоритм Barrett mormot.crypt.ecc256r1 добавляет BARRETT_N_MU_LOW и заменяет побитовую редукцию Curve_N_32 в _modMultN на fixed-width Barrett reduction с максимум двумя masked subtractions. Производительность mormot.crypt.ecc256r1 49108d2f+81-51

crypt: use Curve_N_32 Barret Reduction algorithm for ecc256r1

Влияние

ECDSA scalar multiplication и signing выполняют меньше data-dependent reduction steps на современных compiler; cryptographic outputs должны остаться идентичными.

Стоит взглянуть

Arnaud Bouchez · 16:26 UTC · открыть коммит на GitHub →

23 Средний Ping HTTP.sys WebSocket переносится в idle cycle сервера THttpApiWebSocketServer удаляет TSynWebSocketGuard и переопределяет DoIdle для обхода connections. Last activity и last ping разделены, activity обновляется после receive/non-ping send, PingTimeout становится writable. Внутреннее устройство mormot.net.server 39a07c59+62-88

net: refactored http.sys WebSockets PING process

Влияние

Ping timeout теперь работает в общем секундном idle thread и считает успешные application sends активностью; PingTimeout можно менять после создания.

Стоит взглянуть

Публичный API

  • THttpApiWebSocketServer.PingTimeoutbehaviour-changed — Свойство получает write accessor, а timeout checks выполняются из DoIdle вместо TSynWebSocketGuard.

Модули

Arnaud Bouchez · 10:10 UTC · открыть коммит на GitHub →

24 Низкий Возведение P-256 в квадрат использует отдельный Intel/AMD asm В include-файлы i386/x86-64 добавлены нативные _square256; mormot.crypt.core больше не реализует Intel squaring через _mult256. Производительность mormot.crypt.core+2 f6c7eed7+506-13

crypt: native i386/x64 asm version of _square256()

Влияние

ECC arithmetic на 32/64-bit Intel/AMD использует специализированный square path; source и serialized data не меняются.

Arnaud Bouchez · 18:02 UTC · открыть коммит на GitHub →

25 Низкий Сравнение широких целых специализировано для x86-64 и AArch64 _cmp256 получает нативные реализации для ASMX64/ASMARM64, а Pascal comparison остаётся для других CPU64. Комментарий также объясняет packed у TSynAngelizeState. Производительность mormot.app.agl+4 7023137e+70-25

crypt: x64 and aarch64 asm for _cmp256() function

Влияние

ECC comparisons дешевле на x86-64/AArch64; binary layout TSynAngelizeState и public behavior не меняются.

Arnaud Bouchez · 16:25 UTC · открыть коммит на GitHub →

26 Низкий Модульная инверсия P-256 выполняет меньше широких сравнений _modInv откладывает _cmp256 до нечётности обоих операндов, заменяет compare-then-subtract результатом borrow от _sub256 и применяет _inc256 in-place. Производительность mormot.crypt.ecc256r1 a83aa6a6+38-33

crypt: slightly optimized _modInv() for ecc256r1

Влияние

Pure-Pascal и неспециализированные ECC backends выполняют меньше работы при inversion; signatures, keys и public behavior прежние.

Arnaud Bouchez · 18:13 UTC · открыть коммит на GitHub →

27 Низкий Pure-Pascal 256-битный multiplier сокращает loop overhead _mult256 выбирает диагонали начальными pointers и явным числом итераций, напрямую объединяет carry и пишет через PQWordArray без повторных проверок индексов. Производительность mormot.crypt.core e657f90d+21-25

crypt: faster pure pascal _mult256() algorithm

Влияние

Targets без специализированного asm, особенно ARM на этом этапе, выполняют ECC multiplication с меньшим Pascal loop overhead; API не меняются.

Модули

Arnaud Bouchez · 14:49 UTC · открыть коммит на GitHub →

28 Низкий DoubleToAscii использует нативное широкое умножение на ARM Путь Grisu d2a_diy_fp_multiply теперь использует ASMINTELARM и mul64x64 на ARMv7/AArch64, а normalization word читается через PQWordArray. Производительность mormot.core.text 0fe4797b+6-6

core: slightly faster DoubleToAscii() on arm32/aarch64

Влияние

ARM backends Delphi/FPC форматируют Double через более быстрый внутренний multiply path; формат и public API не меняются.

Модули

Arnaud Bouchez · 09:27 UTC · открыть коммит на GitHub →

29 Низкий FPC atomic wrappers выбираются по поведению CPU mormot.core.base реорганизует FPC Locked/Interlocked: Intel использует no-op ReadWriteBarrier вокруг RTL atomics, AArch64 сохраняет asm include, остальные CPU — явные barriers. Byte swaps и refcount helpers перенесены в общую FPC-ветку. Внутреннее устройство mormot.core.base d1bb00c2+50-47

core: refactored FPC Locked*() functions

Влияние

FPC Intel избегает лишних barriers, non-Intel сохраняет ordering; public atomic signatures и application code не меняются.

Модули

Arnaud Bouchez · 07:25 UTC · открыть коммит на GitHub →

30 Низкий Преобразование Decimal128 больше не вызывает FPC hint для литерала mormot.db.nosql.bson оформляет multiplier 100000000000000000 как QWord-константу BIGPOW10 и передаёт её в mul64x64 внутри TDecimal128.FromText. Обслуживание mormot.db.nosql.bson 42184b30+6-3

db: fixed FPC compiler hint in TDecimal128 process

Влияние

В FPC исчезает compiler hint; parsing и binary representation Decimal128 не меняются.

Arnaud Bouchez · 14:50 UTC · открыть коммит на GitHub →

Активность апстрима коммитов в день · последние 60 дней
Коммиты977
Активных дней44/60
Пик активности2026-09-30
Максимум60
2026-08-15: 0 commits2026-08-16: 0 commits2026-08-17: 0 commits2026-08-18: 0 commits2026-08-19: 0 commits2026-08-20: 0 commits2026-08-21: 0 commits2026-08-22: 0 commits2026-08-23: 0 commits2026-08-24: 0 commits2026-08-25: 0 commits2026-08-26: 0 commits2026-08-27: 26 commits2026-08-28: 11 commits2026-08-29: 10 commits2026-08-30: 1 commit2026-08-31: 23 commits2026-09-01: 0 commits2026-09-02: 20 commits2026-09-03: 29 commits2026-09-04: 35 commits2026-09-05: 13 commits2026-09-06: 0 commits2026-09-07: 0 commits2026-09-08: 23 commits2026-09-09: 10 commits2026-09-10: 17 commits2026-09-11: 23 commits2026-09-12: 14 commits2026-09-13: 9 commits2026-09-14: 7 commits2026-09-15: 4 commits2026-09-16: 24 commits2026-09-17: 26 commits2026-09-18: 21 commits2026-09-19: 59 commits2026-09-20: 13 commits2026-09-21: 5 commits2026-09-22: 34 commits2026-09-23: 17 commits2026-09-24: 57 commits2026-09-25: 22 commits2026-09-26: 26 commits2026-09-27: 0 commits2026-09-28: 2 commits2026-09-29: 19 commits2026-09-30: 60 commits2026-10-01: 26 commits2026-10-02: 30 commits2026-10-03: 32 commits2026-10-04: 15 commits2026-10-05: 1 commit2026-10-06: 26 commits2026-10-07: 37 commits2026-10-08: 27 commits2026-10-09: 35 commits2026-10-10: 33 commits2026-10-11: 9 commits2026-10-12: 11 commits2026-10-13: 35 commits
2026-08-152026-10-13