|
|
@@ -40,7 +40,9 @@ using namespace std;
|
|
|
struct APT_HIDDEN CURLUserPointer {
|
|
|
HttpsMethod * const https;
|
|
|
HttpsMethod::FetchResult * const Res;
|
|
|
- CURLUserPointer(HttpsMethod * const https, HttpsMethod::FetchResult * const Res) : https(https), Res(Res) {}
|
|
|
+ HttpsMethod::FetchItem const * const Itm;
|
|
|
+ CURLUserPointer(HttpsMethod * const https, HttpsMethod::FetchResult * const Res,
|
|
|
+ HttpsMethod::FetchItem const * const Itm) : https(https), Res(Res), Itm(Itm) {}
|
|
|
};
|
|
|
|
|
|
size_t
|
|
|
@@ -61,13 +63,32 @@ HttpsMethod::parse_header(void *buffer, size_t size, size_t nmemb, void *userp)
|
|
|
{
|
|
|
if (me->https->Server->Result != 416 && me->https->Server->StartPos != 0)
|
|
|
;
|
|
|
- else if (me->https->Server->Result == 416 && me->https->Server->Size == me->https->File->FileSize())
|
|
|
+ else if (me->https->Server->Result == 416)
|
|
|
{
|
|
|
- me->https->Server->Result = 200;
|
|
|
- me->https->Server->StartPos = me->https->Server->Size;
|
|
|
- // the actual size is not important for https as curl will deal with it
|
|
|
- // by itself and e.g. doesn't bother us with transport-encoding…
|
|
|
- me->https->Server->JunkSize = std::numeric_limits<unsigned long long>::max();
|
|
|
+ bool partialHit = false;
|
|
|
+ if (me->Itm->ExpectedHashes.usable() == true)
|
|
|
+ {
|
|
|
+ Hashes resultHashes(me->Itm->ExpectedHashes);
|
|
|
+ FileFd file(me->Itm->DestFile, FileFd::ReadOnly);
|
|
|
+ me->https->Server->Size = file.FileSize();
|
|
|
+ me->https->Server->Date = file.ModificationTime();
|
|
|
+ resultHashes.AddFD(file);
|
|
|
+ HashStringList const hashList = resultHashes.GetHashStringList();
|
|
|
+ partialHit = (me->Itm->ExpectedHashes == hashList);
|
|
|
+ }
|
|
|
+ else if (me->https->Server->Result == 416 && me->https->Server->Size == me->https->File->FileSize())
|
|
|
+ partialHit = true;
|
|
|
+
|
|
|
+ if (partialHit == true)
|
|
|
+ {
|
|
|
+ me->https->Server->Result = 200;
|
|
|
+ me->https->Server->StartPos = me->https->Server->Size;
|
|
|
+ // the actual size is not important for https as curl will deal with it
|
|
|
+ // by itself and e.g. doesn't bother us with transport-encoding…
|
|
|
+ me->https->Server->JunkSize = std::numeric_limits<unsigned long long>::max();
|
|
|
+ }
|
|
|
+ else
|
|
|
+ me->https->Server->StartPos = 0;
|
|
|
}
|
|
|
else
|
|
|
me->https->Server->StartPos = 0;
|
|
|
@@ -221,7 +242,7 @@ bool HttpsMethod::Fetch(FetchItem *Itm)
|
|
|
maybe_add_auth (Uri, _config->FindFile("Dir::Etc::netrc"));
|
|
|
|
|
|
FetchResult Res;
|
|
|
- CURLUserPointer userp(this, &Res);
|
|
|
+ CURLUserPointer userp(this, &Res, Itm);
|
|
|
// callbacks
|
|
|
curl_easy_setopt(curl, CURLOPT_URL, static_cast<string>(Uri).c_str());
|
|
|
curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, parse_header);
|