wget: use closed HTTP/1.1 connection, stop when we dl'ed $content_len bytes
authorDenys Vlasenko <vda.linux@googlemail.com>
Thu, 10 Feb 2011 12:23:45 +0000 (13:23 +0100)
committerDenys Vlasenko <vda.linux@googlemail.com>
Thu, 10 Feb 2011 12:23:45 +0000 (13:23 +0100)
function                                             old     new   delta
retrieve_file_data                                   353     367     +14

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
networking/wget.c

index 74d90040f6a8c23d970d5bcb1e4ceb40ffb150c1..931882fdef0f92f8520826ab7b7ef56a449d1b87 100644 (file)
@@ -510,8 +510,11 @@ static void NOINLINE retrieve_file_data(FILE *dfp, int output_fd)
                        G.transferred += n;
                        progress_meter(PROGRESS_BUMP);
 #endif
-                       if (G.got_clen)
+                       if (G.got_clen) {
                                G.content_len -= n;
+                               if (G.content_len == 0)
+                                       break;
+                       }
                }
 
                if (!G.chunked)
@@ -709,6 +712,11 @@ int wget_main(int argc UNUSED_PARAM, char **argv)
                fprintf(sfp, "Host: %s\r\nUser-Agent: %s\r\n",
                        target.host, user_agent);
 
+               /* Ask server to close the connection as soon as we are done
+                * (IOW: we do not intend to send more requests)
+                */
+               fprintf(sfp, "Connection: close\r\n");
+
 #if ENABLE_FEATURE_WGET_AUTHENTICATION
                if (target.user) {
                        fprintf(sfp, "Proxy-Authorization: Basic %s\r\n"+6,
@@ -722,22 +730,25 @@ int wget_main(int argc UNUSED_PARAM, char **argv)
 
                if (G.beg_range)
                        fprintf(sfp, "Range: bytes=%"OFF_FMT"u-\r\n", G.beg_range);
+
 #if ENABLE_FEATURE_WGET_LONG_OPTIONS
                if (extra_headers)
                        fputs(extra_headers, sfp);
 
                if (opt & WGET_OPT_POST_DATA) {
                        char *estr = URL_escape(post_data);
-                       fprintf(sfp, "Content-Type: application/x-www-form-urlencoded\r\n");
-                       fprintf(sfp, "Content-Length: %u\r\n" "\r\n" "%s",
-                                       (int) strlen(estr), estr);
-                       /*fprintf(sfp, "Connection: Keep-Alive\r\n\r\n");*/
-                       /*fprintf(sfp, "%s\r\n", estr);*/
+                       fprintf(sfp,
+                               "Content-Type: application/x-www-form-urlencoded\r\n"
+                               "Content-Length: %u\r\n"
+                               "\r\n"
+                               "%s",
+                               (int) strlen(estr), estr
+                       );
                        free(estr);
                } else
 #endif
-               { /* If "Connection:" is needed, document why */
-                       fprintf(sfp, /* "Connection: close\r\n" */ "\r\n");
+               {
+                       fprintf(sfp, "\r\n");
                }
 
                fflush(sfp);