Einzelnen Beitrag anzeigen

philipp.hofmann
Online

Registriert seit: 21. Mär 2012
Ort: Hannover
860 Beiträge
 
Delphi 10.4 Sydney
 
#1

TNetHTTPRequest: Fehler 12030 beim Herunterladen von mp4-Video-Dateien

  Alt 26. Okt 2021, 12:28
Hi,

in meiner Anwendung werden relativ viele Dateien durch den User heruntergeladen. Das meiste sind mp3-Musik-Dateien, ein Teil kleinere XML-Dateien. Alles problemlos.
Ein Teil der Dateien sind relativ große Video-Dateien (aber kleiner <2 GB). Bei den meisten Kunden funktioniert dies problemlos.

Aber bei einem Kunden werden diese Downloads mit dem folgenden Fehler beendet:

Code:
20:36:36.711 10664-Info Download: https://webdav.hidrive.strato.com/users/ictrainerdownloader/downloads/media/freeMedia/gpx/Climb/Mallorca - Monestir de Lluc (Pollenca).mp4
20:36:36.755 10664-Info Create file to download E:\icTrainer\downloads\media\freeMedia\gpx\Climb\Mallorca - Monestir de Lluc (Pollenca).mp4.tmp 1 of 1
20:36:36.886 10664-Info Download file E:\icTrainer\downloads\media\freeMedia\gpx\Climb\Mallorca - Monestir de Lluc (Pollenca).mp4 1 of 1
20:36:50.218 4260-Info Mallorca - Monestir de Lluc (181,7-531,1 MB 34% -> 23.6MB/s)
20:37:31.204 4260-Info Error during download: Fehler beim Lesen der Daten: (12030) Die Serververbindung wurde aufgrund eines Fehlers beendet
Es spielt dabei keine Rolle, ob das ganze innerhalb eines Threads oder im MainThread ausgeführt wurde.
Was kann man hier noch ausprobieren?

Delphi-Quellcode:
var
  Http: TNetHTTPClient;
  httpRequest: TNetHTTPRequest;
begin
  HttpClient:=TNetHTTPClient.create(nil);
  HttpClient.OnAuthEvent:=NetHTTPClientAuthEvent;
  HttpClient.OnReceiveData:=NetHTTPClientReceiveData;
  HttpClient.OnRequestError:=NetHTTPClientRequestError;
  HttpClient.ConnectionTimeout:=180.000;//3 min
  HttpClient.ResponseTimeout:=1800000;//30 min
  for i:=0 to list.count - 1 do
  begin
    httpRequest:=TNetHTTPRequest.create(nil);
    try
      httpRequest.Client:=HttpClient;
      httpRequest.Asynchronous:=False;
      HttpRequest.ConnectionTimeout:=180000;//3 min
      HttpRequest.ResponseTimeout:=1800000;//30 min
      ms:=TFileStream.create(list[i].localFilename + '.tmp', fmCreate or fmOpenReadWrite);
     try
        try
          httpRequestHasError:=false;
          httpRequest.get(StringReplace(StringReplace(StringReplace(list[i].remoteFilename, ' ', '%20', [rfReplaceAll]),
                                                                                            '´', '%C2%B4', [rfReplaceAll]),
                                                                                            '`', '%60', [rfReplaceAll]), ms);
          if (httpRequestHasError) then
            raise Exception.Create(httpRequestHasErrorText);
        except
           on E: System.SysUtils.Exception do
              begin
             //retry
              end;         
         end;
      finally
        ms.Free;
     end;
   finally
      httpRequest.Free();
    end;
  end;
  Http.Free();
end;
  
procedure NetHTTPClientRequestError(const Sender: TObject; const AError: String);
begin
  mlog.info('Error during download: ' + AError);
  httpRequestHasErrorText:='Error during download: ' + AError;
  httpRequestHasError:=true;
end;

procedure NetHTTPClientAuthEvent(const Sender: TObject; AnAuthTarget: TAuthTargetType; const ARealm, AURL: string; var AUserName, APassword: string; var AbortAuth: Boolean; var Persistence: TAuthPersistenceType);
begin
  AUserName:='xxx';
  APassword:='yyy';
end;

procedure TicTrainerF.NetHTTPClientReceiveData(const Sender: TObject; AContentLength, AReadCount: Int64; var Abort: Boolean);
begin
end;
  Mit Zitat antworten Zitat