Требует действийможет затронуть работающую систему
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.
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.
Модули
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 следует пересобрать вместе.
Рекомендуется обновиться
Не используйте build 2.4.17513-2.4.17515; возьмите build 2.4.17516 или новее и пересоберите все units вместе.
Публичный API
THash128Rec, THash256Rec, THash512Rec, TDebugSymbol, TDebugBlock and related recordsbehaviour-changed — packed снят там, где достаточно natural alignment; пересоберите consumers binary layout.
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 бесконечно.
Рекомендуется обновиться
Обновите HTTP.sys servers и проверьте static files, invalid Range, failed WebSocket upgrade и shutdown с active peers.
Модули
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 реже зависают или завершаются дважды.
Рекомендуется обновиться
Проверьте broadcast с одним disconnected peer и close/shutdown при concurrent I/O.
Модули
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.
Рекомендуется обновиться
Для POSIX keytab hot reload используйте build 2.4.17505 или новее; не останавливайтесь на первом signature-change commit.
Модули
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.
Рекомендуется обновиться
Пропустите build 2.4.17513-2.4.17515 и используйте build 2.4.17516 или новее.
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.
Рекомендуется обновиться
Обновите HTTP.sys services, зависящие от OnIdle, log flush, telemetry или keytab refresh, и проверьте idle worker при shutdown.
Модули
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.
Рекомендуется обновиться
Обновитесь, если TCurlHttp следует redirects или получает 100 Continue, и проверьте чтение response headers.
Модули
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.
Рекомендуется обновиться
Проверьте non-ASCII и окружённые пробелами custom headers в TWinHttp и TDelphiNetHttp.
Модули
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.
Рекомендуется обновиться
Для сборки mormot.crypt.ecc256r1 в Delphi 7/2007 используйте build 2.4.17522 или новее.
Модули
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.
Рекомендуется обновиться
Для Delphi POSIX используйте build 2.4.17523 или новее и пересоберите приложения, зависящие от ECC.
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 снова собираются без изменений приложения.
Рекомендуется обновиться
Используйте build 2.4.17529 или новее, если включён TDelphiNetHttp.
Модули
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 не меняется.
Стоит взглянуть
Модули
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.
Рекомендуется обновиться
Проверьте код разбора первой строки response headers: теперь она начинается с реального header field.
Модули
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 с пробелами согласуются правильно.
Рекомендуется обновиться
Проверьте fragmented messages, OnMessage exceptions и subprotocol negotiation в HTTP.sys WebSocket.
Модули
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.
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 не меняются.
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 не меняются.
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.
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 без изменений приложения.
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; публичные форматы и вызовы не меняются.
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 должны остаться идентичными.
Стоит взглянуть
Модули
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.
Модули
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 не меняются.
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 не меняются.
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 прежние.
Модули
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 не меняются.
Модули
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 не меняются.
Модули
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 не меняются.
Модули
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 не меняются.