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