Mam usługę JSON-RPC, która dla jednego z żądań zwraca ciągły strumień obiektów JSON.Strumień ciągły HTTP z Indy
tj. :
{id:'1'}
{id:'2'}
//30 minutes of no data
{id:'3'}
//...
Oczywiście nie ma długości treści, ponieważ strumień jest nieskończony.
Używam niestandardowego potomka TStream do odbierania i analizowania danych. Ale wewnętrznie TIdHttp
buforuje dane i nie przekazuje mi go do momentu otrzymania RecvBufferSize
bajtów.
Wynika to z:
{id:'1'} //received
{id:'2'} //buffered by Indy but not received
//30 minutes of no data
{id:'3'} //this is where Indy commits {id:'2'} to me
Oczywiście nie zrobi, ponieważ wiadomość, która liczy 30 minut temu miały zostać dostarczone 30 minut temu.
Chciałbym, aby Indy robiła dokładnie to, co robią gniazda: odczytaj do RecvBufferSize lub mniej, jeśli są dostępne dane i natychmiast wracaj.
Znalazłem this discussion z 2005 roku, gdzie jakaś biedna dusza próbowała wyjaśnić problem deweloperom Indy, ale oni go nie rozumieli. (Przeczytaj to, to smutny widok)
W każdym razie pracował nad tym, pisząc niestandardowy potomek IOHandlera, ale to było w 2005 roku, być może jest kilka gotowych rozwiązań dzisiaj?
jako Indy jest open source, zmodyfikowane źródła mogą (i, jeśli pomocne dla innych, powinny) być upublicznione – mjn
@mjn: Nie wiedziałem tego, dziękuję. Dodano kod. – himself