Высокоуровневая клиентская библиотека HTTP для родного C / C ++ в Win32

Нет ли «высокого уровня»? HTTP библиотеки для родного C / C ++ в Win32 или я просто смотрю в неправильных местах?

По «высокоуровневому» Я имею в виду API, который позволяет мне выполнять веб-запросы / ответы HTTP на C ++ с "примерно таким же" уровень абстракции как .NET Framework (но учтите, что использование C ++ / CLI для меня не вариант).

Как сделать что-то подобное (с примерно таким же количеством кода) в C / C ++ в Win32 без использования .NET? В качестве ссылки я включил пример кода, чтобы показать, как я это делаю в C #.

byte[] fileBytes = null;
bool successfulDownload = false;
using (WebClient client = new WebClient())
{
    WebProxy proxy = WebProxy.GetDefaultProxy();
    client.Proxy = proxy;
tryAgain:
    try
    {
        fileBytes = client.DownloadData(fileUrl);
        successfulDownload = true;
    }
    catch (WebException wEx)
    {
        if (wEx.Response != null && wEx.Response is HttpWebResponse)
        {
            string username = null, password = null;
            bool userCanceled = false;
            HttpStatusCode statusCode = ((HttpWebResponse)wEx.Response).StatusCode;
            switch (statusCode)
            {
                case HttpStatusCode.ProxyAuthenticationRequired:
                    // This is just a convenience function defined elsewhere
                    GetAuthenticationCredentials(fileUrl, true,
                        out username, out password, out userCanceled);
                    if (!userCanceled)
                    {
                        client.Proxy.Credentials = new NetworkCredential(username, password);
                        goto tryAgain;
                    }
                    break;
                case HttpStatusCode.Unauthorized:
                    // This is just a convenience function defined elsewhere
                    GetAuthenticationCredentials(fileUrl, false,
                        out username, out password, out userCanceled);
                    if (!userCanceled)
                    {
                        client.Credentials = new NetworkCredential(username, password);
                        goto tryAgain;
                    }
                    break;
            }
        }
    }
}

Ответы на вопрос(6)

Ваш ответ на вопрос