wget: correctly handle failure to -c (continue)

function                                             old     new   delta
reset_beg_range_to_zero                                -      52     +52
wget_main                                           2168    2189     +21

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko 2012-06-13 17:31:07 +02:00
parent f5abc78579
commit bf146b8610

View File

@ -350,6 +350,14 @@ static char *gethdr(FILE *fp)
return hdrval;
}
static void reset_beg_range_to_zero(void)
{
//bb_error_msg("restart failed");
G.beg_range = 0;
xlseek(G.output_fd, 0, SEEK_SET);
ftruncate(G.output_fd, 0);
}
static FILE* prepare_ftp_session(FILE **dfpp, struct host_info *target, len_and_sockaddr *lsa)
{
FILE *sfp;
@ -421,6 +429,8 @@ static FILE* prepare_ftp_session(FILE **dfpp, struct host_info *target, len_and_
sprintf(G.wget_buf, "REST %"OFF_FMT"u", G.beg_range);
if (ftpcmd(G.wget_buf, NULL, sfp) == 350)
G.content_len -= G.beg_range;
else
reset_beg_range_to_zero();
}
if (ftpcmd("RETR ", target->path, sfp) > 150)
@ -744,6 +754,12 @@ However, in real world it was observed that some web servers
(e.g. Boa/0.94.14rc21) simply use code 204 when file size is zero.
*/
case 204:
if (G.beg_range != 0) {
/* "Range:..." was not honored by the server.
* Restart download from the beginning.
*/
reset_beg_range_to_zero();
}
break;
case 300: /* redirection */
case 301: