[git commit] wget: correctly handle failure to -c (continue)

Denys Vlasenko vda.linux at googlemail.com
Wed Jun 13 15:31:07 UTC 2012


commit: http://git.busybox.net/busybox/commit/?id=bf146b861083e3170af05016982d50d297e3ace7
branch: http://git.busybox.net/busybox/commit/?id=refs/heads/master

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

Signed-off-by: Denys Vlasenko <vda.linux at googlemail.com>
---
 networking/wget.c |   16 ++++++++++++++++
 1 files changed, 16 insertions(+), 0 deletions(-)

diff --git a/networking/wget.c b/networking/wget.c
index 8520fe2..013b878 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:


More information about the busybox-cvs mailing list