I want to create a cURL request in some C++ code which will get me the length of a file in a server without downloading the file. For that, I use some cURL options to tell I only want headers in the request response, and then I examine the response to get the file length.
I’m setting the following request options:
curl_easy_setopt(_curl_handle, CURLOPT_HEADER, 1);
curl_easy_setopt(_curl_handle, CURLOPT_NOBODY, 1);
Then processing the request, waiting for the response, which shows a OK=200, and finally enquiring about the file length:
curl_easy_getinfo(_curl_handle, CURLINFO_CONTENT_LENGTH_UPLOAD, &dResult);
But I get a file length of -1. According to cURL documentation, that means size is unknown. How can it happen that cURL doesn’t get the file length information from the server?
CURLINFO_CONTENT_LENGTH_UPLOADis the number of bytes uploaded. You need to useCURLINFO_CONTENT_LENGTH_DOWNLOADinstead.Note that if the server dynamically generates the data, the length may be different when you actualy download the file versus just downloading its headers.
Also note that if the server sends data as compressed when downloaded, there may not be any size available in the headers (if the
Transfer-Encodingheader is used instead of theContent-Lengthheader), soCURLINFO_CONTENT_LENGTH_DOWNLOADwould still return-1. The only way to know the size in that situation would be to download it in full.