1

I'm aware there is a similar question here. However my symptoms differ. There seems to be some kind of URL length restriction in place that I couldn't find documented. The limit seens to be 2084 (sic! not 2048!) characters in the URL. The easiest repro is just a console application with this code:

#include "stdafx.h"
#include "urlmon.h"
#pragma comment(lib, "urlmon")


int main()
{
    HRESULT hr = URLDownloadToFile(NULL,L"http://www.google.de/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png?oids=1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890",
        L"c:\\temp\\x.png",
        0,
        NULL);

    return 0;
}

Of course, the URL doesn't make actual sense, in my real life example these are important parameters. As soon as I shorten the URL below 2084 characters, I get back S_OK and everything is fine.

I used Fiddler to check the request which tells me I'm seeing http status code 200 (OK) for the download and even the server response is just perfect:

server response

Is there any way to download URLs longer than 2084 characters using URLDownloadToFile?

JBartlau
  • 772
  • 5
  • 23
  • Do you have to use URLDownloadToFile? – David Heffernan Mar 07 '18 at 08:25
  • In some cases you may be able to work around the URL length limitation by doing a POST instead of a GET request. For a POST request, the URL parameters can be send in the body of the request (application/x-www-form-urlencoded), which has a much bigger length limit. A POST request can't be done with `URLDownloadToFile` though, so you have to look for another API. – zett42 Mar 07 '18 at 09:36
  • Voting to reopen as it's a similar yet subtly different effect and not really a duplicate. – JBartlau Aug 31 '18 at 19:35

1 Answers1

1

WinInet's INTERNET_MAX_URL_LENGTH constant is exactly 2084, including a null terminator.

Also see the answers to What is the maximum URL length you can pass to the Wininet function, HttpOpenRequest? for various other URL-related limits.

If you need to download a longer URL, you will have to use another HTTP client library.

Remy Lebeau
  • 555,201
  • 31
  • 458
  • 770