1.20.0
What's new in 1.20.0
IPv6 listener + poll() in SocketWaitImpl
CreateListenerSocket6 / AcceptConnection6 start a second accept thread bound to :: with IPV6_V6ONLY=1, so the existing IPv4 listener is not disturbed. On IPv4-only hosts the call returns INVALID_SOCKET_HANDLE and an error string rather than raising.
SocketWaitImpl replaces select with fpPoll / poll on FPC/UNIX and Delphi POSIX, removing the silent no-timeout fallback for file descriptors ≥ 1024.
Bounded RSS on large streaming downloads — CL3b
PushStreamData was calling Seek(0, soBeginning) after every append, destroying the read cursor that ReadResponseBodyCallback uses. The buffer grew without bound and the worker deadlocked permanently under slow-client conditions.
Fixed by saving FStreamBuf.Position before seeking to end and restoring it after the write. Gate: tests/Nghttp2FloodRead.dpr downloads 64 MB in 1 024 × 64 KB ReadChunk calls with < 8 MB peak client RSS.
Connection reuse — Reconnect, Ping, GOAWAY (CL4)
Reconnectopens a fresh session to the same host/port without reallocating the client objectPing(ATimeoutMS)submits an HTTP/2 PING frame and pumps until ACK or timeoutGoAwayReceivedproperty — set when the server sends GOAWAY- A stream closed with
REFUSED_STREAM(error 7) now gets a targeted error message pointing toReconnect
Group-B scalar wire forms — WIRE-FORM-1
TProtoMemberWireForm (pwfDefault, pwfZigZag, pwfFixed) selects the wire encoding for sint32/sint64 and the fixed/sfixed family via a second TProtoMemberAttribute constructor overload. protogen emits [TProtoMember(N, pwfZigZag)] for sint* and [TProtoMember(N, pwfFixed)] for fixed*/sfixed* automatically. The 7 googleapis schemas previously refused for Group-B scalars now compile.
Upgrade notes
The doc/ files update all corpus figures and refusal lists. Run compile-check.sh --all after upgrading to get the post-WIRE-FORM-1 acceptance count.