summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--methods/http.cc27
1 files changed, 21 insertions, 6 deletions
diff --git a/methods/http.cc b/methods/http.cc
index 2a8b7f0fc..5f0dc03d9 100644
--- a/methods/http.cc
+++ b/methods/http.cc
@@ -750,7 +750,7 @@ void HttpMethod::SendReq(FetchItem *Itm,CircleBuf &Out)
if (stat(Itm->DestFile.c_str(),&SBuf) >= 0 && SBuf.st_size > 0)
{
// In this case we send an if-range query with a range header
- sprintf(Buf,"Range: bytes=%lli-\r\nIf-Range: %s\r\n",(long long)SBuf.st_size - 1,
+ sprintf(Buf,"Range: bytes=%lli-\r\nIf-Range: %s\r\n",(long long)SBuf.st_size,
TimeRFC1123(SBuf.st_mtime).c_str());
Req += Buf;
}
@@ -1004,11 +1004,24 @@ HttpMethod::DealWithHeaders(FetchResult &Res,ServerState *Srv)
/* else pass through for error message */
}
// retry after an invalid range response without partial data
- else if (Srv->Result == 416 && FileExists(Queue->DestFile) == true &&
- unlink(Queue->DestFile.c_str()) == 0)
+ else if (Srv->Result == 416)
{
- NextURI = Queue->Uri;
- return TRY_AGAIN_OR_REDIRECT;
+ struct stat SBuf;
+ if (stat(Queue->DestFile.c_str(),&SBuf) >= 0 && SBuf.st_size > 0)
+ {
+ if ((unsigned long long)SBuf.st_size == Srv->Size)
+ {
+ // the file is completely downloaded, but was not moved
+ Srv->StartPos = Srv->Size;
+ Srv->Result = 200;
+ Srv->HaveContent = false;
+ }
+ else if (unlink(Queue->DestFile.c_str()) == 0)
+ {
+ NextURI = Queue->Uri;
+ return TRY_AGAIN_OR_REDIRECT;
+ }
+ }
}
/* We have a reply we dont handle. This should indicate a perm server
@@ -1246,7 +1259,9 @@ int HttpMethod::Loop()
URIStart(Res);
// Run the data
- bool Result = Server->RunData();
+ bool Result = true;
+ if (Server->HaveContent)
+ Result = Server->RunData();
/* If the server is sending back sizeless responses then fill in
the size now */