Resume HTTP Post / upload con Indy
Estoy tratando de reanudar una carga usando indy (HTTP Post), el código se ve así (usando Delphi 2010, Indy 10.4736):
IdHttp.Head('http://localhost/_tests/resume/large-file.bin');
ByteRange := IdHttp.Response.ContentLength + 1;
// Attach the file to post/upload
Stream := TIdMultipartFormDataStream.Create;
with Stream.AddFile('upload_file', 'D:\large-file.bin', 'application/octet-stream') do
begin
HeaderCharset := 'utf-8';
HeaderEncoding := '8';
end; // with
with IdHTTP do
begin
IOHandler.LargeStream := True;
with Request do
begin
ContentRangeStart := ByteRange;
ContentRangeEnd := (Stream.Size - ByteRange);
ContentLength := ContentRangeEnd;
ContentRangeInstanceLength := ContentLength;
end; // with
Post('http://localhost/_tests/resume/t1.php', Stream);
end; // with
pero el currículum de carga no funciona:
Miré el código de Indy, parece que esta función en IdIOHandler.pas
TIdIOHandler.Write ()
siempre trata con secuencias / archivos completos (ya que el parámetro ASize: TIdStreamSize parece ser siempre 0, lo que según el código significa enviar el archivo / secuencia completo).
Esto evita que indy reanude la carga.
Mi pregunta es: ¿es posible evitar enviar el archivo completo?
Establecer el rango de contenido no cambió nada. También modifiqué el código de Indy (3 líneas modificadas) para hacer que Indy obedezca al rango de contenido / posición de transmisión, pero es defectuoso e Indy siempre termina colgando en IdStackWindows.pas debido a un tiempo de espera infinito aquí:
TIdSocketListWindows.FDSelect ()