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