- if (TotalSize != 0 &&
- (unsigned)atoi(LookupTag(Message,"Size","0").c_str()) != TotalSize)
- _error->Warning("Bizarre Error - File size is not what the server reported %s %lu",
- LookupTag(Message,"Size","0").c_str(),TotalSize);
+ unsigned long long const ServerSize = strtoull(LookupTag(Message,"Size","0").c_str(), NULL, 10);
+ bool isHit = StringToBool(LookupTag(Message,"IMS-Hit"),false) ||
+ StringToBool(LookupTag(Message,"Alt-IMS-Hit"),false);
+ // Using the https method the server might return 200, but the
+ // If-Modified-Since condition is not satsified, libcurl will
+ // discard the download. In this case, however, TotalSize will be
+ // set to the actual size of the file, while ServerSize will be set
+ // to 0. Therefore, if the item is marked as a hit and the
+ // downloaded size (ServerSize) is 0, we ignore TotalSize.
+ if (TotalSize != 0 && (!isHit || ServerSize != 0) && ServerSize != TotalSize)
+ _error->Warning("Size of file %s is not what the server reported %s %llu",
+ Owner->DestFile.c_str(), LookupTag(Message,"Size","0").c_str(),TotalSize);
+
+ // see if there is a hash to verify
+ HashStringList RecivedHashes;
+ HashStringList expectedHashes = Owner->HashSums();
+ for (HashStringList::const_iterator hs = expectedHashes.begin(); hs != expectedHashes.end(); ++hs)
+ {
+ std::string const tagname = hs->HashType() + "-Hash";
+ std::string const hashsum = LookupTag(Message, tagname.c_str());
+ if (hashsum.empty() == false)
+ RecivedHashes.push_back(HashString(hs->HashType(), hashsum));
+ }