binance / binance/binance-fix-connector-python
[BUG] FIX Message parsing fails with 'ValueError: Field missing '=' separator.'
- Lingua principale
- Python
- Stelle
- 14
- Fork
- 12
- Metriche di merge delle PR
- Nessuna PR unita negli ultimi 30g
Descrizione
### Problem / Bug Description
When streaming market data, the `binance-fix-connector-python` library fails to parse messages occasionally with a `ValueError: Field missing '=' separator.`.
The traceback shows the error occurs during string appending in `simplefix` when an invalid (likely empty or delimiter-only) tag is passed for parsing:
ValueError: Field missing '=' separator.
Traceback (most recent call last):
File "/.../fix_connector.py", line 444, in __receive_messages
messages = self.parse_server_response()
File "/.../fix_connector.py", line 396, in parse_server_response
fix_msg.append_strings(tag_values)
File "/.../simplefix/message.py", line 444, in append_string
raise ValueError("Field missing '=' separator.")
### Logs Example (from a failed run)
*(يمكنك نسخ أجزاء من سجلات `INFO` و `ERROR` التي أرسلتها في بداية المشكلة)*
### Solution / Workaround
The issue is solved by making the tag validation stricter in `FixConnector.parse_server_response()` to filter out all invalid strings before passing them to `simplefix`.
**Proposed change in `fix_connector.py` (around line 401):**
Change from:
```python
tag_values = [x for x in raw_messages[i].split(_SOH_) if x != ""]
To:
tag_values = [x for x in raw_messages[i].split(_SOH_) if "=" in x]
Additionally, a small try/except was needed in __receive_messages to handle logging for partially received messages without a proper MsgType:
# In __receive_messages (around line 448)
for msg in messages:
try:
clean_message = msg.encode().decode("utf-8").replace(_SOH_, "|")
except ValueError:
self.logger.warning("Message decoded but could not be logged (missing MsgType: 35)")
continue
self.logger.info(
"%sServer=>Client: %s%s", GREEN, clean_message, RESET
)
This change fully resolves the streaming stability issue on a local installation.
[fix_connector.py](https://github.com/user-attachments/files/23567920/fix_connector.py)
Guida per i contributori
Nessuna guida per i contributori indicizzata per questo repository
Direzione di ricerca
Inizia in fix_connector.py, in FixConnector.parse_server_response() intorno alla riga 401 e in __receive_messages() intorno alla riga 448, quindi riproduci l’analisi dello streaming con l’input malformato segnalato. Il lavoro è completato quando i frammenti di tag non validi non raggiungono più simplefix e i messaggi ricevuti parzialmente vengono gestiti senza il ValueError segnalato.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Valutazione
- Stack tecnologico
- python
- Ambito
- api, backend
- Tipo di issue
- Bug
- Difficoltà
- 2/5
- Tempo stimato
- 1-3 ore
- Stato di attività
- Ferma
- Chiarezza
- Abbastanza chiara
- Idoneità per principianti
- 45/100