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

SChannel и HTTP caches стабилизированы, но heartbeat регрессировал

Windows SChannel получает исправления concurrency, handshake, renegotiation и памяти; HTTP clients — опциональные ограничения redirect, а оба proxy caches — корректную обработку статусов. Async WebSocket heartbeat переведён на HeartbeatDelay, но две последующие правки оставили сравнение, отключающее callbacks после стандартного порога освобождения памяти. Внешние реализации INetTls и код с удалённым LastOperationIdleSeconds требуют миграции.

Коротко

  • Переходите на head c94dba6c18f6a0c5b225734af210da678cc59167, build 2.4.17161, для завершённых исправлений SChannel, redirect и cache.
  • Async WebSocket heartbeat callbacks отключаются после стандартного idle-memory threshold; временно задайте LastOperationReleaseMemorySeconds = 0.
  • Внешние реализации INetTls должны добавить ReleaseBuffers, а LastOperationIdleSeconds нужно заменить на GetLastOperationIdleSeconds.
  • THttpRequestExtendedOptions.RedirectOptions добавляет опциональную очистку cross-origin credentials и запрет redirects при прежнем default.
  • Proxy cache теперь отвергает неверные GET statuses, прерывает progressive readers при ошибке и проверяет размер файла.
  • Избегайте build 2.4.17143 и незавершённых redirect builds 2.4.17159–2.4.17160.

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

Переходите на build 2.4.17161 в head c94dba6c18f6a0c5b225734af210da678cc59167 для исправлений SChannel, redirect и proxy cache. Добавьте INetTls.ReleaseBuffers во внешние TLS backends и замените LastOperationIdleSeconds. Async WebSocket servers должны задать LastOperationReleaseMemorySeconds = 0 и проверить heartbeat до следующего исправления cutoff.

Сборка2.4.17135 → 2.4.17161
Коммиты22
Строки+595 -335
Чтение4 мин

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

Сюжеты
# Запись Категория Модули
1 Высокий WebSocket heartbeat timing переведён на HeartbeatDelay TAsyncConnections удаляет LastOperationIdleSeconds и добавляет virtual GetLastOperationIdleSeconds. TWebSocketAsyncConnections возвращает Settings.HeartbeatDelay; 0 отключает ping/pong. Несовместимые изменения mormot.net.async+1 efb27161+37-23

net: fixed WebSockets HeartbeatDelay async server support

Влияние

Код с LastOperationIdleSeconds больше не компилируется. WebSocket берёт interval из settings, но final head требует workaround из-за regression cutoff.

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

Найдите LastOperationIdleSeconds. Используйте TWebSocketProtocol.Settings.HeartbeatDelay или override GetLastOperationIdleSeconds.

Публичный API

  • TAsyncConnections.LastOperationIdleSecondsremoved — Writable property заменено virtual getter.
  • TAsyncConnections.GetLastOperationIdleSecondsadded — По умолчанию возвращает 0; descendants могут override.

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

2 Высокий INetTls получил контракт освобождения idle buffers Публичный INetTls добавляет ReleaseBuffers: PtrInt. SChannel освобождает пустые buffers; OpenSSL возвращает 0, поскольку SSL_MODE_RELEASE_BUFFERS уже включён. Несовместимые изменения mormot.lib.openssl11+2 ef8aa8a5+31-2

net: introducing INetTls.ReleaseBuffers method

Влияние

Любой внешний implementor INetTls перестаёт компилироваться до добавления метода; built-in backends готовы.

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

Найдите classes, реализующие INetTls, и добавьте function ReleaseBuffers: PtrInt; возвращайте 0 без safe release.

Публичный API

  • INetTls.ReleaseBuffersadded — Обязательный метод, возвращающий число released bytes.

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

3 Высокий Concurrent SChannel Send и renegotiation сериализованы TSChannelNetTls добавляет fSspiSafe вокруг SEC_I_RENEGOTIATE и Send encryption; Send возвращает nrRetry, если lock у Receive. Исправления mormot.net.sock.windows 3e2819e1+95-63

net: hardened TSChannelNetTls thread safety

Влияние

Windows WebSocket connections больше не гоняют SSPI при TLS 1.3 post-handshake во время Send; callers nrRetry не меняются.

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

4 Высокий Ошибочные proxy downloads прерывают readers и удаляют partial files Proxy cache принимает только 200/204/206, хранит expected size, прерывает все THttpPartial readers при ошибке и удаляет incomplete files. Исправления mormot.net.async e3a44702+51-11

net: fixed Proxy Cache process

Влияние

Progressive clients больше не ждут failed transfer и не принимают truncated cache object за полный; redirect/error bodies не сохраняются как success.

Модули

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

