binance / binance/binance-fix-connector-python

[BUG] FIX Message parsing fails with 'ValueError: Field missing '=' separator.'

Aperta
#7 2 commenti 0 reazioni 0 assegnatari Vedi su GitHub
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

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.