From bf146b861083e3170af05016982d50d297e3ace7 Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Wed, 13 Jun 2012 17:31:07 +0200 Subject: 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 --- networking/wget.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) (limited to 'networking/wget.c') diff --git a/networking/wget.c b/networking/wget.c index 8520fe2b9..013b87801 100644 --- a/networking/wget.c +++ b/networking/wget.c @@ -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: -- cgit v1.2.3