Ich habe einen JSON-RPC-Dienst, der für eine der Anforderungen einen kontinuierlichen Strom von JSON-Objekten zurückgibt.HTTP Continuous Packeted Stream mit Indy
I.e. :
{id:'1'}
{id:'2'}
//30 minutes of no data
{id:'3'}
//...
Natürlich gibt es keine Content-Length, weil der Strom ist endlos.
Ich benutze benutzerdefinierte TStream-Nachkommen zum Empfangen und Parsen der Daten. Aber intern TIdHttp
puffert die Daten und übergibt es mir nicht, bis RecvBufferSize
Bytes empfangen werden.
Daraus ergibt sich:
{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
Offensichtlich wird dies nicht tun, weil die Botschaft, die vor 30 Minuten zählte, sollte vor 30 Minuten geliefert wurden.
Ich möchte, dass Indy genau das macht, was Sockets tun: Lesen Sie RecvBufferSize oder weniger, wenn Daten verfügbar sind, und kehren Sie sofort zurück.
Ich habe this discussion von 2005 gefunden, wo einige arme Seele versucht, das Problem zu Indy-Entwicklern zu erklären, aber sie haben ihn nicht verstanden. (Lesen Sie es; es ist ein trauriger Anblick)
Wie auch immer, er arbeitete um dies zu schreiben, indem er benutzerdefinierte IOHandler Nachkommen schrieb, aber das war im Jahr 2005, vielleicht gibt es heute einige fertige Lösungen?
da Indy Open Source ist, können modifizierte Quellen (und, falls hilfreich für andere, sollten) veröffentlicht werden – mjn
@mjn: Ich wusste das nicht, danke. Der Code wurde hinzugefügt. – himself