]> sjero.net Git - wget/blob - src/retr.c
[svn] Undo the 2004-11-18 change to fd_read_body. Instead, always use the
[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   int exact = 1;
219   wgint skip = 0;
220
221   /* How much data we've read/written.  */
222   wgint sum_read = 0;
223   wgint sum_written = 0;
224
225   if (flags & rb_skip_startpos)
226     skip = startpos;
227
228   if (opt.verbose)
229     {
230       /* If we're skipping STARTPOS bytes, pass 0 as the INITIAL
231          argument to progress_create because the indicator doesn't
232          (yet) know about "skipping" data.  */
233       progress = progress_create (skip ? 0 : startpos, startpos + toread);
234       progress_interactive = progress_interactive_p (progress);
235     }
236
237   if (opt.limit_rate)
238     limit_bandwidth_reset ();
239
240   /* A timer is needed for tracking progress, for throttling, and for
241      tracking elapsed time.  If either of these are requested, start
242      the timer.  */
243   if (progress || opt.limit_rate || elapsed)
244     {
245       timer = wtimer_new ();
246       last_successful_read_tm = 0;
247     }
248
249   /* Use a smaller buffer for low requested bandwidths.  For example,
250      with --limit-rate=2k, it doesn't make sense to slurp in 16K of
251      data and then sleep for 8s.  With buffer size equal to the limit,
252      we never have to sleep for more than one second.  */
253   if (opt.limit_rate && opt.limit_rate < dlbufsize)
254     dlbufsize = opt.limit_rate;
255
256   /* Read from FD while there is data to read.  Normally toread==0
257      means that it is unknown how much data is to arrive.  However, if
258      EXACT is set, then toread==0 means what it says: that no data
259      should be read.  */
260   while (!exact || (sum_read < toread))
261     {
262       int rdsize = exact ? MIN (toread - sum_read, dlbufsize) : dlbufsize;
263       double tmout = opt.read_timeout;
264       if (progress_interactive)
265         {
266           /* For interactive progress gauges, always specify a ~1s
267              timeout, so that the gauge can be updated regularly even
268              when the data arrives very slowly or stalls.  */
269           tmout = 0.95;
270           if (opt.read_timeout)
271             {
272               double waittm;
273               waittm = (wtimer_read (timer) - last_successful_read_tm) / 1000;
274               if (waittm + tmout > opt.read_timeout)
275                 {
276                   /* Don't let total idle time exceed read timeout. */
277                   tmout = opt.read_timeout - waittm;
278                   if (tmout < 0)
279                     {
280                       /* We've already exceeded the timeout. */
281                       ret = -1, errno = ETIMEDOUT;
282                       break;
283                     }
284                 }
285             }
286         }
287       ret = fd_read (fd, dlbuf, rdsize, tmout);
288
289       if (ret == 0 || (ret < 0 && errno != ETIMEDOUT))
290         break;                  /* read error */
291       else if (ret < 0)
292         ret = 0;                /* read timeout */
293
294       if (progress || opt.limit_rate)
295         {
296           wtimer_update (timer);
297           if (ret > 0)
298             last_successful_read_tm = wtimer_read (timer);
299         }
300
301       if (ret > 0)
302         {
303           sum_read += ret;
304           if (!write_data (out, dlbuf, ret, &skip, &sum_written))
305             {
306               ret = -2;
307               goto out;
308             }
309         }
310
311       if (opt.limit_rate)
312         limit_bandwidth (ret, timer);
313
314       if (progress)
315         progress_update (progress, ret, wtimer_read (timer));
316 #ifdef WINDOWS
317       if (toread > 0 && !opt.quiet)
318         ws_percenttitle (100.0 *
319                          (startpos + sum_read) / (startpos + toread));
320 #endif
321     }
322   if (ret < -1)
323     ret = -1;
324
325  out:
326   if (progress)
327     progress_finish (progress, wtimer_read (timer));
328
329   if (elapsed)
330     *elapsed = wtimer_read (timer);
331   if (timer)
332     wtimer_delete (timer);
333
334   if (qtyread)
335     *qtyread += sum_read;
336   if (qtywritten)
337     *qtywritten += sum_written;
338
339   return ret;
340 }
341 \f
342 /* Read a hunk of data from FD, up until a terminator.  The terminator
343    is whatever the TERMINATOR function determines it to be; for
344    example, it can be a line of data, or the head of an HTTP response.
345    The function returns the data read allocated with malloc.
346
347    In case of error, NULL is returned.  In case of EOF and no data
348    read, NULL is returned and errno set to 0.  In case of EOF with
349    data having been read, the data is returned, but it will
350    (obviously) not contain the terminator.
351
352    The idea is to be able to read a line of input, or otherwise a hunk
353    of text, such as the head of an HTTP request, without crossing the
354    boundary, so that the next call to fd_read etc. reads the data
355    after the hunk.  To achieve that, this function does the following:
356
357    1. Peek at available data.
358
359    2. Determine whether the peeked data, along with the previously
360       read data, includes the terminator.
361
362       2a. If yes, read the data until the end of the terminator, and
363           exit.
364
365       2b. If no, read the peeked data and goto 1.
366
367    The function is careful to assume as little as possible about the
368    implementation of peeking.  For example, every peek is followed by
369    a read.  If the read returns a different amount of data, the
370    process is retried until all data arrives safely.
371
372    SIZEHINT is the buffer size sufficient to hold all the data in the
373    typical case (it is used as the initial buffer size).  MAXSIZE is
374    the maximum amount of memory this function is allowed to allocate,
375    or 0 if no upper limit is to be enforced.
376
377    This function should be used as a building block for other
378    functions -- see fd_read_line as a simple example.  */
379
380 char *
381 fd_read_hunk (int fd, hunk_terminator_t terminator, long sizehint, long maxsize)
382 {
383   long bufsize = sizehint;
384   char *hunk = xmalloc (bufsize);
385   int tail = 0;                 /* tail position in HUNK */
386
387   assert (maxsize >= bufsize);
388
389   while (1)
390     {
391       const char *end;
392       int pklen, rdlen, remain;
393
394       /* First, peek at the available data. */
395
396       pklen = fd_peek (fd, hunk + tail, bufsize - 1 - tail, -1);
397       if (pklen < 0)
398         {
399           xfree (hunk);
400           return NULL;
401         }
402       end = terminator (hunk, tail, pklen);
403       if (end)
404         {
405           /* The data contains the terminator: we'll drain the data up
406              to the end of the terminator.  */
407           remain = end - (hunk + tail);
408           if (remain == 0)
409             {
410               /* No more data needs to be read. */
411               hunk[tail] = '\0';
412               return hunk;
413             }
414           if (bufsize - 1 < tail + remain)
415             {
416               bufsize = tail + remain + 1;
417               hunk = xrealloc (hunk, bufsize);
418             }
419         }
420       else
421         /* No terminator: simply read the data we know is (or should
422            be) available.  */
423         remain = pklen;
424
425       /* Now, read the data.  Note that we make no assumptions about
426          how much data we'll get.  (Some TCP stacks are notorious for
427          read returning less data than the previous MSG_PEEK.)  */
428
429       rdlen = fd_read (fd, hunk + tail, remain, 0);
430       if (rdlen < 0)
431         {
432           xfree_null (hunk);
433           return NULL;
434         }
435       tail += rdlen;
436       hunk[tail] = '\0';
437
438       if (rdlen == 0)
439         {
440           if (tail == 0)
441             {
442               /* EOF without anything having been read */
443               xfree (hunk);
444               errno = 0;
445               return NULL;
446             }
447           else
448             /* EOF seen: return the data we've read. */
449             return hunk;
450         }
451       if (end && rdlen == remain)
452         /* The terminator was seen and the remaining data drained --
453            we got what we came for.  */
454         return hunk;
455
456       /* Keep looping until all the data arrives. */
457
458       if (tail == bufsize - 1)
459         {
460           /* Double the buffer size, but refuse to allocate more than
461              MAXSIZE bytes.  */
462           if (maxsize && bufsize >= maxsize)
463             {
464               xfree (hunk);
465               errno = ENOMEM;
466               return NULL;
467             }
468           bufsize <<= 1;
469           if (maxsize && bufsize > maxsize)
470             bufsize = maxsize;
471           hunk = xrealloc (hunk, bufsize);
472         }
473     }
474 }
475
476 static const char *
477 line_terminator (const char *hunk, int oldlen, int peeklen)
478 {
479   const char *p = memchr (hunk + oldlen, '\n', peeklen);
480   if (p)
481     /* p+1 because we want the line to include '\n' */
482     return p + 1;
483   return NULL;
484 }
485
486 /* The maximum size of the single line we agree to accept.  This is
487    not meant to impose an arbitrary limit, but to protect the user
488    from Wget slurping up available memory upon encountering malicious
489    or buggy server output.  Define it to 0 to remove the limit.  */
490 #define FD_READ_LINE_MAX 4096
491
492 /* Read one line from FD and return it.  The line is allocated using
493    malloc, but is never larger than FD_READ_LINE_MAX.
494
495    If an error occurs, or if no data can be read, NULL is returned.
496    In the former case errno indicates the error condition, and in the
497    latter case, errno is NULL.  */
498
499 char *
500 fd_read_line (int fd)
501 {
502   return fd_read_hunk (fd, line_terminator, 128, FD_READ_LINE_MAX);
503 }
504 \f
505 /* Return a printed representation of the download rate, as
506    appropriate for the speed.  If PAD is non-zero, strings will be
507    padded to the width of 7 characters (xxxx.xx).  */
508 char *
509 retr_rate (wgint bytes, double msecs, int pad)
510 {
511   static char res[20];
512   static const char *rate_names[] = {"B/s", "KB/s", "MB/s", "GB/s" };
513   int units = 0;
514
515   double dlrate = calc_rate (bytes, msecs, &units);
516   sprintf (res, pad ? "%7.2f %s" : "%.2f %s", dlrate, rate_names[units]);
517
518   return res;
519 }
520
521 /* Calculate the download rate and trim it as appropriate for the
522    speed.  Appropriate means that if rate is greater than 1K/s,
523    kilobytes are used, and if rate is greater than 1MB/s, megabytes
524    are used.
525
526    UNITS is zero for B/s, one for KB/s, two for MB/s, and three for
527    GB/s.  */
528 double
529 calc_rate (wgint bytes, double msecs, int *units)
530 {
531   double dlrate;
532
533   assert (msecs >= 0);
534   assert (bytes >= 0);
535
536   if (msecs == 0)
537     /* If elapsed time is exactly zero, it means we're under the
538        granularity of the timer.  This often happens on systems that
539        use time() for the timer.  */
540     msecs = wtimer_granularity ();
541
542   dlrate = (double)1000 * 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 }