5 Высокий Fragmented ClientHello больше не перезапускает SChannel accept TSChannelNetTls отслеживает fAcceptFirst и повторно использует SSPI context после SEC_I_CONTINUE_NEEDED вместо нового negotiation. Исправления mormot.net.sock.windows 7f17ffe4+12-4

net: fixed SChannel partial initial negotiation

Влияние

SChannel servers завершают handshake при ClientHello в нескольких TCP reads вместо failure/context corruption.

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

6 Высокий HEAD redirects исправлены, но heartbeat cutoff остаётся неверным THttpClientSocket сохраняет HEAD/OPTIONS для 301/303 и переводит методы с body в GET. Этот же commit ставит guard allowed < gc; после превращения gc в абсолютный 60-second cutoff allowed обнуляется и heartbeat callbacks пропускаются. Исправления mormot.net.async+1 edf01585+5-4

net: THttpClientSocket should keep HEAD for HTTP_MOVEDPERMANENTLY

Влияние

HEAD сохраняет метод. При default LastOperationReleaseMemorySeconds=60 async WebSocket servers перестают планировать OnLastOperationIdle; значение 0 обходит ветвь.

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

Проверьте HEAD redirects. Для async WebSocket задайте LastOperationReleaseMemorySeconds = 0 и проверьте ping/pong до upstream fix.

Публичный API

  • THttpClientSocket.Request redirect handlingbehaviour-changed — 301/303 сохраняют методы без body, включая HEAD и OPTIONS.

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

7 Высокий Same-origin redirects теперь отправляют новый path THttpClientSocket.Request обновляет ctxt.Url вне reconnect-only блока, поэтому redirect на том же соединении использует новый URL. Исправления mormot.net.client 30f397da+3-3

net: fixed THttpClientSocket redirections on the same server

Влияние

Same-server redirects больше не повторяют исходный path и не возвращают неверный resource.

Модули

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

8 Высокий SChannel renegotiation снова сохраняет decrypted buffers Ветка SEC_I_RENEGOTIATE в Receive вызывает ProcessBuffers до проверки output и продолжения TLS 1.3 post-handshake. Исправления mormot.net.sock.windows c6dc158f+3-2

net: fixed previous commit

Влияние

Build 2.4.17143 мог потерять decrypted data при renegotiation; 2.4.17144 восстанавливает processing.

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

9 Высокий Idle-loop cleanup вводит heartbeat regression IdleEverySecond добавляет underflow/shutdown checks, но сравнивает sec с уже преобразованным gc вместо heartbeat delay. Следующий commit меняет operands, не восстанавливая cutoff. Внутреннее устройство mormot.net.async fab1dd9a+18-15

net: minor TAsyncConnections.IdleEverySecond cleanup

Влияние

Cleanup начинает условие, подавляющее async WebSocket callbacks после memory window; прочие termination checks стали безопаснее.

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

Не полагайтесь на эту heartbeat logic; примените workaround LastOperationReleaseMemorySeconds для final head.

Модули

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

10 Средний Proxy HEAD probing сохраняет 204 и redirects RemoteClientHead применяет Range GET только для 200 без length, напрямую возвращает 204/3xx и добавляет RequestContext в diagnostics. Исправления mormot.net.async+1 48940904+15-12

net: enhanced THttpProxyUrl.RemoteClientHead

Влияние

Origin 204 или redirect больше не заменяются Range probe, а logs содержат нужный redirect/socket context.

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

11 Средний Очистка redirect теперь охватывает созданный Referer THttpClientSocket использует fAuthPurge, подавляет созданные Referer и Authorization после cross-origin purge и сравнивает origin через TUri.Same. Исправления mormot.net.client c94dba6c+11-11

net: some THttpRedirectOptions fixes

Влияние

При hroPurgeReferer или hroPurgeAuthorization значения больше не восстанавливаются socket fields; default не изменён.

Модули

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

12 Средний Proxy HEAD/GET сохраняют non-file status codes THttpProxyServer использует local/progressive files только для HTTP_GET_OK, отдельно выдаёт Content-Length и раньше копирует options. Исправления mormot.net.async 597eea16+9-5

net: fixed THttpProxyServer HEAD/GET response codes

Влияние

HEAD/GET callers получают origin status без file-serving logic для redirects и других responses.

Модули

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

13 Средний Ответы 204 proxy cache больше не идут в file delivery THttpProxyServer ограничивает size/progressive-file статусами 200 и 206, исключает 204 и сохраняет redirects с headers. Исправления mormot.net.async 882e3435+7-5

net: fixed 204 responses for the Proxy Cache

Влияние

Origin response без content остаётся 204 вместо обработки как файла с неверной длиной.

Модули

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

