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