Требует действийможет затронуть работающую систему
HTTP-автоматы стабилизированы, а закрытие Unix-клиента больше не удаляет сокет сервера
Этот сетевой выпуск завершает крупную переработку HTTP-клиентов и таймаутов, а затем исправляет обнаруженные регрессии конструкторов, proxy, WebSocket и native backends. HTTP framing теперь отделяет семантику ответа HEAD от тела запроса, Windows HTTP.sys принимает chunked uploads и повторные заголовки аутентификации или cookie, а POSIX-клиент при закрытии больше не удаляет Unix-domain socket сервера.
Коротко
- POSIX Unix-domain clients no longer unlink the server socket path when they close.
- HTTP.sys now accepts chunked request bodies and preserves repeated Set-Cookie and authentication headers.
- HEAD and OPTIONS handling now follows message framing; redirected 301 POST and 303 requests also discard their old bodies.
- THttpRequestExtendedOptions.GetTimeouts is replaced by ComputeTimeouts, THttpRequest.InternalConnect loses its parameters, and TCrtSocket.ReOpen no longer accepts a timeout.
- TRestHttpClientGeneric connection-definition parsing no longer risks an infinite loop.
- Land on final build 2.4.17433 rather than an intermediate build from this refactor sequence.
Рекомендации по обновлению
Переходите на финальный build 2.4.17433, а не на промежуточный build этого выпуска: последующие коммиты исправляют конструкторы, setters таймаутов, выбор proxy, разбор REST definitions, тела при redirect и HTTP server state. Обновление особенно важно для POSIX Unix sockets и Windows HTTP.sys. Перед сборкой найдите THttpRequestExtendedOptions.GetTimeouts, параметризованные overrides THttpRequest.InternalConnect и TCrtSocket.ReOpen(timeout).
36 из 36 записей · 37 коммитов в апстриме
1
Критический
Reuse HTTP options больше не читает за пределами auth record
THttpClientSocket.SameOpenOptions передаёт в THttpRequestExtendedOptions.SameAuth @aOptions вместо @aOptions.Auth, предоставляя ожидаемый base pointer и устраняя wrong memory access.
Исправления
mormot.net.client
b466ee53+3-3
net: fixed wrong memory access in THttpClientSocket.SameOpenOptions
Влияние
Проверки reuse HTTP clients в Delphi/FPC больше не читают чужую память, избегая неверного сравнения auth и возможного access violation.
Рекомендуется обновиться
Не разворачивайте непосредственно предыдущий intermediate build; проверьте authenticated keep-alive reuse на 2.4.17433.
Модули
2
Высокий
Хранение socket timeouts упрощено, а ReOpen лишился параметра
TCrtSocket заменяет fallback-поля конкретными connect/send/receive значениями, отслеживает применённые SO_*TIMEO, копирует настройки через SetTimeoutsFrom и меняет ReOpen(aTimeout) на ReOpen без параметров со stored values.
Несовместимые изменения
mormot.net.sock
7f8a625b+114-155
net: rewritten TCrtSocket timeouts implementation
Влияние
Вызовы ReOpen с таймаутом больше не компилируются. Приложения Delphi/FPC должны задать ConnectTimeout, SendTimeout и ReceiveTimeout до ReOpen; запись TimeOut теперь устанавливает все три.
Требуется миграция
Замените ReOpen(timeout) на присваивание timeout properties и вызов ReOpen, затем проверьте accepted sockets и proxy/TLS reconnects.
Публичный API
TCrtSocket.ReOpensignature-changed — Параметр timeout удалён; используются сохранённые фазовые таймауты.TCrtSocket.SetTimeoutsFromaddedTCrtSocket.TimeOutbehaviour-changed — Запись теперь устанавливает все три фазовых таймаута.
Модули
3
Высокий
Расширенные HTTP options теперь вычисляют конкретные таймауты
THttpRequestExtendedOptions.GetTimeouts удалён, а ComputeTimeouts записывает отсутствующие фазовые значения из HTTP defaults или CreateTimeoutMS. THttpClientSocket копирует их в TCrtSocket, а reuse соединения больше не сравнивает таймауты.
Несовместимые изменения
mormot.net.client
3d81851d+42-45
net: fixed THttpClientSocket timeouts usage
Влияние
Прямые вызовы GetTimeouts перестают компилироваться в Delphi и FPC и должны перейти на mutating-метод ComputeTimeouts. Изменение только таймаутов больше не вызывает reconnect HTTP socket.
Требуется миграция
Замените GetTimeouts на ComputeTimeouts, затем читайте ConnectTimeoutMS, SendTimeoutMS и ReceiveTimeoutMS из record.
Публичный API
THttpRequestExtendedOptions.GetTimeoutsremovedTHttpRequestExtendedOptions.ComputeTimeoutsadded
Модули
4
Высокий
HTTP backend overrides теперь читают options из экземпляра
THttpRequest.InternalConnect теряет три параметра timeout; overrides WinHTTP, WinINet, Curl и Delphi NetHTTP читают fExtendedOptions. Конструктор инициализирует URI и options до вызова virtual-метода без параметров.
Несовместимые изменения
mormot.net.client
edbd697a+39-43
net: rewritten THttpRequest.InternalConnect method
Влияние
Пользовательские потомки THttpRequest с override InternalConnect не соберутся в Delphi/FPC, пока не обновят сигнатуру и чтение таймаутов.
Требуется миграция
Измените overrides на procedure InternalConnect; и читайте fExtendedOptions.ConnectTimeoutMS, SendTimeoutMS и ReceiveTimeoutMS.
Публичный API
THttpRequest.InternalConnectsignature-changed
Модули
5
Высокий
Redirects и 100-Continue теперь корректно обрабатывают тело
THttpClientSocket очищает Data, DataMimeType и InStream, когда 301 POST или подходящий 303 превращается в GET, формирует headers для входного stream, а сервер отправляет 100 Continue только при Content-Length или chunked framing.
Исправления
mormot.net.async+2
bdb952f3+27-23
net: some client/server HTTP state machine fixes
Влияние
Redirected запросы Delphi/FPC больше не отправляют старые entity data с переписанным GET, а сервер не приглашает клиента передавать тело без framing.
Рекомендуется обновиться
Повторно проверьте streamed uploads, POST-to-GET redirects, 303 и клиентов Expect: 100-Continue.
6
Высокий
Разбор REST connection definition больше не зацикливается
TRestHttpClientGeneric.RegisteredClassCreateFrom заменяет цепочку UrlDecode на UrlDecodeNextNameValue, продвигаясь для каждой пары name/value перед обработкой известных options.
Исправления
mormot.crypt.secure+1
9292c506+27-20
rest: fixed TRestHttpClientGeneric.RegisteredClassCreateFrom
Влияние
Клиенты Delphi и FPC из TSynConnectionDefinition больше не зависают, если DatabaseName содержит options, мимо которых старая цепочка не продвигалась.
Рекомендуется обновиться
Повторно проверьте сохранённые REST connection definitions, включая неизвестные и URI-encoded options.
7
Высокий
OPTIONS может содержать данные; только HEAD подавляет response body
HTTP client/server code заменяет HttpMethodWithNoBody на IsHead для response bodies и checks framing для request bodies. Curl больше не включает CURLOPT_NOBODY для OPTIONS.
Исправления
mormot.net.acme+3
f119fd8c+18-19
net: only HEAD has no body - OPTIONS could
Влияние
Серверы Delphi/FPC теперь читают framed bodies OPTIONS, а клиенты получают response content. Приложения, считавшие OPTIONS bodyless, могут увидеть новые данные.
Рекомендуется обновиться
Проверьте OPTIONS endpoints с request/response body, а также HEAD responses и framed HEAD requests.
8
Высокий
Curl request options корректно сбрасываются и восстанавливают TLS verification
TCurlHttp всегда задаёт coFollowLocation по RedirectMax и явно восстанавливает coSSLVerifyPeer/coSSLVerifyHost, если certificate errors не игнорируются, затем применяет client certificate или custom CA.
Исправления
mormot.net.client
cf40c09d+19-15
net: several fixes to TCurlHttp options usage
Влияние
Повторно используемые Curl handles больше не сохраняют redirect или ослабленный TLS state предыдущего запроса. POSIX Delphi/FPC Curl clients снова выполняют configured verification.
Рекомендуется обновиться
Проверьте mixed requests с чередованием redirect и TLS verification на одном Curl client.
Модули
9
Высокий
Массовое обновление таймаутов теперь вызывает setters подклассов
TCrtSocket.SetTimeouts восстановлен как public helper: задаёт ConnectTimeout и вызывает virtual SetSendTimeout/SetReceiveTimeout. SetTimeoutsFrom и DoCreate используют этот путь, чтобы выполнялись WebSocket overrides.
Исправления
mormot.net.client+1
93002192+18-16
net: fixed TCrtSocket virtual timeout setters call
Влияние
THttpClientWebSockets теперь синхронизирует CallbackAnswerTimeOutMS при назначении через base helpers. Setter hooks подклассов Delphi/FPC снова вызываются.
Рекомендуется обновиться
Проверьте WebSocket callback timeouts через TimeOut, SetTimeouts и copied socket options.
10
Высокий
HTTP servers читают любое framed request body, включая HEAD
Sync и async server paths запускают streaming и DownloadBody по Content-Length или Transfer-Encoding вместо исключения HEAD. Async 100-Continue ограничен состояниями ожидания тела.
Исправления
mormot.net.async+1
0e0af8c7+14-19
net: fixed body retrieval on HTTP servers logic
Влияние
Байты framed request последовательно потребляются, предотвращая рассинхронизацию протокола на keep-alive даже для HEAD. Исправление полезно Delphi и FPC server backends.
Рекомендуется обновиться
Добавьте framed HEAD requests в regression tests keep-alive и OnBodyDownload.
11
Высокий
Закрытие Unix-domain клиента больше не удаляет сокет сервера
TCrtSocket.Close теперь вызывает fpunlink для nlUnix только при fWasBind. Тест подключает клиента к bound path и проверяет, что файл удаляется лишь при освобождении сервера.
Исправления
mormot.net.sock+1
5b58dd54+19-2
net: TCrtSocket.Close only deletes a unix socket file it bound itself
Влияние
На POSIX Delphi и FPC отключение клиента больше не делает живой Unix-domain server недоступным для новых клиентов из-за удаления filesystem entry.
Рекомендуется обновиться
Приоритетно обновите Unix-domain socket deployments и проверьте сохранение bound pathname при частых подключениях клиентов.
Публичный API
TCrtSocket.Closebehaviour-changed
12
Высокий
WinINet применяет таймауты к session handle
TWinINet.InternalConnect вызывает InternetSetOption для fSession вместо ещё не созданного fConnection и явно сообщает ошибку настройки connect/send/receive timeout.
Исправления
mormot.net.client
94043c0a+11-8
net: fixed TWinINet.InternalConnect timeouts setting
Влияние
Windows WinINet clients теперь реально получают phase timeouts вместо тихого вызова API с nil handle. Ошибка настройки видна Delphi callers.
Рекомендуется обновиться
Проверьте connect, upload и response timeout на backend WinINet.
Модули
13
Высокий
HTTP construction вызывает backend после полной инициализации
THttpRequest.DoInternalConnect задаёт fHttps до выбора default port и восстанавливает пропущенный вызов InternalConnect после вычисления options.
Исправления
mormot.net.client
9482ca12+4-3
net: fixed previous THttpRequest commit
Влияние
HTTPS снова использует порт 443 по умолчанию, а native HTTP backends действительно открывают sessions. Исправлен предыдущий refactor для Delphi/FPC.
Рекомендуется обновиться
Пропустите build 2.4.17413 и используйте final build после проверки HTTP/HTTPS constructors.
Модули
14
Высокий
HTTP.sys servers теперь принимают chunked request bodies
THttpApiServer.DoExecute теперь различает известный Content-Length и transfer-encoded input, читает chunked данные через повторно используемый buffer 128 КБ, контролирует MaximumAllowedContentLength и учитывает фактически полученные bytes.
Новые возможности
mormot.lib.winhttp+1
7baf2887+77-54
net: let http.sys server support chunked input body
Влияние
Windows HTTP.sys backends принимают HTTP/1.1 chunked uploads вместо отказа или обрезания. Слишком большие тела неизвестной длины получают 413, ошибки приёма — 406.
Рекомендуется обновиться
Проверьте chunked uploads около MaximumAllowedContentLength, application limits и обработку 413.
15
Высокий
HTTP constructors используют общий initialization path для backends
THttpRequest добавляет DoInternalConnect для URI fields, user agent и таймаутов до backend virtual call; Curl берёт большее send/receive для global transfer timeout, Delphi NetHTTP читает consolidated proxy option.
Внутреннее устройство
mormot.net.client
70951dd7+28-29
net: several fixes to THttpRequest.Create
Влияние
Все native backends следуют общей последовательности, но этот intermediate refactor потребовал следующего коммита для backend call и HTTPS port.
Стоит взглянуть
Модули
16
Средний
Socket receive применяет таймаут к каждой попытке
TCrtSocket.TrySockRecv вычисляет deadline для каждого Recv, принудительно ставит zero wait при SockInPending и ограничивает remaining value перед select/poll.
Исправления
mormot.net.sock
0f8d2fcd+15-13
net: rewritten TCrtSocket.TrySockRecv timeout logic
Влияние
Receive waits в Delphi/FPC соблюдают ReceiveTimeout на low-level attempt, а pending-buffer probes остаются non-blocking.
Стоит взглянуть
Модули
17
Средний
HTTP redirects сохраняют методы кроме определённых преобразований в GET
TAcmeLetsEncryptServer использует 301 для GET/HEAD и 308 иначе. THttpClientSocket преобразует только POST при 301 и все методы кроме HEAD при 303; явно заданное тело HEAD больше не отбрасывается.
Исправления
mormot.net.acme+2
8a6da8b7+14-12
net: other HTTP HEAD support related fixes
Влияние
Клиенты Delphi/FPC сохраняют PUT, DELETE и другие методы при 301 и следуют 303; ACME redirect на HTTPS сохраняет non-GET методы через 308.
Стоит взглянуть
18
Средний
Socket sends используют monotonic deadline на попытку
TCrtSocket.TrySndLow вычисляет end tick через GetTickCount64 для каждой Send-попытки и передаёт остаток fSendTimeout в WaitFor вместо legacy TimeOut.
Исправления
mormot.net.sock
b05f8522+12-8
net: rewritten TCrtSocket.TrySndLow timeout/wait logic
Влияние
Blocked sends в Delphi/FPC точнее соблюдают send timeout и не начинают полный wait заново после времени, уже потраченного в Send.
Стоит взглянуть
Модули
19
Средний
Pending buffered reads подавляют wait без изменения socket timeouts
TCrtSocket добавляет internal flag fSockInPending вокруг InputSock; SockInRead и TrySockRecv используют его для подавления retry waits без изменения SO_RCVTIMEO и fReceiveTimeout.
Исправления
mormot.net.sock
057aff56+7-9
net: fixed TCrtSocket.SockInPending from InputSock()
Влияние
SockInPending остаётся non-blocking без временного изменения logical receive timeout, повышая consistency buffered sockets Delphi/FPC.
Стоит взглянуть
Модули
20
Средний
WebSocket setup перенесён в общий socket initialization hook
THttpClientWebSockets заменяет override конструктора на DoCreate, вызывает inherited DoCreate, инициализирует settings и берёт CallbackAnswerTimeOutMS из fReceiveTimeout.
Исправления
mormot.net.ws.client
7ceaa39c+6-8
net: fixed THttpClientWebSockets constructor
Влияние
Каждый inherited constructor теперь один раз инициализирует WebSocket settings через virtual hook в Delphi/FPC, без пропуска или дублирования.
Стоит взглянуть
Модули
21
Средний
Curl может явно отключать унаследованные proxy settings
При THttpRequestExtendedOptions.Proxy='none' TCurlHttp передаёт в CURLOPT_PROXY non-nil empty string; пустая option оставляет environment defaults Curl, реальное значение выбирает proxy.
Исправления
mormot.net.client
68b62f05+8-5
net: fixed TCurlHttp proper 'none' proxy support
Влияние
POSIX Curl requests надёжно обходят HTTP_PROXY и связанные environment settings. Delphi/FPC callers продолжают использовать документированное значение 'none'.
Стоит взглянуть
Модули
22
Средний
WinINet открывает user-agent и proxy values в Unicode
TWinINet.InternalConnect преобразует user agent, proxy и bypass list из RawUtf8 в SynUnicode и вызывает InternetOpenW вместо InternetOpenA.
Исправления
mormot.net.client
3851e090+8-5
net: fixed TWinINet Unicode options support
Влияние
Windows Delphi clients сохраняют non-ASCII user-agent и proxy config вместо active ANSI code page. FPC non-Windows paths не затронуты.
Стоит взглянуть
Модули
23
Средний
Windows basic Kerberos authentication использует полный server context
TBasicAuthServerKerberos ограничивает single-pass shortcut onlypass системой POSIX GSSAPI; Windows теперь идёт через ServerSspiAuth context, нужный SSPI и optional group SID checks.
Исправления
mormot.net.ldap+1
8fc28980+7-6
net: fixed TBasicAuthServerKerberos on Windows
Влияние
Windows Delphi servers больше не используют GSSAPI-only shortcut при basic Kerberos password validation. POSIX FPC behavior сохранён.
Рекомендуется обновиться
Проверьте Windows basic Kerberos logins с group SID restrictions и без них.
24
Средний
Выбор system proxy теперь проверяет host назначения
GetSystemProxyUri использует TUri.Server вместо Address при исключении empty, loopback и plain IPv4 destinations из proxy.
Исправления
mormot.net.client+1
d8e97dc6+5-6
net: fixed GetSystemProxyUri()
Влияние
HTTP clients больше не выбирают proxy по URL path. Localhost и configured direct-IPv4 traffic должны обходить proxy в Delphi и FPC.
Рекомендуется обновиться
Проверьте localhost, literal IPv4 и обычные hostname requests с automatic proxy discovery.
25
Средний
ACME GET redirects используют 301 вместо 308
TAcmeLetsEncryptServer.Redirect направляет GET вместе с HEAD в ветку 301 Moved Permanently, оставляя 308 с сохранением метода для остальных.
Исправления
mormot.net.acme
9cd6ccba+5-4
net: fixed GET redirection on TAcmeLetsEncryptServer
Влияние
Обычный GET traffic браузеров и ACME получает conventional permanent redirect. Изменения application code Delphi/FPC не нужны.
Модули
26
Средний
HTTP.sys сохраняет повторные authentication challenges раздельно
HTTP_RESPONSE.AddCustomHeader обрабатывает WWW-Authenticate и Proxy-Authenticate как Set-Cookie и Connection, отправляя каждое значение через unknown headers вместо одного known-header slot.
Исправления
mormot.lib.winhttp
37898a45+6-3
net: http.sys respWwwAuthenticate + respProxyAuthenticate multiple headers
Влияние
Windows HTTP.sys responses могут объявлять несколько authentication schemes без потери последующих значений. Изменения Delphi/FPC callers не нужны.
Стоит взглянуть
Модули
27
Средний
HTTP.sys сохраняет каждый Set-Cookie header
HTTP_RESPONSE.AddCustomHeader отправляет respSetCookie через массив unknown headers, сохраняя повторные Set-Cookie вместо перезаписи в одном known-header field.
Исправления
mormot.lib.winhttp
ed828cab+5-4
net: fixed several respSetCookie / Set-Cookie: values in http.sys
Влияние
Приложения Windows HTTP.sys с несколькими cookies в одном response теперь доставляют их все. Другие Delphi/FPC HTTP server backends не затронуты.
Рекомендуется обновиться
Повторно проверьте login/session responses с несколькими строками Set-Cookie.
Модули
28
Средний
WebSocket callback waits следуют effective receive timeout
THttpClientWebSockets инициализируется через DoCreate, а SetReceiveTimeout задаёт CallbackAnswerTimeOutMS из stored fReceiveTimeout после inherited setter.
Исправления
mormot.net.ws.client
881d1c4e+4-4
net: fixed THttpClientWebSockets with new timeouts
Влияние
WebSocket callback waits теперь соответствуют effective receive timeout после normalization в Delphi/FPC clients.
Стоит взглянуть
Модули
29
Средний
Списки proxy bypass сохраняются при сериализации options
THttpRequestExtendedOptions.Save сохраняет ProxyByPass под ключом pb, а Load восстанавливает его вместе с proxy, auth, TLS и timeout fields.
Исправления
mormot.net.client
ac6bc5d6+5-2
net: fixed THttpRequestExtendedOptions.ProxyByPass serialization
Влияние
Код Delphi/FPC с persisted HTTP options больше не теряет proxy bypass list после загрузки. Старые данные без нового ключа остаются читаемыми.
Стоит взглянуть
Модули
30
Средний
Extended HTTP options получили proxy bypass list
THttpRequestExtendedOptions добавляет public ProxyByPass, THttpRequest удаляет duplicate storage, а WinHTTP, WinINet и Curl читают proxy через options record.
Новые возможности
mormot.net.client
2febb8e3+19-19
net: introducing THttpRequestExtendedOptions.ProxyBypass field
Влияние
Delphi/FPC callers с extended-options constructor теперь могут напрямую задать native proxy bypass list. Существующие constructor parameters остаются.
Стоит взглянуть
Публичный API
THttpRequestExtendedOptions.ProxyByPassadded
Модули
31
Средний
Chunked uploads HTTP.sys геометрически наращивают buffer
Путь chunked body сохраняет первый блок напрямую и растит InContent через NextGrow перед копированием следующих блоков вместо realloc на каждом receive.
Производительность
mormot.net.server
c8d7648a+11-5
net: optimized memory allocation for http.sys #637 chunked input body
Влияние
Крупные или фрагментированные chunked uploads в Windows HTTP.sys выполняют меньше аллокаций и копирований. Интерфейсы Delphi/FPC не меняются.
Модули
32
Средний
Неоднозначный helper bodyless-method помечен deprecated
HttpMethodWithNoBody помечен deprecated; документация направляет response logic к IsHead, а наличие request body — к message framing.
Устаревание
mormot.net.http
a65a05fa+6-8
net: marked HttpMethodWithNoBody() as deprecated
Влияние
Delphi/FPC callers получают deprecation warning. Сохранение helper может оставить неверное предположение, что OPTIONS не имеет тела.
Стоит взглянуть
Публичный API
HttpMethodWithNoBodydeprecated
Модули
33
Средний
REST HTTP clients переходят на consolidated timeout record
TRestHttpClientGeneric записывает connect/send/receive в fExtendedOptions и вызывает ComputeTimeouts в constructors и загрузке definitions; proxy strings остаются RawUtf8 без ANSI conversion.
Внутреннее устройство
mormot.rest.http.client
f54c3e10+17-37
rest: rewritten TRestHttpClient with latest changes
Влияние
REST HTTP clients используют те же timeout defaults, что native clients, и сохраняют non-ASCII proxy text. Public Delphi/FPC syntax не меняется.
Стоит взглянуть
Модули
34
Средний
REST HTTP clients хранят proxy только в extended options
TRestHttpClientRequest удаляет дубли fProxyName/fProxyByPass, сериализует значения из fExtendedOptions и создаёт THttpRequest через overload TUri plus options.
Внутреннее устройство
mormot.rest.http.client
bdfe38d5+16-14
rest: removed TRestHttpClientRequest fProxyName/fProxyPass fields
Влияние
Proxy settings получают один source of truth в REST clients Delphi/FPC. Public constructors и connection definitions сохраняют интерфейс.
Стоит взглянуть
Модули
35
Низкий
Async connections соблюдают configured loopback policy
TAsyncConnection.Create и Recycle передают RemoteIPLocalHostAsVoidInServers в TNetAddr.IP вместо постоянного преобразования loopback в пустой RemoteIP.
Исправления
mormot.net.async+1
16543664+7-7
net: TAsynConnection follow RemoteIPLocalHostAsVoidInServers
Влияние
Delphi/FPC async servers теперь могут сообщать 127.0.0.1 при false global policy, как sync servers. Миграция кода не нужна.
36
Низкий
Тесты методов теперь покрывают конкретные predicates HTTP-кода
test.core.base удаляет assertions HttpMethodWithNoBody и добавляет явные positive/negative cases для IsGet, IsPost, IsPut, IsDelete, IsHead и IsOptions.
Тесты
test.core.base
a166d116+31-15
tests: remove HttpMethodWithNoBody() but use really used methods
Влияние
Это только test coverage изменения semantics; сам коммит не меняет application code Delphi или FPC.