]> sjero.net Git - wget/blob - src/retr.c
[svn] Extract timers to a separate file.
[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 #include "ptimer.h"
58
59 #ifdef HAVE_SSL
60 # include "gen_sslfunc.h"       /* for ssl_iread */
61 #endif
62
63 #ifndef errno
64 extern int errno;
65 #endif
66
67 /* Total size of downloaded files.  Used to enforce quota.  */
68 LARGE_INT total_downloaded_bytes;
69
70 /* If non-NULL, the stream to which output should be written.  This
71    stream is initialized when `-O' is used.  */
72 FILE *output_stream;
73
74 /* Whether output_document is a regular file we can manipulate,
75    i.e. not `-' or a device file. */
76 int output_stream_regular;
77 \f
78 static struct {
79   wgint chunk_bytes;
80   double chunk_start;
81   double sleep_adjust;
82 } limit_data;
83
84 static void
85 limit_bandwidth_reset (void)
86 {
87   limit_data.chunk_bytes = 0;
88   limit_data.chunk_start = 0;
89 }
90
91 /* Limit the bandwidth by pausing the download for an amount of time.
92    BYTES is the number of bytes received from the network, and TIMER
93    is the timer that started at the beginning of download.  */
94
95 static void
96 limit_bandwidth (wgint bytes, struct ptimer *timer)
97 {
98   double delta_t = ptimer_read (timer) - limit_data.chunk_start;
99   double expected;
100
101   limit_data.chunk_bytes += bytes;
102
103   /* Calculate the amount of time we expect downloading the chunk
104      should take.  If in reality it took less time, sleep to
105      compensate for the difference.  */
106   expected = 1000.0 * limit_data.chunk_bytes / opt.limit_rate;
107
108   if (expected > delta_t)
109     {
110       double slp = expected - delta_t + limit_data.sleep_adjust;
111       double t0, t1;
112       if (slp < 200)
113         {
114           DEBUGP (("deferring a %.2f ms sleep (%s/%.2f).\n",
115                    slp, number_to_static_string (limit_data.chunk_bytes),
116                    delta_t));
117           return;
118         }
119       DEBUGP (("\nsleeping %.2f ms for %s bytes, adjust %.2f ms\n",
120                slp, number_to_static_string (limit_data.chunk_bytes),
121                limit_data.sleep_adjust));
122
123       t0 = ptimer_read (timer);
124       xsleep (slp / 1000);
125       t1 = ptimer_measure (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 = ptimer_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 ptimer *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 = ptimer_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 = (ptimer_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           ptimer_measure (timer);
296           if (ret > 0)
297             last_successful_read_tm = ptimer_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, ptimer_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, ptimer_read (timer));
327
328   if (elapsed)
329     *elapsed = ptimer_read (timer);
330   if (timer)
331     ptimer_destroy (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 can easily happen on systems
538        that use time() for the timer.  Since the interval lies between
539        0 and the timer's granularity, assume half the granularity.  */
540     msecs = ptimer_granularity () / 2.0;
541
542   dlrate = 1000.0 * bytes / msecs;
543   if (dlrate < 1024.0)
544     *units = 0;
545   else if (dlrate < 1024.0 * 1024.0)
546     *units = 1, dlrate /= 1024.0;
547   else if (dlrate < 1024.0 * 1024.0 * 1024.0)
548     *units = 2, dlrate /= (1024.0 * 1024.0);
549   else
550     /* Maybe someone will need this, one day. */
551     *units = 3, dlrate /= (1024.0 * 1024.0 * 1024.0);
552
553   return dlrate;
554 }
555 \f
556 /* Maximum number of allowed redirections.  20 was chosen as a
557    "reasonable" value, which is low enough to not cause havoc, yet
558    high enough to guarantee that normal retrievals will not be hurt by
559    the check.  */
560
561 #define MAX_REDIRECTIONS 20
562
563 #define SUSPEND_POST_DATA do {                  \
564   post_data_suspended = 1;                      \
565   saved_post_data = opt.post_data;              \
566   saved_post_file_name = opt.post_file_name;    \
567   opt.post_data = NULL;                         \
568   opt.post_file_name = NULL;                    \
569 } while (0)
570
571 #define RESTORE_POST_DATA do {                          \
572   if (post_data_suspended)                              \
573     {                                                   \
574       opt.post_data = saved_post_data;                  \
575       opt.post_file_name = saved_post_file_name;        \
576       post_data_suspended = 0;                          \
577     }                                                   \
578 } while (0)
579
580 static char *getproxy PARAMS ((struct url *));
581
582 /* Retrieve the given URL.  Decides which loop to call -- HTTP, FTP,
583    FTP, proxy, etc.  */
584
585 /* #### This function should be rewritten so it doesn't return from
586    multiple points. */
587
588 uerr_t
589 retrieve_url (const char *origurl, char **file, char **newloc,
590               const char *refurl, int *dt)
591 {
592   uerr_t result;
593   char *url;
594   int location_changed, dummy;
595   char *mynewloc, *proxy;
596   struct url *u, *proxy_url;
597   int up_error_code;            /* url parse error code */
598   char *local_file;
599   int redirection_count = 0;
600
601   int post_data_suspended = 0;
602   char *saved_post_data = NULL;
603   char *saved_post_file_name = NULL;
604
605   /* If dt is NULL, use local storage.  */
606   if (!dt)
607     {
608       dt = &dummy;
609       dummy = 0;
610     }
611   url = xstrdup (origurl);
612   if (newloc)
613     *newloc = NULL;
614   if (file)
615     *file = NULL;
616
617   u = url_parse (url, &up_error_code);
618   if (!u)
619     {
620       logprintf (LOG_NOTQUIET, "%s: %s.\n", url, url_error (up_error_code));
621       xfree (url);
622       return URLERROR;
623     }
624
625   if (!refurl)
626     refurl = opt.referer;
627
628  redirected:
629
630   result = NOCONERROR;
631   mynewloc = NULL;
632   local_file = NULL;
633   proxy_url = NULL;
634
635   proxy = getproxy (u);
636   if (proxy)
637     {
638       /* Parse the proxy URL.  */
639       proxy_url = url_parse (proxy, &up_error_code);
640       if (!proxy_url)
641         {
642           logprintf (LOG_NOTQUIET, _("Error parsing proxy URL %s: %s.\n"),
643                      proxy, url_error (up_error_code));
644           xfree (url);
645           RESTORE_POST_DATA;
646           return PROXERR;
647         }
648       if (proxy_url->scheme != SCHEME_HTTP && proxy_url->scheme != u->scheme)
649         {
650           logprintf (LOG_NOTQUIET, _("Error in proxy URL %s: Must be HTTP.\n"), proxy);
651           url_free (proxy_url);
652           xfree (url);
653           RESTORE_POST_DATA;
654           return PROXERR;
655         }
656     }
657
658   if (u->scheme == SCHEME_HTTP
659 #ifdef HAVE_SSL
660       || u->scheme == SCHEME_HTTPS
661 #endif
662       || (proxy_url && proxy_url->scheme == SCHEME_HTTP))
663     {
664       result = http_loop (u, &mynewloc, &local_file, refurl, dt, proxy_url);
665     }
666   else if (u->scheme == SCHEME_FTP)
667     {
668       /* If this is a redirection, we must not allow recursive FTP
669          retrieval, so we save recursion to oldrec, and restore it
670          later.  */
671       int oldrec = opt.recursive;
672       if (redirection_count)
673         opt.recursive = 0;
674       result = ftp_loop (u, dt, proxy_url);
675       opt.recursive = oldrec;
676
677       /* There is a possibility of having HTTP being redirected to
678          FTP.  In these cases we must decide whether the text is HTML
679          according to the suffix.  The HTML suffixes are `.html',
680          `.htm' and a few others, case-insensitive.  */
681       if (redirection_count && local_file && u->scheme == SCHEME_FTP)
682         {
683           if (has_html_suffix_p (local_file))
684             *dt |= TEXTHTML;
685         }
686     }
687
688   if (proxy_url)
689     {
690       url_free (proxy_url);
691       proxy_url = NULL;
692     }
693
694   location_changed = (result == NEWLOCATION);
695   if (location_changed)
696     {
697       char *construced_newloc;
698       struct url *newloc_parsed;
699
700       assert (mynewloc != NULL);
701
702       if (local_file)
703         xfree (local_file);
704
705       /* The HTTP specs only allow absolute URLs to appear in
706          redirects, but a ton of boneheaded webservers and CGIs out
707          there break the rules and use relative URLs, and popular
708          browsers are lenient about this, so wget should be too. */
709       construced_newloc = uri_merge (url, mynewloc);
710       xfree (mynewloc);
711       mynewloc = construced_newloc;
712
713       /* Now, see if this new location makes sense. */
714       newloc_parsed = url_parse (mynewloc, &up_error_code);
715       if (!newloc_parsed)
716         {
717           logprintf (LOG_NOTQUIET, "%s: %s.\n", escnonprint_uri (mynewloc),
718                      url_error (up_error_code));
719           url_free (u);
720           xfree (url);
721           xfree (mynewloc);
722           RESTORE_POST_DATA;
723           return result;
724         }
725
726       /* Now mynewloc will become newloc_parsed->url, because if the
727          Location contained relative paths like .././something, we
728          don't want that propagating as url.  */
729       xfree (mynewloc);
730       mynewloc = xstrdup (newloc_parsed->url);
731
732       /* Check for max. number of redirections.  */
733       if (++redirection_count > MAX_REDIRECTIONS)
734         {
735           logprintf (LOG_NOTQUIET, _("%d redirections exceeded.\n"),
736                      MAX_REDIRECTIONS);
737           url_free (newloc_parsed);
738           url_free (u);
739           xfree (url);
740           xfree (mynewloc);
741           RESTORE_POST_DATA;
742           return WRONGCODE;
743         }
744
745       xfree (url);
746       url = mynewloc;
747       url_free (u);
748       u = newloc_parsed;
749
750       /* If we're being redirected from POST, we don't want to POST
751          again.  Many requests answer POST with a redirection to an
752          index page; that redirection is clearly a GET.  We "suspend"
753          POST data for the duration of the redirections, and restore
754          it when we're done. */
755       if (!post_data_suspended)
756         SUSPEND_POST_DATA;
757
758       goto redirected;
759     }
760
761   if (local_file)
762     {
763       if (*dt & RETROKF)
764         {
765           register_download (u->url, local_file);
766           if (redirection_count && 0 != strcmp (origurl, u->url))
767             register_redirection (origurl, u->url);
768           if (*dt & TEXTHTML)
769             register_html (u->url, local_file);
770         }
771     }
772
773   if (file)
774     *file = local_file ? local_file : NULL;
775   else
776     xfree_null (local_file);
777
778   url_free (u);
779
780   if (redirection_count)
781     {
782       if (newloc)
783         *newloc = url;
784       else
785         xfree (url);
786     }
787   else
788     {
789       if (newloc)
790         *newloc = NULL;
791       xfree (url);
792     }
793
794   RESTORE_POST_DATA;
795
796   return result;
797 }
798
799 /* Find the URLs in the file and call retrieve_url() for each of
800    them.  If HTML is non-zero, treat the file as HTML, and construct
801    the URLs accordingly.
802
803    If opt.recursive is set, call retrieve_tree() for each file.  */
804
805 uerr_t
806 retrieve_from_file (const char *file, int html, int *count)
807 {
808   uerr_t status;
809   struct urlpos *url_list, *cur_url;
810
811   url_list = (html ? get_urls_html (file, NULL, NULL)
812               : get_urls_file (file));
813   status = RETROK;             /* Suppose everything is OK.  */
814   *count = 0;                  /* Reset the URL count.  */
815
816   for (cur_url = url_list; cur_url; cur_url = cur_url->next, ++*count)
817     {
818       char *filename = NULL, *new_file = NULL;
819       int dt;
820
821       if (cur_url->ignore_when_downloading)
822         continue;
823
824       if (opt.quota && total_downloaded_bytes > opt.quota)
825         {
826           status = QUOTEXC;
827           break;
828         }
829       if ((opt.recursive || opt.page_requisites)
830           && cur_url->url->scheme != SCHEME_FTP)
831         status = retrieve_tree (cur_url->url->url);
832       else
833         status = retrieve_url (cur_url->url->url, &filename, &new_file, NULL, &dt);
834
835       if (filename && opt.delete_after && file_exists_p (filename))
836         {
837           DEBUGP (("Removing file due to --delete-after in"
838                    " retrieve_from_file():\n"));
839           logprintf (LOG_VERBOSE, _("Removing %s.\n"), filename);
840           if (unlink (filename))
841             logprintf (LOG_NOTQUIET, "unlink: %s\n", strerror (errno));
842           dt &= ~RETROKF;
843         }
844
845       xfree_null (new_file);
846       xfree_null (filename);
847     }
848
849   /* Free the linked list of URL-s.  */
850   free_urlpos (url_list);
851
852   return status;
853 }
854
855 /* Print `giving up', or `retrying', depending on the impending
856    action.  N1 and N2 are the attempt number and the attempt limit.  */
857 void
858 printwhat (int n1, int n2)
859 {
860   logputs (LOG_VERBOSE, (n1 == n2) ? _("Giving up.\n\n") : _("Retrying.\n\n"));
861 }
862
863 /* If opt.wait or opt.waitretry are specified, and if certain
864    conditions are met, sleep the appropriate number of seconds.  See
865    the documentation of --wait and --waitretry for more information.
866
867    COUNT is the count of current retrieval, beginning with 1. */
868
869 void
870 sleep_between_retrievals (int count)
871 {
872   static int first_retrieval = 1;
873
874   if (first_retrieval)
875     {
876       /* Don't sleep before the very first retrieval. */
877       first_retrieval = 0;
878       return;
879     }
880
881   if (opt.waitretry && count > 1)
882     {
883       /* If opt.waitretry is specified and this is a retry, wait for
884          COUNT-1 number of seconds, or for opt.waitretry seconds.  */
885       if (count <= opt.waitretry)
886         xsleep (count - 1);
887       else
888         xsleep (opt.waitretry);
889     }
890   else if (opt.wait)
891     {
892       if (!opt.random_wait || count > 1)
893         /* If random-wait is not specified, or if we are sleeping
894            between retries of the same download, sleep the fixed
895            interval.  */
896         xsleep (opt.wait);
897       else
898         {
899           /* Sleep a random amount of time averaging in opt.wait
900              seconds.  The sleeping amount ranges from 0 to
901              opt.wait*2, inclusive.  */
902           double waitsecs = 2 * opt.wait * random_float ();
903           DEBUGP (("sleep_between_retrievals: avg=%f,sleep=%f\n",
904                    opt.wait, waitsecs));
905           xsleep (waitsecs);
906         }
907     }
908 }
909
910 /* Free the linked list of urlpos.  */
911 void
912 free_urlpos (struct urlpos *l)
913 {
914   while (l)
915     {
916       struct urlpos *next = l->next;
917       if (l->url)
918         url_free (l->url);
919       xfree_null (l->local_name);
920       xfree (l);
921       l = next;
922     }
923 }
924
925 /* Rotate FNAME opt.backups times */
926 void
927 rotate_backups(const char *fname)
928 {
929   int maxlen = strlen (fname) + 1 + numdigit (opt.backups) + 1;
930   char *from = (char *)alloca (maxlen);
931   char *to = (char *)alloca (maxlen);
932   struct_stat sb;
933   int i;
934
935   if (stat (fname, &sb) == 0)
936     if (S_ISREG (sb.st_mode) == 0)
937       return;
938
939   for (i = opt.backups; i > 1; i--)
940     {
941       sprintf (from, "%s.%d", fname, i - 1);
942       sprintf (to, "%s.%d", fname, i);
943       rename (from, to);
944     }
945
946   sprintf (to, "%s.%d", fname, 1);
947   rename(fname, to);
948 }
949
950 static int no_proxy_match PARAMS ((const char *, const char **));
951
952 /* Return the URL of the proxy appropriate for url U.  */
953
954 static char *
955 getproxy (struct url *u)
956 {
957   char *proxy = NULL;
958   char *rewritten_url;
959   static char rewritten_storage[1024];
960
961   if (!opt.use_proxy)
962     return NULL;
963   if (!no_proxy_match (u->host, (const char **)opt.no_proxy))
964     return NULL;
965
966   switch (u->scheme)
967     {
968     case SCHEME_HTTP:
969       proxy = opt.http_proxy ? opt.http_proxy : getenv ("http_proxy");
970       break;
971 #ifdef HAVE_SSL
972     case SCHEME_HTTPS:
973       proxy = opt.https_proxy ? opt.https_proxy : getenv ("https_proxy");
974       break;
975 #endif
976     case SCHEME_FTP:
977       proxy = opt.ftp_proxy ? opt.ftp_proxy : getenv ("ftp_proxy");
978       break;
979     case SCHEME_INVALID:
980       break;
981     }
982   if (!proxy || !*proxy)
983     return NULL;
984
985   /* Handle shorthands.  `rewritten_storage' is a kludge to allow
986      getproxy() to return static storage. */
987   rewritten_url = rewrite_shorthand_url (proxy);
988   if (rewritten_url)
989     {
990       strncpy (rewritten_storage, rewritten_url, sizeof (rewritten_storage));
991       rewritten_storage[sizeof (rewritten_storage) - 1] = '\0';
992       proxy = rewritten_storage;
993     }
994
995   return proxy;
996 }
997
998 /* Should a host be accessed through proxy, concerning no_proxy?  */
999 int
1000 no_proxy_match (const char *host, const char **no_proxy)
1001 {
1002   if (!no_proxy)
1003     return 1;
1004   else
1005     return !sufmatch (no_proxy, host);
1006 }