On Monday, 25 March 2019 at 16:25:37 UTC, cptgrok wrote:
Am I doing something wrong or is there some issue with curl or something else? I'm pretty new to D and I'm not sure if I need to go right down to raw sockets and re-invent the wheel or if there is some other library that can help. If I get this working, it could potentially save myself and many others hours per week.

There is a limit of 50 concurrent messages per thread [1] in byLineAsync also the transmitBuffers argument takes part in. So using multiple byLineAsync at same time/thread is going to block the process, I'm not sure if this is a bug or is by design.

You could use download() in a parallel foreach, something like this:

import std.stdio;
import std.parallelism;
import std.net.curl;
import std.typecons;

void main()
{
    auto connections = 3; // 3 parallel downloads
    defaultPoolThreads(connections - 1);
    auto retries = 4; // try up to 4 times if it fails
    auto logList = [
tuple("dlang.org", "log1.txt"), tuple("dlang.org", "log2.txt"), tuple("dlang.org", "log3.txt"), tuple("dlang.org", "log4.txt"), tuple("dlang.org", "log5.txt"), tuple("dlang.org", "log6.txt")];

    foreach (log; parallel(logList, 1))
    {
        HTTP conn = HTTP();

        foreach (i; 0 .. retries)
        {
            try
            {
                writeln("Downloading ", log[0]);
                download(log[0], log[1], conn);

                if(conn.statusLine.code == 200)
                {
                    writeln("File ", log[1], " created.");
                    break;
                }
            }
            catch (CurlException e)
            {
                writeln("Retrying ", log[0]);
            }
        }
    }
}

[1] https://github.com/dlang/phobos/blob/master/std/net/curl.d#L1679

Reply via email to