14 Средний Range probing нормализует 206, не отвергая redirects RemoteClientHead преобразует 206 от Range GET в 200; MakeHeadAndComputeFilename требует size только для 200/206 и пропускает 3xx. Исправления mormot.net.async b98df07d+8-3

net: fixed some other Proxy Cache status issues

Влияние

Dynamic resources больше не отдают искусственный 206, а redirects без Content-Length не превращаются в ошибку.

Модули

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

15 Средний Peer-cache redirects сохраняют Location header DirectFileNameHead назначает headers в Ctxt.OutCustomHeaders до проверки HTTP_GET_OK, сохраняя Location для 3xx. Исправления mormot.net.server 9b96345d+3-3

net: fixed THttpPeerCache to include Location: for 3xx redirections

Влияние

Clients могут следовать redirects через THttpPeerCache вместо 3xx без target URL.

Модули

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

16 Средний HTTP clients получили опциональную redirect security policy mormot.net.client добавляет THttpRedirectOption, THttpRedirectOptions и RedirectOptions для очистки Authorization/Cookie/Referer и запрета downgrade, cross-origin или userinfo redirects. Новые возможности mormot.net.client 492aeccf+95-18

net: new THttpRedirectOptions set of options for THttpClientSocket

Влияние

Пустой default сохраняет прежние redirects. Security-sensitive callers могут запретить перенос credentials и опасную смену destination.

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

Проверьте clients с untrusted redirects, выберите hroPurge*/hroReject* flags и включите fixes 2.4.17161.

Публичный API

  • THttpRedirectOptionadded — Добавляет шесть вариантов purge/reject.
  • THttpRedirectOptionsadded — Set значений THttpRedirectOption.
  • THttpRequestExtendedOptions.RedirectOptionsadded — По умолчанию пусто; реализовано в THttpClientSocket.

Модули

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

17 Средний SChannel buffers используют лимиты SSPI TSChannelNetTls хранит max TLS record size, начинает output с 2 KB и растит input по SECBUFFER_MISSING до лимита SSPI. Производительность mormot.lib.sspi+1 8bcdf6c9+39-13

net: refined SChannel TLS buffer size

Влияние

Обычные Windows TLS connections используют меньше памяти, а большие records растут до нужного SChannel размера.

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

18 Средний SChannel Receive централизован вокруг SSPI results Receive выносит extraction в ProcessBuffers и обрабатывает SEC_E_OK, SEC_I_RENEGOTIATE, expiry и errors одним switch; SQLite/changelog меняют только текст. Внутреннее устройство mormot.net.sock.windows+1 1ebf95e7+53-46

net: rewritten TSChannelNetTls.Receive core process

Влияние

Receive path упрощён и координирует renegotiation lock, но этот build требует следующего ProcessBuffers fix. Database behavior не меняется.

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

Не останавливайтесь на 2.4.17143; включите c6dc158f3a9e1be0dd9a06e063800365f9d4bf45 или новее.

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

19 Низкий SChannel connections начинают с меньших dynamic buffers Fixed TLSRECMAXSIZE 19 KB удалён; input/data/output начинаются с 4 KB и растут через EnsureLength. Производительность mormot.net.sock.windows f1785ad1+40-42

net: reduce TSChannelNetTls memory consumption per connection

Влияние

Windows services с множеством idle TLS connections снижают baseline memory; большие transfers растут по требованию.

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

20 Низкий Idle async connections освобождают память только один раз ReleaseMemoryOnIdle объединяет read/write/TLS cleanup под нужными locks и ставит fMemClean до следующей активности. Производительность mormot.net.async 85f08e29+32-39

net: rewritten TPollAsyncConnection.ReleaseMemoryOnIdle

Влияние

Long-idle servers выполняют меньше lock/cleanup работы, сохраняя освобождение buffers; application code не меняется.

Модули

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

21 Низкий Idle async sockets освобождают SChannel buffers ReleaseMemoryOnIdle берёт read/write locks и вызывает INetTls.ReleaseBuffers при отсутствии pending plain data. Производительность mormot.net.async a03577b9+23-4

net: idle TPollAsyncConnection release its INetTls buffers

Влияние

Windows SChannel servers возвращают TLS memory idle connections; OpenSSL остаётся no-op благодаря release mode.

Модули

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

22 Низкий SChannel renegotiation использует Windows OS lock TSChannelNetTls заменяет TLightLock на TOSLightLock вокруг Receive/Send renegotiation и удаляет redundant assignment. Производительность mormot.core.os+1 ef2fdc14+5-7

net: some TSChannelNetTls cleanup/optimization

Влияние

Blocked Windows receiver быстрее возобновляется после release lock; API и non-Windows backends не меняются.

Arnaud Bouchez · 07:17 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