Hallo, ich arbeite mit der TIdHTTP Komponente um Daten auszutauschen. Die serverseitige Protokollbeschreibung lautet (gekürzt, Entwicklungsinformationen) wie folgt:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| [...] The connection is kept open until the update procedure is finished; there’s no need to poll. The [...] sends one line of output at each time that it is able to re-calculate the remaining work with good confidence (there’s no guarantee for a maximum time period or percentage granularity when the progress estimation is updated). [...] > GET /software/update/123456789abcdef/progress HTTP/1.1 > < HTTP/1.1 200 OK < Content-Type: text/plain; charset=UTF-8 < < 134.0 < 130.5 < 127.0 ... time passes ... < 9.0 < 3.0 < 0.0 <
Note that [...] doesn’t send a Content-Length header for the streaming response. The response is complete when the [...] drops the connection. |
Dabei bedeutet ">" vom Client zum Server und "<" vom Server zum Client. Nun bekomme ich zwei solcher Pakete mit dem zeitlichen Abstand von ca. 5,5 Sekunden. Die Information aus dem ersten Paket wird angezeigt, die aus dem zweiten nicht. Die HTTP Verbindung baue ich folgendermaßen auf:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| try httpMonitorConnector.ReadTimeout := 200; httpMonitorConnector.ConnectTimeout := 0; httpMonitorConnector.Response.KeepAlive := True; httpMonitorConnector.Get( '/software/update/' + Connector.ip + ' ' + location + 'progress' ); except on E: EIdReadTimeout do begin MemoLogger.AddToLog( 'Exception as expected: ' + E.ClassName + ' ' + E.Message ); end; end; |
Die Abfrage die ich durch einen Timer durchführe sieht so aus:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| a := -1; if Assigned( httpMonitorConnector.IOHandler ) then begin httpMonitorConnector.IOHandler.CheckForDataOnSource( 5 ); a := httpMonitorConnector.IOHandler.InputBuffer.Size; if ( httpMonitorConnector.IOHandler.InputBuffer.Size > 0 ) then MemoLogger.AddToLog( httpMonitorConnector.IOHandler.ReadLn ); end; logger.Debug( '< Monitor Timer ticked: Assigned: ' + BoolToStr( Assigned( httpMonitorConnector.IOHandler ), True ) + ' Size: ' + IntToStr( a ) ); |
Jetzt weiß ich einfach nicht, warum das erste Paket korrekt angenommen wird, das zweite jedoch nicht? Weitere Pakete kommen dann auch nicht, aber ich denke das Problem liegt eher serverseitig. Wäre es evt. möglich, dass die TCP Verbindung abgebaut wird? Aus Gründen die mir bisher nicht bekannt sind? Falls jemand eine Idee hat, immer her damit!
Danke,
Stephan