Hi Brian,

I build a "fake stream" for that. Derived from TMemoryStream, but actually just a wrapper around a basic TStream class.

The only troublesome thing is that synapse uses the same string for up- and downloaded data

Cheers,
Benito



On 04/15/2017 01:29 AM, brian - wrote:
Other than that maybe you could just add a little modification to the HTTPSend class to work with TFileStream instead then you can avoid all that mess.

On 15 April 2017 at 01:28, brian - <hikarito...@gmail.com <mailto:hikarito...@gmail.com>> wrote:

    You will need to work with the Status event, capturing data read
    and then deciding a threshold to flush the buffer to a file and
    clear it

    I made a custom class/wrapper for this

    Type
       TOnReceiveData = procedure(Len,Max: Int64) of object;

    Var
        DownloadSize: Int64;
        xOnReceiveData: TOnReceiveData;

    Type TSynHTTP = class(TObject)

    Sock.OnStatus  := Status;

    //Callback function for status events
    procedure TSynHTTP.Status(Sender: TObject; Reason:
    THookSocketReason; const Value: String; const ValueInt: Int64);
    Var V, currentHeader: String;
        i: integer;
      function GetSizeFromHeader(Header: String): integer;
      Var item: TStringList;
      begin
        //the download size is contained in the header (e.g.:
    Content-Length: 3737722)
        Result := -1;

        if Pos('Content-Length:', Header) <> 0 then begin
          item := TStringList.Create();
          item.Delimiter := ':';
          item.StrictDelimiter :=true;
          item.DelimitedText   :=Header;
          if item.Count = 2 then begin
            Result:= StrToInt(Trim(item[1]));
          end;
        end;
      end;
    begin
      //try to get filesize from headers
      if Assigned(xOnReceiveData) then
      if (DownloadSize < 1) then begin
        for i := 0 to hSock.Headers.Count - 1 do begin
          currentHeader := hSock.Headers[i];
          DownloadSize  := GetSizeFromHeader(currentHeader);
          if DownloadSize <> -1 then break;
        end;
      end;

      //HR_ReadCount contains the number of bytes since the last event
      if Reason = THookSocketReason.HR_WriteCount then begin
        if Assigned(xOnSendData) then xOnSendData(ValueInt);
      end;
      if DownloadSize > 0 then
      if Reason = THookSocketReason.HR_ReadCount then begin
        if Assigned(xOnReceiveData) then
    xOnReceiveData(ValueInt,DownloadSize);
      end;
    end;

    So with this you will get a trigger as received data piles up,
    ValueInt = amount of data received on this trigger, let's say 8
    KB, then you capture the event and sum up until you reach
    something like 50 MB, then write to a file and clear the
    HTTPSend.Document stream, repeat until download is finished.

    On 23 January 2017 at 17:45, Rainer Backes <rbac...@bond.de
    <mailto:rbac...@bond.de>> wrote:

        Hi,

        I would need a function/method to download a file via
        http/https directly to disk, without using the memory stream
        inside the THTTPSend class - the files that I have to download
        can be quite large (some GBs). Does anyone already have such a
        function ?

        Thanks

        Rainer

        
------------------------------------------------------------------------------
        Check out the vibrant tech community on one of the world's most
        engaging tech sites, SlashDot.org! http://sdm.link/slashdot
        _______________________________________________
        synalist-public mailing list
        synalist-public@lists.sourceforge.net
        <mailto:synalist-public@lists.sourceforge.net>
        https://lists.sourceforge.net/lists/listinfo/synalist-public
        <https://lists.sourceforge.net/lists/listinfo/synalist-public>





------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot


_______________________________________________
synalist-public mailing list
synalist-public@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/synalist-public

------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
synalist-public mailing list
synalist-public@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/synalist-public

Reply via email to