]> sjero.net Git - wget/blob - src/retr.c
[svn] Remove K&R support.
[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 LARGE_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 int 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   int progress_interactive = 0;
210
211   int 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 non-zero, strings will be
500    padded to the width of 7 characters (xxxx.xx).  */
501 char *
502 retr_rate (wgint bytes, double msecs, int 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 = 1;                      \
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 = 0;                          \
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   int location_changed, dummy;
589   char *mynewloc, *proxy;
590   struct url *u, *proxy_url;
591   int up_error_code;            /* url parse error code */
592   char *local_file;
593   int redirection_count = 0;
594
595   int post_data_suspended = 0;
596   char *saved_post_data = NULL;
597   char *saved_post_file_name = NULL;
598
599   /* If dt is NULL, use local storage.  */
600   if (!dt)
601     {
602       dt = &dummy;
603       dummy = 0;
604     }
605   url = xstrdup (origurl);
606   if (newloc)
607     *newloc = NULL;
608   if (file)
609     *file = NULL;
610
611   u = url_parse (url, &up_error_code);
612   if (!u)
613     {
614       logprintf (LOG_NOTQUIET, "%s: %s.\n", url, url_error (up_error_code));
615       xfree (url);
616       return URLERROR;
617     }
618
619   if (!refurl)
620     refurl = opt.referer;
621
622  redirected:
623
624   result = NOCONERROR;
625   mynewloc = NULL;
626   local_file = NULL;
627   proxy_url = NULL;
628
629   proxy = getproxy (u);
630   if (proxy)
631     {
632       /* Parse the proxy URL.  */
633       proxy_url = url_parse (proxy, &up_error_code);
634       if (!proxy_url)
635         {
636           logprintf (LOG_NOTQUIET, _("Error parsing proxy URL %s: %s.\n"),
637                      proxy, url_error (up_error_code));
638           xfree (url);
639           RESTORE_POST_DATA;
640           return PROXERR;
641         }
642       if (proxy_url->scheme != SCHEME_HTTP && proxy_url->scheme != u->scheme)
643         {
644           logprintf (LOG_NOTQUIET, _("Error in proxy URL %s: Must be HTTP.\n"), proxy);
645           url_free (proxy_url);
646           xfree (url);
647           RESTORE_POST_DATA;
648           return PROXERR;
649         }
650     }
651
652   if (u->scheme == SCHEME_HTTP
653 #ifdef HAVE_SSL
654       || u->scheme == SCHEME_HTTPS
655 #endif
656       || (proxy_url && proxy_url->scheme == SCHEME_HTTP))
657     {
658       result = http_loop (u, &mynewloc, &local_file, refurl, dt, proxy_url);
659     }
660   else if (u->scheme == SCHEME_FTP)
661     {
662       /* If this is a redirection, we must not allow recursive FTP
663          retrieval, so we save recursion to oldrec, and restore it
664          later.  */
665       int oldrec = opt.recursive;
666       if (redirection_count)
667         opt.recursive = 0;
668       result = ftp_loop (u, dt, proxy_url);
669       opt.recursive = oldrec;
670
671       /* There is a possibility of having HTTP being redirected to
672          FTP.  In these cases we must decide whether the text is HTML
673          according to the suffix.  The HTML suffixes are `.html',
674          `.htm' and a few others, case-insensitive.  */
675       if (redirection_count && local_file && u->scheme == SCHEME_FTP)
676         {
677           if (has_html_suffix_p (local_file))
678             *dt |= TEXTHTML;
679         }
680     }
681
682   if (proxy_url)
683     {
684       url_free (proxy_url);
685       proxy_url = NULL;
686     }
687
688   location_changed = (result == NEWLOCATION);
689   if (location_changed)
690     {
691       char *construced_newloc;
692       struct url *newloc_parsed;
693
694       assert (mynewloc != NULL);
695
696       if (local_file)
697         xfree (local_file);
698
699       /* The HTTP specs only allow absolute URLs to appear in
700          redirects, but a ton of boneheaded webservers and CGIs out
701          there break the rules and use relative URLs, and popular
702          browsers are lenient about this, so wget should be too. */
703       construced_newloc = uri_merge (url, mynewloc);
704       xfree (mynewloc);
705       mynewloc = construced_newloc;
706
707       /* Now, see if this new location makes sense. */
708       newloc_parsed = url_parse (mynewloc, &up_error_code);
709       if (!newloc_parsed)
710         {
711           logprintf (LOG_NOTQUIET, "%s: %s.\n", escnonprint_uri (mynewloc),
712                      url_error (up_error_code));
713           url_free (u);
714           xfree (url);
715           xfree (mynewloc);
716           RESTORE_POST_DATA;
717           return result;
718         }
719
720       /* Now mynewloc will become newloc_parsed->url, because if the
721          Location contained relative paths like .././something, we
722          don't want that propagating as url.  */
723       xfree (mynewloc);
724       mynewloc = xstrdup (newloc_parsed->url);
725
726       /* Check for max. number of redirections.  */
727       if (++redirection_count > MAX_REDIRECTIONS)
728         {
729           logprintf (LOG_NOTQUIET, _("%d redirections exceeded.\n"),
730                      MAX_REDIRECTIONS);
731           url_free (newloc_parsed);
732           url_free (u);
733           xfree (url);
734           xfree (mynewloc);
735           RESTORE_POST_DATA;
736           return WRONGCODE;
737         }
738
739       xfree (url);
740       url = mynewloc;
741       url_free (u);
742       u = newloc_parsed;
743
744       /* If we're being redirected from POST, we don't want to POST
745          again.  Many requests answer POST with a redirection to an
746          index page; that redirection is clearly a GET.  We "suspend"
747          POST data for the duration of the redirections, and restore
748          it when we're done. */
749       if (!post_data_suspended)
750         SUSPEND_POST_DATA;
751
752       goto redirected;
753     }
754
755   if (local_file)
756     {
757       if (*dt & RETROKF)
758         {
759           register_download (u->url, local_file);
760           if (redirection_count && 0 != strcmp (origurl, u->url))
761             register_redirection (origurl, u->url);
762           if (*dt & TEXTHTML)
763             register_html (u->url, local_file);
764         }
765     }
766
767   if (file)
768     *file = local_file ? local_file : NULL;
769   else
770     xfree_null (local_file);
771
772   url_free (u);
773
774   if (redirection_count)
775     {
776       if (newloc)
777         *newloc = url;
778       else
779         xfree (url);
780     }
781   else
782     {
783       if (newloc)
784         *newloc = NULL;
785       xfree (url);
786     }
787
788   RESTORE_POST_DATA;
789
790   return result;
791 }
792
793 /* Find the URLs in the file and call retrieve_url() for each of
794    them.  If HTML is non-zero, treat the file as HTML, and construct
795    the URLs accordingly.
796
797    If opt.recursive is set, call retrieve_tree() for each file.  */
798
799 uerr_t
800 retrieve_from_file (const char *file, int html, int *count)
801 {
802   uerr_t status;
803   struct urlpos *url_list, *cur_url;
804
805   url_list = (html ? get_urls_html (file, NULL, NULL)
806               : get_urls_file (file));
807   status = RETROK;             /* Suppose everything is OK.  */
808   *count = 0;                  /* Reset the URL count.  */
809
810   for (cur_url = url_list; cur_url; cur_url = cur_url->next, ++*count)
811     {
812       char *filename = NULL, *new_file = NULL;
813       int dt;
814
815       if (cur_url->ignore_when_downloading)
816         continue;
817
818       if (opt.quota && total_downloaded_bytes > opt.quota)
819         {
820           status = QUOTEXC;
821           break;
822         }
823       if ((opt.recursive || opt.page_requisites)
824           && cur_url->url->scheme != SCHEME_FTP)
825         status = retrieve_tree (cur_url->url->url);
826       else
827         status = retrieve_url (cur_url->url->url, &filename, &new_file, NULL, &dt);
828
829       if (filename && opt.delete_after && file_exists_p (filename))
830         {
831           DEBUGP (("\
832 Removing file due to --delete-after in retrieve_from_file():\n"));
833           logprintf (LOG_VERBOSE, _("Removing %s.\n"), filename);
834           if (unlink (filename))
835             logprintf (LOG_NOTQUIET, "unlink: %s\n", strerror (errno));
836           dt &= ~RETROKF;
837         }
838
839       xfree_null (new_file);
840       xfree_null (filename);
841     }
842
843   /* Free the linked list of URL-s.  */
844   free_urlpos (url_list);
845
846   return status;
847 }
848
849 /* Print `giving up', or `retrying', depending on the impending
850    action.  N1 and N2 are the attempt number and the attempt limit.  */
851 void
852 printwhat (int n1, int n2)
853 {
854   logputs (LOG_VERBOSE, (n1 == n2) ? _("Giving up.\n\n") : _("Retrying.\n\n"));
855 }
856
857 /* If opt.wait or opt.waitretry are specified, and if certain
858    conditions are met, sleep the appropriate number of seconds.  See
859    the documentation of --wait and --waitretry for more information.
860
861    COUNT is the count of current retrieval, beginning with 1. */
862
863 void
864 sleep_between_retrievals (int count)
865 {
866   static int first_retrieval = 1;
867
868   if (first_retrieval)
869     {
870       /* Don't sleep before the very first retrieval. */
871       first_retrieval = 0;
872       return;
873     }
874
875   if (opt.waitretry && count > 1)
876     {
877       /* If opt.waitretry is specified and this is a retry, wait for
878          COUNT-1 number of seconds, or for opt.waitretry seconds.  */
879       if (count <= opt.waitretry)
880         xsleep (count - 1);
881       else
882         xsleep (opt.waitretry);
883     }
884   else if (opt.wait)
885     {
886       if (!opt.random_wait || count > 1)
887         /* If random-wait is not specified, or if we are sleeping
888            between retries of the same download, sleep the fixed
889            interval.  */
890         xsleep (opt.wait);
891       else
892         {
893           /* Sleep a random amount of time averaging in opt.wait
894              seconds.  The sleeping amount ranges from 0 to
895              opt.wait*2, inclusive.  */
896           double waitsecs = 2 * opt.wait * random_float ();
897           DEBUGP (("sleep_between_retrievals: avg=%f,sleep=%f\n",
898                    opt.wait, waitsecs));
899           xsleep (waitsecs);
900         }
901     }
902 }
903
904 /* Free the linked list of urlpos.  */
905 void
906 free_urlpos (struct urlpos *l)
907 {
908   while (l)
909     {
910       struct urlpos *next = l->next;
911       if (l->url)
912         url_free (l->url);
913       xfree_null (l->local_name);
914       xfree (l);
915       l = next;
916     }
917 }
918
919 /* Rotate FNAME opt.backups times */
920 void
921 rotate_backups(const char *fname)
922 {
923   int maxlen = strlen (fname) + 1 + numdigit (opt.backups) + 1;
924   char *from = (char *)alloca (maxlen);
925   char *to = (char *)alloca (maxlen);
926   struct_stat sb;
927   int i;
928
929   if (stat (fname, &sb) == 0)
930     if (S_ISREG (sb.st_mode) == 0)
931       return;
932
933   for (i = opt.backups; i > 1; i--)
934     {
935       sprintf (from, "%s.%d", fname, i - 1);
936       sprintf (to, "%s.%d", fname, i);
937       rename (from, to);
938     }
939
940   sprintf (to, "%s.%d", fname, 1);
941   rename(fname, to);
942 }
943
944 static int no_proxy_match (const char *, const char **);
945
946 /* Return the URL of the proxy appropriate for url U.  */
947
948 static char *
949 getproxy (struct url *u)
950 {
951   char *proxy = NULL;
952   char *rewritten_url;
953   static char rewritten_storage[1024];
954
955   if (!opt.use_proxy)
956     return NULL;
957   if (!no_proxy_match (u->host, (const char **)opt.no_proxy))
958     return NULL;
959
960   switch (u->scheme)
961     {
962     case SCHEME_HTTP:
963       proxy = opt.http_proxy ? opt.http_proxy : getenv ("http_proxy");
964       break;
965 #ifdef HAVE_SSL
966     case SCHEME_HTTPS:
967       proxy = opt.https_proxy ? opt.https_proxy : getenv ("https_proxy");
968       break;
969 #endif
970     case SCHEME_FTP:
971       proxy = opt.ftp_proxy ? opt.ftp_proxy : getenv ("ftp_proxy");
972       break;
973     case SCHEME_INVALID:
974       break;
975     }
976   if (!proxy || !*proxy)
977     return NULL;
978
979   /* Handle shorthands.  `rewritten_storage' is a kludge to allow
980      getproxy() to return static storage. */
981   rewritten_url = rewrite_shorthand_url (proxy);
982   if (rewritten_url)
983     {
984       strncpy (rewritten_storage, rewritten_url, sizeof (rewritten_storage));
985       rewritten_storage[sizeof (rewritten_storage) - 1] = '\0';
986       proxy = rewritten_storage;
987     }
988
989   return proxy;
990 }
991
992 /* Should a host be accessed through proxy, concerning no_proxy?  */
993 static int
994 no_proxy_match (const char *host, const char **no_proxy)
995 {
996   if (!no_proxy)
997     return 1;
998   else
999     return !sufmatch (no_proxy, host);
1000 }