]> sjero.net Git - wget/blob - src/retr.c
[svn] Added sanity checks for -k, -p, -r and -N when -O is given. Added fixes for...
[wget] / src / retr.c
1 /* File retrieval.
2    Copyright (C) 1996-2006 Free Software Foundation, Inc.
3
4 This file is part of GNU Wget.
5
6 GNU Wget is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or (at
9 your option) any later version.
10
11 GNU Wget is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with Wget; if not, write to the Free Software Foundation, Inc.,
18 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
19
20 In addition, as a special exception, the Free Software Foundation
21 gives permission to link the code of its release of Wget with the
22 OpenSSL project's "OpenSSL" library (or with modified versions of it
23 that use the same license as the "OpenSSL" library), and distribute
24 the linked executables.  You must obey the GNU General Public License
25 in all respects for all of the code used other than "OpenSSL".  If you
26 modify this file, you may extend this exception to your version of the
27 file, but you are not obligated to do so.  If you do not wish to do
28 so, delete this exception statement from your version.  */
29
30 #include <config.h>
31
32 #include <stdio.h>
33 #include <stdlib.h>
34 #ifdef HAVE_UNISTD_H
35 # include <unistd.h>
36 #endif /* HAVE_UNISTD_H */
37 #include <errno.h>
38 #include <string.h>
39 #include <assert.h>
40
41 #include "wget.h"
42 #include "utils.h"
43 #include "retr.h"
44 #include "progress.h"
45 #include "url.h"
46 #include "recur.h"
47 #include "ftp.h"
48 #include "http.h"
49 #include "host.h"
50 #include "connect.h"
51 #include "hash.h"
52 #include "convert.h"
53 #include "ptimer.h"
54
55 /* Total size of downloaded files.  Used to enforce quota.  */
56 SUM_SIZE_INT total_downloaded_bytes;
57
58 /* Total download time in seconds. */
59 double total_download_time;
60
61 /* If non-NULL, the stream to which output should be written.  This
62    stream is initialized when `-O' is used.  */
63 FILE *output_stream;
64
65 /* Whether output_document is a regular file we can manipulate,
66    i.e. not `-' or a device file. */
67 bool output_stream_regular;
68 \f
69 static struct {
70   wgint chunk_bytes;
71   double chunk_start;
72   double sleep_adjust;
73 } limit_data;
74
75 static void
76 limit_bandwidth_reset (void)
77 {
78   xzero (limit_data);
79 }
80
81 /* Limit the bandwidth by pausing the download for an amount of time.
82    BYTES is the number of bytes received from the network, and TIMER
83    is the timer that started at the beginning of download.  */
84
85 static void
86 limit_bandwidth (wgint bytes, struct ptimer *timer)
87 {
88   double delta_t = ptimer_read (timer) - limit_data.chunk_start;
89   double expected;
90
91   limit_data.chunk_bytes += bytes;
92
93   /* Calculate the amount of time we expect downloading the chunk
94      should take.  If in reality it took less time, sleep to
95      compensate for the difference.  */
96   expected = (double) limit_data.chunk_bytes / opt.limit_rate;
97
98   if (expected > delta_t)
99     {
100       double slp = expected - delta_t + limit_data.sleep_adjust;
101       double t0, t1;
102       if (slp < 0.2)
103         {
104           DEBUGP (("deferring a %.2f ms sleep (%s/%.2f).\n",
105                    slp * 1000, number_to_static_string (limit_data.chunk_bytes),
106                    delta_t));
107           return;
108         }
109       DEBUGP (("\nsleeping %.2f ms for %s bytes, adjust %.2f ms\n",
110                slp * 1000, number_to_static_string (limit_data.chunk_bytes),
111                limit_data.sleep_adjust));
112
113       t0 = ptimer_read (timer);
114       xsleep (slp);
115       t1 = ptimer_measure (timer);
116
117       /* Due to scheduling, we probably slept slightly longer (or
118          shorter) than desired.  Calculate the difference between the
119          desired and the actual sleep, and adjust the next sleep by
120          that amount.  */
121       limit_data.sleep_adjust = slp - (t1 - t0);
122       /* If sleep_adjust is very large, it's likely due to suspension
123          and not clock inaccuracy.  Don't enforce those.  */
124       if (limit_data.sleep_adjust > 0.5)
125         limit_data.sleep_adjust = 0.5;
126       else if (limit_data.sleep_adjust < -0.5)
127         limit_data.sleep_adjust = -0.5;
128     }
129
130   limit_data.chunk_bytes = 0;
131   limit_data.chunk_start = ptimer_read (timer);
132 }
133
134 #ifndef MIN
135 # define MIN(i, j) ((i) <= (j) ? (i) : (j))
136 #endif
137
138 /* Write data in BUF to OUT.  However, if *SKIP is non-zero, skip that
139    amount of data and decrease SKIP.  Increment *TOTAL by the amount
140    of data written.  */
141
142 static int
143 write_data (FILE *out, const char *buf, int bufsize, wgint *skip,
144             wgint *written)
145 {
146   if (!out)
147     return 1;
148   if (*skip > bufsize)
149     {
150       *skip -= bufsize;
151       return 1;
152     }
153   if (*skip)
154     {
155       buf += *skip;
156       bufsize -= *skip;
157       *skip = 0;
158       if (bufsize == 0)
159         return 1;
160     }
161
162   fwrite (buf, 1, bufsize, out);
163   *written += bufsize;
164
165   /* Immediately flush the downloaded data.  This should not hinder
166      performance: fast downloads will arrive in large 16K chunks
167      (which stdio would write out immediately anyway), and slow
168      downloads wouldn't be limited by disk speed.  */
169   fflush (out);
170   return !ferror (out);
171 }
172
173 /* Read the contents of file descriptor FD until it the connection
174    terminates or a read error occurs.  The data is read in portions of
175    up to 16K and written to OUT as it arrives.  If opt.verbose is set,
176    the progress is shown.
177
178    TOREAD is the amount of data expected to arrive, normally only used
179    by the progress gauge.
180
181    STARTPOS is the position from which the download starts, used by
182    the progress gauge.  If QTYREAD is non-NULL, the value it points to
183    is incremented by the amount of data read from the network.  If
184    QTYWRITTEN is non-NULL, the value it points to is incremented by
185    the amount of data written to disk.  The time it took to download
186    the data is stored to ELAPSED.
187
188    The function exits and returns the amount of data read.  In case of
189    error while reading data, -1 is returned.  In case of error while
190    writing data, -2 is returned.  */
191
192 int
193 fd_read_body (int fd, FILE *out, wgint toread, wgint startpos,
194               wgint *qtyread, wgint *qtywritten, double *elapsed, int flags)
195 {
196   int ret = 0;
197
198   static char dlbuf[16384];
199   int dlbufsize = sizeof (dlbuf);
200
201   struct ptimer *timer = NULL;
202   double last_successful_read_tm = 0;
203
204   /* The progress gauge, set according to the user preferences. */
205   void *progress = NULL;
206
207   /* Non-zero if the progress gauge is interactive, i.e. if it can
208      continually update the display.  When true, smaller timeout
209      values are used so that the gauge can update the display when
210      data arrives slowly. */
211   bool progress_interactive = false;
212
213   bool exact = !!(flags & rb_read_exactly);
214   wgint skip = 0;
215
216   /* How much data we've read/written.  */
217   wgint sum_read = 0;
218   wgint sum_written = 0;
219
220   if (flags & rb_skip_startpos)
221     skip = startpos;
222
223   if (opt.verbose)
224     {
225       /* If we're skipping STARTPOS bytes, pass 0 as the INITIAL
226          argument to progress_create because the indicator doesn't
227          (yet) know about "skipping" data.  */
228       progress = progress_create (skip ? 0 : startpos, startpos + toread);
229       progress_interactive = progress_interactive_p (progress);
230     }
231
232   if (opt.limit_rate)
233     limit_bandwidth_reset ();
234
235   /* A timer is needed for tracking progress, for throttling, and for
236      tracking elapsed time.  If either of these are requested, start
237      the timer.  */
238   if (progress || opt.limit_rate || elapsed)
239     {
240       timer = ptimer_new ();
241       last_successful_read_tm = 0;
242     }
243
244   /* Use a smaller buffer for low requested bandwidths.  For example,
245      with --limit-rate=2k, it doesn't make sense to slurp in 16K of
246      data and then sleep for 8s.  With buffer size equal to the limit,
247      we never have to sleep for more than one second.  */
248   if (opt.limit_rate && opt.limit_rate < dlbufsize)
249     dlbufsize = opt.limit_rate;
250
251   /* Read from FD while there is data to read.  Normally toread==0
252      means that it is unknown how much data is to arrive.  However, if
253      EXACT is set, then toread==0 means what it says: that no data
254      should be read.  */
255   while (!exact || (sum_read < toread))
256     {
257       int rdsize = exact ? MIN (toread - sum_read, dlbufsize) : dlbufsize;
258       double tmout = opt.read_timeout;
259       if (progress_interactive)
260         {
261           /* For interactive progress gauges, always specify a ~1s
262              timeout, so that the gauge can be updated regularly even
263              when the data arrives very slowly or stalls.  */
264           tmout = 0.95;
265           if (opt.read_timeout)
266             {
267               double waittm;
268               waittm = ptimer_read (timer) - last_successful_read_tm;
269               if (waittm + tmout > opt.read_timeout)
270                 {
271                   /* Don't let total idle time exceed read timeout. */
272                   tmout = opt.read_timeout - waittm;
273                   if (tmout < 0)
274                     {
275                       /* We've already exceeded the timeout. */
276                       ret = -1, errno = ETIMEDOUT;
277                       break;
278                     }
279                 }
280             }
281         }
282       ret = fd_read (fd, dlbuf, rdsize, tmout);
283
284       if (progress_interactive && ret < 0 && errno == ETIMEDOUT)
285         ret = 0;                /* interactive timeout, handled above */
286       else if (ret <= 0)
287         break;                  /* EOF or read error */
288
289       if (progress || opt.limit_rate)
290         {
291           ptimer_measure (timer);
292           if (ret > 0)
293             last_successful_read_tm = ptimer_read (timer);
294         }
295
296       if (ret > 0)
297         {
298           sum_read += ret;
299           if (!write_data (out, dlbuf, ret, &skip, &sum_written))
300             {
301               ret = -2;
302               goto out;
303             }
304         }
305
306       if (opt.limit_rate)
307         limit_bandwidth (ret, timer);
308
309       if (progress)
310         progress_update (progress, ret, ptimer_read (timer));
311 #ifdef WINDOWS
312       if (toread > 0 && !opt.quiet)
313         ws_percenttitle (100.0 *
314                          (startpos + sum_read) / (startpos + toread));
315 #endif
316     }
317   if (ret < -1)
318     ret = -1;
319
320  out:
321   if (progress)
322     progress_finish (progress, ptimer_read (timer));
323
324   if (elapsed)
325     *elapsed = ptimer_read (timer);
326   if (timer)
327     ptimer_destroy (timer);
328
329   if (qtyread)
330     *qtyread += sum_read;
331   if (qtywritten)
332     *qtywritten += sum_written;
333
334   return ret;
335 }
336 \f
337 /* Read a hunk of data from FD, up until a terminator.  The hunk is
338    limited by whatever the TERMINATOR callback chooses as its
339    terminator.  For example, if terminator stops at newline, the hunk
340    will consist of a line of data; if terminator stops at two
341    newlines, it can be used to read the head of an HTTP response.
342    Upon determining the boundary, the function returns the data (up to
343    the terminator) in malloc-allocated storage.
344
345    In case of read error, NULL is returned.  In case of EOF and no
346    data read, NULL is returned and errno set to 0.  In case of having
347    read some data, but encountering EOF before seeing the terminator,
348    the data that has been read is returned, but it will (obviously)
349    not contain the terminator.
350
351    The TERMINATOR function is called with three arguments: the
352    beginning of the data read so far, the beginning of the current
353    block of peeked-at data, and the length of the current block.
354    Depending on its needs, the function is free to choose whether to
355    analyze all data or just the newly arrived data.  If TERMINATOR
356    returns NULL, it means that the terminator has not been seen.
357    Otherwise it should return a pointer to the charactre immediately
358    following the terminator.
359
360    The idea is to be able to read a line of input, or otherwise a hunk
361    of text, such as the head of an HTTP request, without crossing the
362    boundary, so that the next call to fd_read etc. reads the data
363    after the hunk.  To achieve that, this function does the following:
364
365    1. Peek at incoming data.
366
367    2. Determine whether the peeked data, along with the previously
368       read data, includes the terminator.
369
370       2a. If yes, read the data until the end of the terminator, and
371           exit.
372
373       2b. If no, read the peeked data and goto 1.
374
375    The function is careful to assume as little as possible about the
376    implementation of peeking.  For example, every peek is followed by
377    a read.  If the read returns a different amount of data, the
378    process is retried until all data arrives safely.
379
380    SIZEHINT is the buffer size sufficient to hold all the data in the
381    typical case (it is used as the initial buffer size).  MAXSIZE is
382    the maximum amount of memory this function is allowed to allocate,
383    or 0 if no upper limit is to be enforced.
384
385    This function should be used as a building block for other
386    functions -- see fd_read_line as a simple example.  */
387
388 char *
389 fd_read_hunk (int fd, hunk_terminator_t terminator, long sizehint, long maxsize)
390 {
391   long bufsize = sizehint;
392   char *hunk = xmalloc (bufsize);
393   int tail = 0;                 /* tail position in HUNK */
394
395   assert (maxsize >= bufsize);
396
397   while (1)
398     {
399       const char *end;
400       int pklen, rdlen, remain;
401
402       /* First, peek at the available data. */
403
404       pklen = fd_peek (fd, hunk + tail, bufsize - 1 - tail, -1);
405       if (pklen < 0)
406         {
407           xfree (hunk);
408           return NULL;
409         }
410       end = terminator (hunk, hunk + tail, pklen);
411       if (end)
412         {
413           /* The data contains the terminator: we'll drain the data up
414              to the end of the terminator.  */
415           remain = end - (hunk + tail);
416           assert (remain >= 0);
417           if (remain == 0)
418             {
419               /* No more data needs to be read. */
420               hunk[tail] = '\0';
421               return hunk;
422             }
423           if (bufsize - 1 < tail + remain)
424             {
425               bufsize = tail + remain + 1;
426               hunk = xrealloc (hunk, bufsize);
427             }
428         }
429       else
430         /* No terminator: simply read the data we know is (or should
431            be) available.  */
432         remain = pklen;
433
434       /* Now, read the data.  Note that we make no assumptions about
435          how much data we'll get.  (Some TCP stacks are notorious for
436          read returning less data than the previous MSG_PEEK.)  */
437
438       rdlen = fd_read (fd, hunk + tail, remain, 0);
439       if (rdlen < 0)
440         {
441           xfree_null (hunk);
442           return NULL;
443         }
444       tail += rdlen;
445       hunk[tail] = '\0';
446
447       if (rdlen == 0)
448         {
449           if (tail == 0)
450             {
451               /* EOF without anything having been read */
452               xfree (hunk);
453               errno = 0;
454               return NULL;
455             }
456           else
457             /* EOF seen: return the data we've read. */
458             return hunk;
459         }
460       if (end && rdlen == remain)
461         /* The terminator was seen and the remaining data drained --
462            we got what we came for.  */
463         return hunk;
464
465       /* Keep looping until all the data arrives. */
466
467       if (tail == bufsize - 1)
468         {
469           /* Double the buffer size, but refuse to allocate more than
470              MAXSIZE bytes.  */
471           if (maxsize && bufsize >= maxsize)
472             {
473               xfree (hunk);
474               errno = ENOMEM;
475               return NULL;
476             }
477           bufsize <<= 1;
478           if (maxsize && bufsize > maxsize)
479             bufsize = maxsize;
480           hunk = xrealloc (hunk, bufsize);
481         }
482     }
483 }
484
485 static const char *
486 line_terminator (const char *start, const char *peeked, int peeklen)
487 {
488   const char *p = memchr (peeked, '\n', peeklen);
489   if (p)
490     /* p+1 because the line must include '\n' */
491     return p + 1;
492   return NULL;
493 }
494
495 /* The maximum size of the single line we agree to accept.  This is
496    not meant to impose an arbitrary limit, but to protect the user
497    from Wget slurping up available memory upon encountering malicious
498    or buggy server output.  Define it to 0 to remove the limit.  */
499 #define FD_READ_LINE_MAX 4096
500
501 /* Read one line from FD and return it.  The line is allocated using
502    malloc, but is never larger than FD_READ_LINE_MAX.
503
504    If an error occurs, or if no data can be read, NULL is returned.
505    In the former case errno indicates the error condition, and in the
506    latter case, errno is NULL.  */
507
508 char *
509 fd_read_line (int fd)
510 {
511   return fd_read_hunk (fd, line_terminator, 128, FD_READ_LINE_MAX);
512 }
513 \f
514 /* Return a printed representation of the download rate, along with
515    the units appropriate for the download speed.  */
516
517 const char *
518 retr_rate (wgint bytes, double secs)
519 {
520   static char res[20];
521   static const char *rate_names[] = {"B/s", "KB/s", "MB/s", "GB/s" };
522   int units;
523
524   double dlrate = calc_rate (bytes, secs, &units);
525   /* Use more digits for smaller numbers (regardless of unit used),
526      e.g. "1022", "247", "12.5", "2.38".  */
527   sprintf (res, "%.*f %s",
528            dlrate >= 99.95 ? 0 : dlrate >= 9.995 ? 1 : 2,
529            dlrate, rate_names[units]);
530
531   return res;
532 }
533
534 /* Calculate the download rate and trim it as appropriate for the
535    speed.  Appropriate means that if rate is greater than 1K/s,
536    kilobytes are used, and if rate is greater than 1MB/s, megabytes
537    are used.
538
539    UNITS is zero for B/s, one for KB/s, two for MB/s, and three for
540    GB/s.  */
541
542 double
543 calc_rate (wgint bytes, double secs, int *units)
544 {
545   double dlrate;
546
547   assert (secs >= 0);
548   assert (bytes >= 0);
549
550   if (secs == 0)
551     /* If elapsed time is exactly zero, it means we're under the
552        resolution of the timer.  This can easily happen on systems
553        that use time() for the timer.  Since the interval lies between
554        0 and the timer's resolution, assume half the resolution.  */
555     secs = ptimer_resolution () / 2.0;
556
557   dlrate = bytes / secs;
558   if (dlrate < 1024.0)
559     *units = 0;
560   else if (dlrate < 1024.0 * 1024.0)
561     *units = 1, dlrate /= 1024.0;
562   else if (dlrate < 1024.0 * 1024.0 * 1024.0)
563     *units = 2, dlrate /= (1024.0 * 1024.0);
564   else
565     /* Maybe someone will need this, one day. */
566     *units = 3, dlrate /= (1024.0 * 1024.0 * 1024.0);
567
568   return dlrate;
569 }
570 \f
571 /* Maximum number of allowed redirections.  20 was chosen as a
572    "reasonable" value, which is low enough to not cause havoc, yet
573    high enough to guarantee that normal retrievals will not be hurt by
574    the check.  */
575
576 #define MAX_REDIRECTIONS 20
577
578 #define SUSPEND_POST_DATA do {                  \
579   post_data_suspended = true;                   \
580   saved_post_data = opt.post_data;              \
581   saved_post_file_name = opt.post_file_name;    \
582   opt.post_data = NULL;                         \
583   opt.post_file_name = NULL;                    \
584 } while (0)
585
586 #define RESTORE_POST_DATA do {                          \
587   if (post_data_suspended)                              \
588     {                                                   \
589       opt.post_data = saved_post_data;                  \
590       opt.post_file_name = saved_post_file_name;        \
591       post_data_suspended = false;                      \
592     }                                                   \
593 } while (0)
594
595 static char *getproxy (struct url *);
596
597 /* Retrieve the given URL.  Decides which loop to call -- HTTP, FTP,
598    FTP, proxy, etc.  */
599
600 /* #### This function should be rewritten so it doesn't return from
601    multiple points. */
602
603 uerr_t
604 retrieve_url (const char *origurl, char **file, char **newloc,
605               const char *refurl, int *dt, bool recursive)
606 {
607   uerr_t result;
608   char *url;
609   bool location_changed;
610   int dummy;
611   char *mynewloc, *proxy;
612   struct url *u, *proxy_url;
613   int up_error_code;            /* url parse error code */
614   char *local_file;
615   int redirection_count = 0;
616
617   bool post_data_suspended = false;
618   char *saved_post_data = NULL;
619   char *saved_post_file_name = NULL;
620
621   /* If dt is NULL, use local storage.  */
622   if (!dt)
623     {
624       dt = &dummy;
625       dummy = 0;
626     }
627   url = xstrdup (origurl);
628   if (newloc)
629     *newloc = NULL;
630   if (file)
631     *file = NULL;
632
633   u = url_parse (url, &up_error_code);
634   if (!u)
635     {
636       logprintf (LOG_NOTQUIET, "%s: %s.\n", url, url_error (up_error_code));
637       xfree (url);
638       return URLERROR;
639     }
640
641   if (!refurl)
642     refurl = opt.referer;
643
644  redirected:
645
646   result = NOCONERROR;
647   mynewloc = NULL;
648   local_file = NULL;
649   proxy_url = NULL;
650
651   proxy = getproxy (u);
652   if (proxy)
653     {
654       /* Parse the proxy URL.  */
655       proxy_url = url_parse (proxy, &up_error_code);
656       if (!proxy_url)
657         {
658           logprintf (LOG_NOTQUIET, _("Error parsing proxy URL %s: %s.\n"),
659                      proxy, url_error (up_error_code));
660           xfree (url);
661           RESTORE_POST_DATA;
662           return PROXERR;
663         }
664       if (proxy_url->scheme != SCHEME_HTTP && proxy_url->scheme != u->scheme)
665         {
666           logprintf (LOG_NOTQUIET, _("Error in proxy URL %s: Must be HTTP.\n"), proxy);
667           url_free (proxy_url);
668           xfree (url);
669           RESTORE_POST_DATA;
670           return PROXERR;
671         }
672     }
673
674   if (u->scheme == SCHEME_HTTP
675 #ifdef HAVE_SSL
676       || u->scheme == SCHEME_HTTPS
677 #endif
678       || (proxy_url && proxy_url->scheme == SCHEME_HTTP))
679     {
680       result = http_loop (u, &mynewloc, &local_file, refurl, dt, proxy_url);
681     }
682   else if (u->scheme == SCHEME_FTP)
683     {
684       /* If this is a redirection, temporarily turn off opt.ftp_glob
685          and opt.recursive, both being undesirable when following
686          redirects.  */
687       bool oldrec = recursive, glob = opt.ftp_glob;
688       if (redirection_count)
689         oldrec = glob = false;
690
691       result = ftp_loop (u, dt, proxy_url, recursive, glob);
692       recursive = oldrec;
693
694       /* There is a possibility of having HTTP being redirected to
695          FTP.  In these cases we must decide whether the text is HTML
696          according to the suffix.  The HTML suffixes are `.html',
697          `.htm' and a few others, case-insensitive.  */
698       if (redirection_count && local_file && u->scheme == SCHEME_FTP)
699         {
700           if (has_html_suffix_p (local_file))
701             *dt |= TEXTHTML;
702         }
703     }
704
705   if (proxy_url)
706     {
707       url_free (proxy_url);
708       proxy_url = NULL;
709     }
710
711   location_changed = (result == NEWLOCATION);
712   if (location_changed)
713     {
714       char *construced_newloc;
715       struct url *newloc_parsed;
716
717       assert (mynewloc != NULL);
718
719       if (local_file)
720         xfree (local_file);
721
722       /* The HTTP specs only allow absolute URLs to appear in
723          redirects, but a ton of boneheaded webservers and CGIs out
724          there break the rules and use relative URLs, and popular
725          browsers are lenient about this, so wget should be too. */
726       construced_newloc = uri_merge (url, mynewloc);
727       xfree (mynewloc);
728       mynewloc = construced_newloc;
729
730       /* Now, see if this new location makes sense. */
731       newloc_parsed = url_parse (mynewloc, &up_error_code);
732       if (!newloc_parsed)
733         {
734           logprintf (LOG_NOTQUIET, "%s: %s.\n", escnonprint_uri (mynewloc),
735                      url_error (up_error_code));
736           url_free (u);
737           xfree (url);
738           xfree (mynewloc);
739           RESTORE_POST_DATA;
740           return result;
741         }
742
743       /* Now mynewloc will become newloc_parsed->url, because if the
744          Location contained relative paths like .././something, we
745          don't want that propagating as url.  */
746       xfree (mynewloc);
747       mynewloc = xstrdup (newloc_parsed->url);
748
749       /* Check for max. number of redirections.  */
750       if (++redirection_count > MAX_REDIRECTIONS)
751         {
752           logprintf (LOG_NOTQUIET, _("%d redirections exceeded.\n"),
753                      MAX_REDIRECTIONS);
754           url_free (newloc_parsed);
755           url_free (u);
756           xfree (url);
757           xfree (mynewloc);
758           RESTORE_POST_DATA;
759           return WRONGCODE;
760         }
761
762       xfree (url);
763       url = mynewloc;
764       url_free (u);
765       u = newloc_parsed;
766
767       /* If we're being redirected from POST, we don't want to POST
768          again.  Many requests answer POST with a redirection to an
769          index page; that redirection is clearly a GET.  We "suspend"
770          POST data for the duration of the redirections, and restore
771          it when we're done. */
772       if (!post_data_suspended)
773         SUSPEND_POST_DATA;
774
775       goto redirected;
776     }
777
778   if (local_file)
779     {
780       if (*dt & RETROKF)
781         {
782           register_download (u->url, local_file);
783           if (redirection_count && 0 != strcmp (origurl, u->url))
784             register_redirection (origurl, u->url);
785           if (*dt & TEXTHTML)
786             register_html (u->url, local_file);
787         }
788     }
789
790   if (file)
791     *file = local_file ? local_file : NULL;
792   else
793     xfree_null (local_file);
794
795   url_free (u);
796
797   if (redirection_count)
798     {
799       if (newloc)
800         *newloc = url;
801       else
802         xfree (url);
803     }
804   else
805     {
806       if (newloc)
807         *newloc = NULL;
808       xfree (url);
809     }
810
811   RESTORE_POST_DATA;
812
813   return result;
814 }
815
816 /* Find the URLs in the file and call retrieve_url() for each of them.
817    If HTML is true, treat the file as HTML, and construct the URLs
818    accordingly.
819
820    If opt.recursive is set, call retrieve_tree() for each file.  */
821
822 uerr_t
823 retrieve_from_file (const char *file, bool html, int *count)
824 {
825   uerr_t status;
826   struct urlpos *url_list, *cur_url;
827
828   url_list = (html ? get_urls_html (file, NULL, NULL)
829               : get_urls_file (file));
830   status = RETROK;             /* Suppose everything is OK.  */
831   *count = 0;                  /* Reset the URL count.  */
832
833   for (cur_url = url_list; cur_url; cur_url = cur_url->next, ++*count)
834     {
835       char *filename = NULL, *new_file = NULL;
836       int dt;
837
838       if (cur_url->ignore_when_downloading)
839         continue;
840
841       if (opt.quota && total_downloaded_bytes > opt.quota)
842         {
843           status = QUOTEXC;
844           break;
845         }
846       if ((opt.recursive || opt.page_requisites)
847           && (cur_url->url->scheme != SCHEME_FTP || opt.use_proxy))
848         {
849           int old_follow_ftp = opt.follow_ftp;
850
851           /* Turn opt.follow_ftp on in case of recursive FTP retrieval */
852           if (cur_url->url->scheme == SCHEME_FTP) 
853             opt.follow_ftp = 1;
854           
855           status = retrieve_tree (cur_url->url->url);
856
857           opt.follow_ftp = old_follow_ftp;
858         }
859       else
860         status = retrieve_url (cur_url->url->url, &filename, &new_file, NULL, &dt, opt.recursive);
861
862       if (filename && opt.delete_after && file_exists_p (filename))
863         {
864           DEBUGP (("\
865 Removing file due to --delete-after in retrieve_from_file():\n"));
866           logprintf (LOG_VERBOSE, _("Removing %s.\n"), filename);
867           if (unlink (filename))
868             logprintf (LOG_NOTQUIET, "unlink: %s\n", strerror (errno));
869           dt &= ~RETROKF;
870         }
871
872       xfree_null (new_file);
873       xfree_null (filename);
874     }
875
876   /* Free the linked list of URL-s.  */
877   free_urlpos (url_list);
878
879   return status;
880 }
881
882 /* Print `giving up', or `retrying', depending on the impending
883    action.  N1 and N2 are the attempt number and the attempt limit.  */
884 void
885 printwhat (int n1, int n2)
886 {
887   logputs (LOG_VERBOSE, (n1 == n2) ? _("Giving up.\n\n") : _("Retrying.\n\n"));
888 }
889
890 /* If opt.wait or opt.waitretry are specified, and if certain
891    conditions are met, sleep the appropriate number of seconds.  See
892    the documentation of --wait and --waitretry for more information.
893
894    COUNT is the count of current retrieval, beginning with 1. */
895
896 void
897 sleep_between_retrievals (int count)
898 {
899   static bool first_retrieval = true;
900
901   if (first_retrieval)
902     {
903       /* Don't sleep before the very first retrieval. */
904       first_retrieval = false;
905       return;
906     }
907
908   if (opt.waitretry && count > 1)
909     {
910       /* If opt.waitretry is specified and this is a retry, wait for
911          COUNT-1 number of seconds, or for opt.waitretry seconds.  */
912       if (count <= opt.waitretry)
913         xsleep (count - 1);
914       else
915         xsleep (opt.waitretry);
916     }
917   else if (opt.wait)
918     {
919       if (!opt.random_wait || count > 1)
920         /* If random-wait is not specified, or if we are sleeping
921            between retries of the same download, sleep the fixed
922            interval.  */
923         xsleep (opt.wait);
924       else
925         {
926           /* Sleep a random amount of time averaging in opt.wait
927              seconds.  The sleeping amount ranges from 0.5*opt.wait to
928              1.5*opt.wait.  */
929           double waitsecs = (0.5 + random_float ()) * opt.wait;
930           DEBUGP (("sleep_between_retrievals: avg=%f,sleep=%f\n",
931                    opt.wait, waitsecs));
932           xsleep (waitsecs);
933         }
934     }
935 }
936
937 /* Free the linked list of urlpos.  */
938 void
939 free_urlpos (struct urlpos *l)
940 {
941   while (l)
942     {
943       struct urlpos *next = l->next;
944       if (l->url)
945         url_free (l->url);
946       xfree_null (l->local_name);
947       xfree (l);
948       l = next;
949     }
950 }
951
952 /* Rotate FNAME opt.backups times */
953 void
954 rotate_backups(const char *fname)
955 {
956   int maxlen = strlen (fname) + 1 + numdigit (opt.backups) + 1;
957   char *from = (char *)alloca (maxlen);
958   char *to = (char *)alloca (maxlen);
959   struct_stat sb;
960   int i;
961
962   if (stat (fname, &sb) == 0)
963     if (S_ISREG (sb.st_mode) == 0)
964       return;
965
966   for (i = opt.backups; i > 1; i--)
967     {
968       sprintf (from, "%s.%d", fname, i - 1);
969       sprintf (to, "%s.%d", fname, i);
970       rename (from, to);
971     }
972
973   sprintf (to, "%s.%d", fname, 1);
974   rename(fname, to);
975 }
976
977 static bool no_proxy_match (const char *, const char **);
978
979 /* Return the URL of the proxy appropriate for url U.  */
980
981 static char *
982 getproxy (struct url *u)
983 {
984   char *proxy = NULL;
985   char *rewritten_url;
986   static char rewritten_storage[1024];
987
988   if (!opt.use_proxy)
989     return NULL;
990   if (no_proxy_match (u->host, (const char **)opt.no_proxy))
991     return NULL;
992
993   switch (u->scheme)
994     {
995     case SCHEME_HTTP:
996       proxy = opt.http_proxy ? opt.http_proxy : getenv ("http_proxy");
997       break;
998 #ifdef HAVE_SSL
999     case SCHEME_HTTPS:
1000       proxy = opt.https_proxy ? opt.https_proxy : getenv ("https_proxy");
1001       break;
1002 #endif
1003     case SCHEME_FTP:
1004       proxy = opt.ftp_proxy ? opt.ftp_proxy : getenv ("ftp_proxy");
1005       break;
1006     case SCHEME_INVALID:
1007       break;
1008     }
1009   if (!proxy || !*proxy)
1010     return NULL;
1011
1012   /* Handle shorthands.  `rewritten_storage' is a kludge to allow
1013      getproxy() to return static storage. */
1014   rewritten_url = rewrite_shorthand_url (proxy);
1015   if (rewritten_url)
1016     {
1017       strncpy (rewritten_storage, rewritten_url, sizeof (rewritten_storage));
1018       rewritten_storage[sizeof (rewritten_storage) - 1] = '\0';
1019       proxy = rewritten_storage;
1020     }
1021
1022   return proxy;
1023 }
1024
1025 /* Should a host be accessed through proxy, concerning no_proxy?  */
1026 static bool
1027 no_proxy_match (const char *host, const char **no_proxy)
1028 {
1029   if (!no_proxy)
1030     return false;
1031   else
1032     return sufmatch (no_proxy, host);
1033 }