Ho un servizio JSON-RPC che per una delle richieste restituisce un flusso continuo di oggetti JSON.Flusso di pacchetto continuo HTTP con Indy
I.e. :
{id:'1'}
{id:'2'}
//30 minutes of no data
{id:'3'}
//...
Naturalmente, non c'è Lunghezza del contenuto perché lo streaming è infinito.
Sto utilizzando un discendente TStream personalizzato per ricevere e analizzare i dati. Ma internamente TIdHttp
memorizza i dati e non me li trasmette fino a quando non vengono ricevuti i byte RecvBufferSize
.
Questo si traduce in:
{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
Ovviamente questo non lo farà perché il messaggio che contava 30 minuti fa avrebbe dovuto essere consegnato 30 minuti fa.
Mi piacerebbe che Indy faccia solo quello che fanno i socket: leggi fino a RecvBufferSize o meno se ci sono dati disponibili e torna immediatamente.
Ho trovato this discussion dal 2005 dove qualche povera anima ha cercato di spiegare il problema agli sviluppatori di Indy ma non lo hanno capito. (Leggilo, è uno spettacolo triste)
In ogni caso, ha lavorato attorno a questo scrivendo discendente personalizzato di IOHandler, ma questo era nel 2005, forse ci sono alcune soluzioni pronte oggi?
come Indy è open source, le fonti modificate possono (e, se utili per gli altri, dovrebbero) essere rese pubbliche – mjn
@mjn: Non lo sapevo, grazie. Aggiunto il codice. – himself