NetworkTransport drops a JSON message when a TCP receive contains a heartbeat followed by the message
I maintainer di solito rispondono entro 2 giorni
Valutazione
- Difficoltà
- 3/5
- Tempo stimato
- 1-2 giorni
- Idoneità per principianti
- 25/100
- Tipo di issue
- Bug
- Chiarezza
- Specificata chiaramente
- Stato di attività
- Ferma
- Stack tecnologico
- swift
- Ambito
- networking
Direzione di ricerca
Read NetworkTransport.receiveLoop() and the heartbeat framing logic to see how received bytes are buffered and consumed. Then inspect the transport tests for a way to deliver multiple frames in one chunk; done means a heartbeat followed by a JSON-RPC response and a later response are both delivered in order. A linked open pull request is already addressing this issue.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
NetworkTransport.receiveLoop() skips an entire received data chunk when Heartbeat.isHeartbeat(newData) returns true. This check only examines the first four bytes, so a chunk containing a heartbeat followed by a JSON-RPC message is treated entirely as a heartbeat.
How to trigger
The sender writes a 12-byte heartbeat, followed by a newline-delimited JSON-RPC message. TCP can deliver these two writes together in one receive callback:
[heartbeat][{"jsonrpc":"2.0","id":1,"result":{}}\n]
The receiver recognizes the heartbeat prefix and executes continue before reaching buffer.append(newData). The JSON-RPC message following the heartbeat is therefore discarded.
I validated this using a Python model of the relevant receive-loop logic, with a second response as a marker:
Separate chunks: heartbeat, response 1, response 2
Delivered response IDs: [1, 2]
Combined chunk: heartbeat + response 1, followed by response 2
Delivered response IDs: [2]
I also tested two separate writes over Linux TCP loopback. In 20 trials, the heartbeat and first response arrived together in one recv() call, with all bytes intact.
These checks establish that the input arrangement can occur over TCP and that the modeled receive logic drops the trailing message. I have not run the Swift SDK or Network.framework on macOS.
Impact
A JSON-RPC message following a heartbeat in the same receive chunk is not delivered through the transport’s receive stream. If it is a response, its pending request can remain unresolved until cancellation, disconnection, or an application-level timeout.
This report is limited to TCP and the case of a complete heartbeat followed by a complete JSON-RPC message in one receive callback.
my fix thought
The receiver should parse frames from buffered bytes instead of treating each receive callback as a complete application message. After identifying a complete heartbeat, it should consume only those 12 bytes and continue processing any remaining bytes.
A regression test could queue heartbeat + response 1 as one chunk, then response 2 as another, and assert that both responses are delivered in order. The same assertion should pass when the heartbeat and responses arrive separately.
If my repair strategy is right, I will open a PR to fix it.
- Lingua principale
- Swift
- Stelle
- 1.6k
- Fork
- 270
- Merge medio
- 2g 7h
- PR unite (30g)
- 15
Preparare l'ambiente
- Nessun Dockerfile né file Docker Compose
- Nessun modello di pull request
- Leggi la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di modelcontextprotocol/swift-sdk
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 73/100
modelcontextprotocol/swift-sdk#327 ·
I maintainer di solito rispondono entro 2 giorni
-
Value decoding changes data-URL-looking JSON strings into Value.dataForse già presa @bitbemol l’ha presa 73 giorni fa. Apertabug
Difficoltà 2/5 1-3 ore Idoneità per principianti 76/100
modelcontextprotocol/swift-sdk#277 ·
I maintainer di solito rispondono entro 2 giorni
-
enhancement
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 78/100
modelcontextprotocol/swift-sdk#274 ·
I maintainer di solito rispondono entro 2 giorni
-
`HTTPClientTransport` fails to build on Windows: `#if !os(Linux)` guards no longer match the `EventSource` platform conditionForse di nuovo libera Una pull request per questa issue è stata chiusa senza essere unita. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 85/100
modelcontextprotocol/swift-sdk#261 ·
I maintainer di solito rispondono entro 2 giorni
-
Client.withBatch leaves per-request tasks pending when transport.send throwsForse già presa @bbdu3 l’ha presa 1 giorno fa. Aperta
Difficoltà 4/5 3-5 giorni Idoneità per principianti 55/100
modelcontextprotocol/swift-sdk#324 · 2 commenti · 1 reazione ·
I maintainer di solito rispondono entro 2 giorni
Tutte le issue di modelcontextprotocol/swift-sdk
Issue simili
-
[java] TestClassWithoutTestCases: document that abstract classes and interfaces are not checkedAperta
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 91/100
I maintainer di solito rispondono entro 2 giorni
-
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 78/100
I maintainer di solito rispondono entro 1 giorno
-
文件夹设置bugAperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 62/100
joeseesun/qiaomu-jot#14 ·
I maintainer di solito rispondono entro 1 giorno
-
30-minutes algorithm any-language beginner-friendly c community cpp csharp data-structures go good first issue hacktoberfest help wanted kotlin learning leetcode php ruby rust swift
Difficoltà 2/5 Meno di un'ora Idoneità per principianti 85/100
Huerte/algo-solutions-python#211 ·
I maintainer di solito rispondono entro 1 giorno
-
area: build-and-ci S3: minor
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
manaflow-ai/cmux#39902 ·
I maintainer di solito rispondono entro 1 giorno