]> sjero.net Git - wget/blob - src/retr.c
warc: fix format string for off_t in CDX function.
[wget] / src / retr.c
1 /* File retrieval.
2    Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
3    2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation,
4    Inc.
5
6 This file is part of GNU Wget.
7
8 GNU Wget is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3 of the License, or (at
11 your option) any later version.
12
13 GNU Wget is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with Wget.  If not, see <http://www.gnu.org/licenses/>.
20
21 Additional permission under GNU GPL version 3 section 7
22
23 If you modify this program, or any covered work, by linking or
24 combining it with the OpenSSL project's OpenSSL library (or a
25 modified version of that library), containing parts covered by the
26 terms of the OpenSSL or SSLeay licenses, the Free Software Foundation
27 grants you additional permission to convey the resulting work.
28 Corresponding Source for a non-source form of such a combination
29 shall include the source code for the parts of OpenSSL used as well
30 as that of the covered work.  */
31
32 #include "wget.h"
33
34 #include <stdio.h>
35 #include <stdlib.h>
36 #include <unistd.h>
37 #include <errno.h>
38 #include <string.h>
39 #include <assert.h>
40
41 #include "exits.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 #include "html-url.h"
55 #include "iri.h"
56
57 /* Total size of downloaded files.  Used to enforce quota.  */
58 SUM_SIZE_INT total_downloaded_bytes;
59
60 /* Total download time in seconds. */
61 double total_download_time;
62
63 /* If non-NULL, the stream to which output should be written.  This
64    stream is initialized when `-O' is used.  */
65 FILE *output_stream;
66
67 /* Whether output_document is a regular file we can manipulate,
68    i.e. not `-' or a device file. */
69 bool output_stream_regular;
70 \f
71 static struct {
72   wgint chunk_bytes;
73   double chunk_start;
74   double sleep_adjust;
75 } limit_data;
76
77 static void
78 limit_bandwidth_reset (void)
79 {
80   xzero (limit_data);
81 }
82
83 /* Limit the bandwidth by pausing the download for an amount of time.
84    BYTES is the number of bytes received from the network, and TIMER
85    is the timer that started at the beginning of download.  */
86
87 static void
88 limit_bandwidth (wgint bytes, struct ptimer *timer)
89 {
90   double delta_t = ptimer_read (timer) - limit_data.chunk_start;
91   double expected;
92
93   limit_data.chunk_bytes += bytes;
94
95   /* Calculate the amount of time we expect downloading the chunk
96      should take.  If in reality it took less time, sleep to
97      compensate for the difference.  */
98   expected = (double) limit_data.chunk_bytes / opt.limit_rate;
99
100   if (expected > delta_t)
101     {
102       double slp = expected - delta_t + limit_data.sleep_adjust;
103       double t0, t1;
104       if (slp < 0.2)
105         {
106           DEBUGP (("deferring a %.2f ms sleep (%s/%.2f).\n",
107                    slp * 1000, number_to_static_string (limit_data.chunk_bytes),
108                    delta_t));
109           return;
110         }
111       DEBUGP (("\nsleeping %.2f ms for %s bytes, adjust %.2f ms\n",
112                slp * 1000, number_to_static_string (limit_data.chunk_bytes),
113                limit_data.sleep_adjust));
114
115       t0 = ptimer_read (timer);
116       xsleep (slp);
117       t1 = ptimer_measure (timer);
118
119       /* Due to scheduling, we probably slept slightly longer (or
120          shorter) than desired.  Calculate the difference between the
121          desired and the actual sleep, and adjust the next sleep by
122          that amount.  */
123       limit_data.sleep_adjust = slp - (t1 - t0);
124       /* If sleep_adjust is very large, it's likely due to suspension
125          and not clock inaccuracy.  Don't enforce those.  */
126       if (limit_data.sleep_adjust > 0.5)
127         limit_data.sleep_adjust = 0.5;
128       else if (limit_data.sleep_adjust < -0.5)
129         limit_data.sleep_adjust = -0.5;
130     }
131
132   limit_data.chunk_bytes = 0;
133   limit_data.chunk_start = ptimer_read (timer);
134 }
135
136 #ifndef MIN
137 # define MIN(i, j) ((i) <= (j) ? (i) : (j))
138 #endif
139
140 /* Write data in BUF to OUT.  However, if *SKIP is non-zero, skip that
141    amount of data and decrease SKIP.  Increment *TOTAL by the amount
142    of data written.  If OUT2 is not NULL, also write BUF to OUT2.
143    In case of error writing to OUT, -1 is returned.  In case of error
144    writing to OUT2, -2 is returned.  Return 1 if the whole BUF was
145    skipped.  */
146
147 static int
148 write_data (FILE *out, FILE *out2, const char *buf, int bufsize,
149             wgint *skip, wgint *written)
150 {
151   if (out == NULL && out2 == NULL)
152     return 1;
153   if (*skip > bufsize)
154     {
155       *skip -= bufsize;
156       return 1;
157     }
158   if (*skip)
159     {
160       buf += *skip;
161       bufsize -= *skip;
162       *skip = 0;
163       if (bufsize == 0)
164         return 1;
165     }
166
167   if (out != NULL)
168     fwrite (buf, 1, bufsize, out);
169   if (out2 != NULL)
170     fwrite (buf, 1, bufsize, out2);
171   *written += bufsize;
172
173   /* Immediately flush the downloaded data.  This should not hinder
174      performance: fast downloads will arrive in large 16K chunks
175      (which stdio would write out immediately anyway), and slow
176      downloads wouldn't be limited by disk speed.  */
177
178   /* 2005-04-20 SMS.
179      Perhaps it shouldn't hinder performance, but it sure does, at least
180      on VMS (more than 2X).  Rather than speculate on what it should or
181      shouldn't do, it might make more sense to test it.  Even better, it
182      might be nice to explain what possible benefit it could offer, as
183      it appears to be a clear invitation to poor performance with no
184      actual justification.  (Also, why 16K?  Anyone test other values?)
185   */
186 #ifndef __VMS
187   if (out != NULL)
188     fflush (out);
189   if (out2 != NULL)
190     fflush (out2);
191 #endif /* ndef __VMS */
192   if (out != NULL && ferror (out))
193     return -1;
194   else if (out2 != NULL && ferror (out2))
195     return -2;
196   else
197     return 0;
198 }
199
200 /* Read the contents of file descriptor FD until it the connection
201    terminates or a read error occurs.  The data is read in portions of
202    up to 16K and written to OUT as it arrives.  If opt.verbose is set,
203    the progress is shown.
204
205    TOREAD is the amount of data expected to arrive, normally only used
206    by the progress gauge.
207
208    STARTPOS is the position from which the download starts, used by
209    the progress gauge.  If QTYREAD is non-NULL, the value it points to
210    is incremented by the amount of data read from the network.  If
211    QTYWRITTEN is non-NULL, the value it points to is incremented by
212    the amount of data written to disk.  The time it took to download
213    the data is stored to ELAPSED.
214
215    If OUT2 is non-NULL, the contents is also written to OUT2.
216    OUT2 will get an exact copy of the response: if this is a chunked
217    response, everything -- including the chunk headers -- is written
218    to OUT2.  (OUT will only get the unchunked response.)
219
220    The function exits and returns the amount of data read.  In case of
221    error while reading data, -1 is returned.  In case of error while
222    writing data to OUT, -2 is returned.  In case of error while writing
223    data to OUT2, -3 is returned.  */
224
225 int
226 fd_read_body (int fd, FILE *out, wgint toread, wgint startpos,
227               wgint *qtyread, wgint *qtywritten, double *elapsed, int flags,
228               FILE *out2)
229 {
230   int ret = 0;
231 #undef max
232 #define max(a,b) ((a) > (b) ? (a) : (b))
233   int dlbufsize = max (BUFSIZ, 8 * 1024);
234   char *dlbuf = xmalloc (dlbufsize);
235
236   struct ptimer *timer = NULL;
237   double last_successful_read_tm = 0;
238
239   /* The progress gauge, set according to the user preferences. */
240   void *progress = NULL;
241
242   /* Non-zero if the progress gauge is interactive, i.e. if it can
243      continually update the display.  When true, smaller timeout
244      values are used so that the gauge can update the display when
245      data arrives slowly. */
246   bool progress_interactive = false;
247
248   bool exact = !!(flags & rb_read_exactly);
249
250   /* Used only by HTTP/HTTPS chunked transfer encoding.  */
251   bool chunked = flags & rb_chunked_transfer_encoding;
252   wgint skip = 0;
253
254   /* How much data we've read/written.  */
255   wgint sum_read = 0;
256   wgint sum_written = 0;
257   wgint remaining_chunk_size = 0;
258
259   if (flags & rb_skip_startpos)
260     skip = startpos;
261
262   if (opt.verbose)
263     {
264       /* If we're skipping STARTPOS bytes, pass 0 as the INITIAL
265          argument to progress_create because the indicator doesn't
266          (yet) know about "skipping" data.  */
267       wgint start = skip ? 0 : startpos;
268       progress = progress_create (start, start + toread);
269       progress_interactive = progress_interactive_p (progress);
270     }
271
272   if (opt.limit_rate)
273     limit_bandwidth_reset ();
274
275   /* A timer is needed for tracking progress, for throttling, and for
276      tracking elapsed time.  If either of these are requested, start
277      the timer.  */
278   if (progress || opt.limit_rate || elapsed)
279     {
280       timer = ptimer_new ();
281       last_successful_read_tm = 0;
282     }
283
284   /* Use a smaller buffer for low requested bandwidths.  For example,
285      with --limit-rate=2k, it doesn't make sense to slurp in 16K of
286      data and then sleep for 8s.  With buffer size equal to the limit,
287      we never have to sleep for more than one second.  */
288   if (opt.limit_rate && opt.limit_rate < dlbufsize)
289     dlbufsize = opt.limit_rate;
290
291   /* Read from FD while there is data to read.  Normally toread==0
292      means that it is unknown how much data is to arrive.  However, if
293      EXACT is set, then toread==0 means what it says: that no data
294      should be read.  */
295   while (!exact || (sum_read < toread))
296     {
297       int rdsize;
298       double tmout = opt.read_timeout;
299
300       if (chunked)
301         {
302           if (remaining_chunk_size == 0)
303             {
304               char *line = fd_read_line (fd);
305               char *endl;
306               if (line == NULL)
307                 {
308                   ret = -1;
309                   break;
310                 }
311               else if (out2 != NULL)
312                 fwrite (line, 1, strlen (line), out2);
313
314               remaining_chunk_size = strtol (line, &endl, 16);
315               xfree (line);
316
317               if (remaining_chunk_size == 0)
318                 {
319                   ret = 0;
320                   line = fd_read_line (fd);
321                   if (line == NULL)
322                     ret = -1;
323                   else
324                     {
325                       if (out2 != NULL)
326                         fwrite (line, 1, strlen (line), out2);
327                       xfree (line);
328                     }
329                   break;
330                 }
331             }
332
333           rdsize = MIN (remaining_chunk_size, dlbufsize);
334         }
335       else
336         rdsize = exact ? MIN (toread - sum_read, dlbufsize) : dlbufsize;
337
338       if (progress_interactive)
339         {
340           /* For interactive progress gauges, always specify a ~1s
341              timeout, so that the gauge can be updated regularly even
342              when the data arrives very slowly or stalls.  */
343           tmout = 0.95;
344           if (opt.read_timeout)
345             {
346               double waittm;
347               waittm = ptimer_read (timer) - last_successful_read_tm;
348               if (waittm + tmout > opt.read_timeout)
349                 {
350                   /* Don't let total idle time exceed read timeout. */
351                   tmout = opt.read_timeout - waittm;
352                   if (tmout < 0)
353                     {
354                       /* We've already exceeded the timeout. */
355                       ret = -1, errno = ETIMEDOUT;
356                       break;
357                     }
358                 }
359             }
360         }
361       ret = fd_read (fd, dlbuf, rdsize, tmout);
362
363       if (progress_interactive && ret < 0 && errno == ETIMEDOUT)
364         ret = 0;                /* interactive timeout, handled above */
365       else if (ret <= 0)
366         break;                  /* EOF or read error */
367
368       if (progress || opt.limit_rate || elapsed)
369         {
370           ptimer_measure (timer);
371           if (ret > 0)
372             last_successful_read_tm = ptimer_read (timer);
373         }
374
375       if (ret > 0)
376         {
377           sum_read += ret;
378           int write_res = write_data (out, out2, dlbuf, ret, &skip, &sum_written);
379           if (write_res < 0)
380             {
381               ret = (write_res == -3) ? -3 : -2;
382               goto out;
383             }
384           if (chunked)
385             {
386               remaining_chunk_size -= ret;
387               if (remaining_chunk_size == 0)
388                 {
389                   char *line = fd_read_line (fd);
390                   if (line == NULL)
391                     {
392                       ret = -1;
393                       break;
394                     }
395                   else
396                     {
397                       if (out2 != NULL)
398                         fwrite (line, 1, strlen (line), out2);
399                       xfree (line);
400                     }
401                 }
402             }
403         }
404
405       if (opt.limit_rate)
406         limit_bandwidth (ret, timer);
407
408       if (progress)
409         progress_update (progress, ret, ptimer_read (timer));
410 #ifdef WINDOWS
411       if (toread > 0 && !opt.quiet)
412         ws_percenttitle (100.0 *
413                          (startpos + sum_read) / (startpos + toread));
414 #endif
415     }
416   if (ret < -1)
417     ret = -1;
418
419  out:
420   if (progress)
421     progress_finish (progress, ptimer_read (timer));
422
423   if (elapsed)
424     *elapsed = ptimer_read (timer);
425   if (timer)
426     ptimer_destroy (timer);
427
428   if (qtyread)
429     *qtyread += sum_read;
430   if (qtywritten)
431     *qtywritten += sum_written;
432
433   free (dlbuf);
434
435   return ret;
436 }
437 \f
438 /* Read a hunk of data from FD, up until a terminator.  The hunk is
439    limited by whatever the TERMINATOR callback chooses as its
440    terminator.  For example, if terminator stops at newline, the hunk
441    will consist of a line of data; if terminator stops at two
442    newlines, it can be used to read the head of an HTTP response.
443    Upon determining the boundary, the function returns the data (up to
444    the terminator) in malloc-allocated storage.
445
446    In case of read error, NULL is returned.  In case of EOF and no
447    data read, NULL is returned and errno set to 0.  In case of having
448    read some data, but encountering EOF before seeing the terminator,
449    the data that has been read is returned, but it will (obviously)
450    not contain the terminator.
451
452    The TERMINATOR function is called with three arguments: the
453    beginning of the data read so far, the beginning of the current
454    block of peeked-at data, and the length of the current block.
455    Depending on its needs, the function is free to choose whether to
456    analyze all data or just the newly arrived data.  If TERMINATOR
457    returns NULL, it means that the terminator has not been seen.
458    Otherwise it should return a pointer to the charactre immediately
459    following the terminator.
460
461    The idea is to be able to read a line of input, or otherwise a hunk
462    of text, such as the head of an HTTP request, without crossing the
463    boundary, so that the next call to fd_read etc. reads the data
464    after the hunk.  To achieve that, this function does the following:
465
466    1. Peek at incoming data.
467
468    2. Determine whether the peeked data, along with the previously
469       read data, includes the terminator.
470
471       2a. If yes, read the data until the end of the terminator, and
472           exit.
473
474       2b. If no, read the peeked data and goto 1.
475
476    The function is careful to assume as little as possible about the
477    implementation of peeking.  For example, every peek is followed by
478    a read.  If the read returns a different amount of data, the
479    process is retried until all data arrives safely.
480
481    SIZEHINT is the buffer size sufficient to hold all the data in the
482    typical case (it is used as the initial buffer size).  MAXSIZE is
483    the maximum amount of memory this function is allowed to allocate,
484    or 0 if no upper limit is to be enforced.
485
486    This function should be used as a building block for other
487    functions -- see fd_read_line as a simple example.  */
488
489 char *
490 fd_read_hunk (int fd, hunk_terminator_t terminator, long sizehint, long maxsize)
491 {
492   long bufsize = sizehint;
493   char *hunk = xmalloc (bufsize);
494   int tail = 0;                 /* tail position in HUNK */
495
496   assert (!maxsize || maxsize >= bufsize);
497
498   while (1)
499     {
500       const char *end;
501       int pklen, rdlen, remain;
502
503       /* First, peek at the available data. */
504
505       pklen = fd_peek (fd, hunk + tail, bufsize - 1 - tail, -1);
506       if (pklen < 0)
507         {
508           xfree (hunk);
509           return NULL;
510         }
511       end = terminator (hunk, hunk + tail, pklen);
512       if (end)
513         {
514           /* The data contains the terminator: we'll drain the data up
515              to the end of the terminator.  */
516           remain = end - (hunk + tail);
517           assert (remain >= 0);
518           if (remain == 0)
519             {
520               /* No more data needs to be read. */
521               hunk[tail] = '\0';
522               return hunk;
523             }
524           if (bufsize - 1 < tail + remain)
525             {
526               bufsize = tail + remain + 1;
527               hunk = xrealloc (hunk, bufsize);
528             }
529         }
530       else
531         /* No terminator: simply read the data we know is (or should
532            be) available.  */
533         remain = pklen;
534
535       /* Now, read the data.  Note that we make no assumptions about
536          how much data we'll get.  (Some TCP stacks are notorious for
537          read returning less data than the previous MSG_PEEK.)  */
538
539       rdlen = fd_read (fd, hunk + tail, remain, 0);
540       if (rdlen < 0)
541         {
542           xfree_null (hunk);
543           return NULL;
544         }
545       tail += rdlen;
546       hunk[tail] = '\0';
547
548       if (rdlen == 0)
549         {
550           if (tail == 0)
551             {
552               /* EOF without anything having been read */
553               xfree (hunk);
554               errno = 0;
555               return NULL;
556             }
557           else
558             /* EOF seen: return the data we've read. */
559             return hunk;
560         }
561       if (end && rdlen == remain)
562         /* The terminator was seen and the remaining data drained --
563            we got what we came for.  */
564         return hunk;
565
566       /* Keep looping until all the data arrives. */
567
568       if (tail == bufsize - 1)
569         {
570           /* Double the buffer size, but refuse to allocate more than
571              MAXSIZE bytes.  */
572           if (maxsize && bufsize >= maxsize)
573             {
574               xfree (hunk);
575               errno = ENOMEM;
576               return NULL;
577             }
578           bufsize <<= 1;
579           if (maxsize && bufsize > maxsize)
580             bufsize = maxsize;
581           hunk = xrealloc (hunk, bufsize);
582         }
583     }
584 }
585
586 static const char *
587 line_terminator (const char *start, const char *peeked, int peeklen)
588 {
589   const char *p = memchr (peeked, '\n', peeklen);
590   if (p)
591     /* p+1 because the line must include '\n' */
592     return p + 1;
593   return NULL;
594 }
595
596 /* The maximum size of the single line we agree to accept.  This is
597    not meant to impose an arbitrary limit, but to protect the user
598    from Wget slurping up available memory upon encountering malicious
599    or buggy server output.  Define it to 0 to remove the limit.  */
600 #define FD_READ_LINE_MAX 4096
601
602 /* Read one line from FD and return it.  The line is allocated using
603    malloc, but is never larger than FD_READ_LINE_MAX.
604
605    If an error occurs, or if no data can be read, NULL is returned.
606    In the former case errno indicates the error condition, and in the
607    latter case, errno is NULL.  */
608
609 char *
610 fd_read_line (int fd)
611 {
612   return fd_read_hunk (fd, line_terminator, 128, FD_READ_LINE_MAX);
613 }
614 \f
615 /* Return a printed representation of the download rate, along with
616    the units appropriate for the download speed.  */
617
618 const char *
619 retr_rate (wgint bytes, double secs)
620 {
621   static char res[20];
622   static const char *rate_names[] = {"B/s", "KB/s", "MB/s", "GB/s" };
623   static const char *rate_names_bits[] = {"b/s", "Kb/s", "Mb/s", "Gb/s" };
624   int units;
625
626   double dlrate = calc_rate (bytes, secs, &units);
627   /* Use more digits for smaller numbers (regardless of unit used),
628      e.g. "1022", "247", "12.5", "2.38".  */
629   sprintf (res, "%.*f %s",
630            dlrate >= 99.95 ? 0 : dlrate >= 9.995 ? 1 : 2,
631            dlrate, !opt.report_bps ? rate_names[units]: rate_names_bits[units]);
632
633   return res;
634 }
635
636 /* Calculate the download rate and trim it as appropriate for the
637    speed.  Appropriate means that if rate is greater than 1K/s,
638    kilobytes are used, and if rate is greater than 1MB/s, megabytes
639    are used.
640
641    UNITS is zero for B/s, one for KB/s, two for MB/s, and three for
642    GB/s.  */
643
644 double
645 calc_rate (wgint bytes, double secs, int *units)
646 {
647   double dlrate;
648   double bibyte = 1000.0;
649  
650   if (!opt.report_bps)
651     bibyte = 1024.0;
652
653
654   assert (secs >= 0);
655   assert (bytes >= 0);
656
657   if (secs == 0)
658     /* If elapsed time is exactly zero, it means we're under the
659        resolution of the timer.  This can easily happen on systems
660        that use time() for the timer.  Since the interval lies between
661        0 and the timer's resolution, assume half the resolution.  */
662     secs = ptimer_resolution () / 2.0;
663
664   dlrate = convert_to_bits (bytes) / secs;
665   if (dlrate < bibyte)
666     *units = 0;
667   else if (dlrate < (bibyte * bibyte))
668     *units = 1, dlrate /= bibyte;
669   else if (dlrate < (bibyte * bibyte * bibyte))
670     *units = 2, dlrate /= (bibyte * bibyte);
671
672   else
673     /* Maybe someone will need this, one day. */
674     *units = 3, dlrate /= (bibyte * bibyte * bibyte);
675
676   return dlrate;
677 }
678 \f
679
680 #define SUSPEND_POST_DATA do {                  \
681   post_data_suspended = true;                   \
682   saved_post_data = opt.post_data;              \
683   saved_post_file_name = opt.post_file_name;    \
684   opt.post_data = NULL;                         \
685   opt.post_file_name = NULL;                    \
686 } while (0)
687
688 #define RESTORE_POST_DATA do {                          \
689   if (post_data_suspended)                              \
690     {                                                   \
691       opt.post_data = saved_post_data;                  \
692       opt.post_file_name = saved_post_file_name;        \
693       post_data_suspended = false;                      \
694     }                                                   \
695 } while (0)
696
697 static char *getproxy (struct url *);
698
699 /* Retrieve the given URL.  Decides which loop to call -- HTTP, FTP,
700    FTP, proxy, etc.  */
701
702 /* #### This function should be rewritten so it doesn't return from
703    multiple points. */
704
705 uerr_t
706 retrieve_url (struct url * orig_parsed, const char *origurl, char **file,
707               char **newloc, const char *refurl, int *dt, bool recursive,
708               struct iri *iri, bool register_status)
709 {
710   uerr_t result;
711   char *url;
712   bool location_changed;
713   bool iri_fallbacked = 0;
714   int dummy;
715   char *mynewloc, *proxy;
716   struct url *u = orig_parsed, *proxy_url;
717   int up_error_code;            /* url parse error code */
718   char *local_file;
719   int redirection_count = 0;
720
721   bool post_data_suspended = false;
722   char *saved_post_data = NULL;
723   char *saved_post_file_name = NULL;
724
725   /* If dt is NULL, use local storage.  */
726   if (!dt)
727     {
728       dt = &dummy;
729       dummy = 0;
730     }
731   url = xstrdup (origurl);
732   if (newloc)
733     *newloc = NULL;
734   if (file)
735     *file = NULL;
736
737   if (!refurl)
738     refurl = opt.referer;
739
740  redirected:
741   /* (also for IRI fallbacking) */
742
743   result = NOCONERROR;
744   mynewloc = NULL;
745   local_file = NULL;
746   proxy_url = NULL;
747
748   proxy = getproxy (u);
749   if (proxy)
750     {
751       struct iri *pi = iri_new ();
752       set_uri_encoding (pi, opt.locale, true);
753       pi->utf8_encode = false;
754
755       /* Parse the proxy URL.  */
756       proxy_url = url_parse (proxy, &up_error_code, NULL, true);
757       if (!proxy_url)
758         {
759           char *error = url_error (proxy, up_error_code);
760           logprintf (LOG_NOTQUIET, _("Error parsing proxy URL %s: %s.\n"),
761                      proxy, error);
762           xfree (url);
763           xfree (error);
764           RESTORE_POST_DATA;
765           result = PROXERR;
766           goto bail;
767         }
768       if (proxy_url->scheme != SCHEME_HTTP && proxy_url->scheme != u->scheme)
769         {
770           logprintf (LOG_NOTQUIET, _("Error in proxy URL %s: Must be HTTP.\n"), proxy);
771           url_free (proxy_url);
772           xfree (url);
773           RESTORE_POST_DATA;
774           result = PROXERR;
775           goto bail;
776         }
777     }
778
779   if (u->scheme == SCHEME_HTTP
780 #ifdef HAVE_SSL
781       || u->scheme == SCHEME_HTTPS
782 #endif
783       || (proxy_url && proxy_url->scheme == SCHEME_HTTP))
784     {
785       result = http_loop (u, orig_parsed, &mynewloc, &local_file, refurl, dt,
786                           proxy_url, iri);
787     }
788   else if (u->scheme == SCHEME_FTP)
789     {
790       /* If this is a redirection, temporarily turn off opt.ftp_glob
791          and opt.recursive, both being undesirable when following
792          redirects.  */
793       bool oldrec = recursive, glob = opt.ftp_glob;
794       if (redirection_count)
795         oldrec = glob = false;
796
797       result = ftp_loop (u, &local_file, dt, proxy_url, recursive, glob);
798       recursive = oldrec;
799
800       /* There is a possibility of having HTTP being redirected to
801          FTP.  In these cases we must decide whether the text is HTML
802          according to the suffix.  The HTML suffixes are `.html',
803          `.htm' and a few others, case-insensitive.  */
804       if (redirection_count && local_file && u->scheme == SCHEME_FTP)
805         {
806           if (has_html_suffix_p (local_file))
807             *dt |= TEXTHTML;
808         }
809     }
810
811   if (proxy_url)
812     {
813       url_free (proxy_url);
814       proxy_url = NULL;
815     }
816
817   location_changed = (result == NEWLOCATION || result == NEWLOCATION_KEEP_POST);
818   if (location_changed)
819     {
820       char *construced_newloc;
821       struct url *newloc_parsed;
822
823       assert (mynewloc != NULL);
824
825       if (local_file)
826         xfree (local_file);
827
828       /* The HTTP specs only allow absolute URLs to appear in
829          redirects, but a ton of boneheaded webservers and CGIs out
830          there break the rules and use relative URLs, and popular
831          browsers are lenient about this, so wget should be too. */
832       construced_newloc = uri_merge (url, mynewloc);
833       xfree (mynewloc);
834       mynewloc = construced_newloc;
835
836       /* Reset UTF-8 encoding state, keep the URI encoding and reset
837          the content encoding. */
838       iri->utf8_encode = opt.enable_iri;
839       set_content_encoding (iri, NULL);
840       xfree_null (iri->orig_url);
841
842       /* Now, see if this new location makes sense. */
843       newloc_parsed = url_parse (mynewloc, &up_error_code, iri, true);
844       if (!newloc_parsed)
845         {
846           char *error = url_error (mynewloc, up_error_code);
847           logprintf (LOG_NOTQUIET, "%s: %s.\n", escnonprint_uri (mynewloc),
848                      error);
849           if (orig_parsed != u)
850             {
851               url_free (u);
852             }
853           xfree (url);
854           xfree (mynewloc);
855           xfree (error);
856           RESTORE_POST_DATA;
857           goto bail;
858         }
859
860       /* Now mynewloc will become newloc_parsed->url, because if the
861          Location contained relative paths like .././something, we
862          don't want that propagating as url.  */
863       xfree (mynewloc);
864       mynewloc = xstrdup (newloc_parsed->url);
865
866       /* Check for max. number of redirections.  */
867       if (++redirection_count > opt.max_redirect)
868         {
869           logprintf (LOG_NOTQUIET, _("%d redirections exceeded.\n"),
870                      opt.max_redirect);
871           url_free (newloc_parsed);
872           if (orig_parsed != u)
873             {
874               url_free (u);
875             }
876           xfree (url);
877           xfree (mynewloc);
878           RESTORE_POST_DATA;
879           result = WRONGCODE;
880           goto bail;
881         }
882
883       xfree (url);
884       url = mynewloc;
885       if (orig_parsed != u)
886         {
887           url_free (u);
888         }
889       u = newloc_parsed;
890
891       /* If we're being redirected from POST, and we received a
892          redirect code different than 307, we don't want to POST
893          again.  Many requests answer POST with a redirection to an
894          index page; that redirection is clearly a GET.  We "suspend"
895          POST data for the duration of the redirections, and restore
896          it when we're done.
897          
898          RFC2616 HTTP/1.1 introduces code 307 Temporary Redirect
899          specifically to preserve the method of the request.
900          */
901       if (result != NEWLOCATION_KEEP_POST && !post_data_suspended)
902         SUSPEND_POST_DATA;
903
904       goto redirected;
905     }
906
907   /* Try to not encode in UTF-8 if fetching failed */
908   if (!(*dt & RETROKF) && iri->utf8_encode)
909     {
910       iri->utf8_encode = false;
911       if (orig_parsed != u)
912         {
913           url_free (u);
914         }
915       u = url_parse (origurl, NULL, iri, true);
916       if (u)
917         {
918           DEBUGP (("[IRI fallbacking to non-utf8 for %s\n", quote (url)));
919           url = xstrdup (u->url);
920           iri_fallbacked = 1;
921           goto redirected;
922         }
923       else
924           DEBUGP (("[Couldn't fallback to non-utf8 for %s\n", quote (url)));
925     }
926
927   if (local_file && u && *dt & RETROKF)
928     {
929       register_download (u->url, local_file);
930
931       if (!opt.spider && redirection_count && 0 != strcmp (origurl, u->url))
932         register_redirection (origurl, u->url);
933
934       if (*dt & TEXTHTML)
935         register_html (local_file);
936
937       if (*dt & TEXTCSS)
938         register_css (local_file);
939     }
940
941   if (file)
942     *file = local_file ? local_file : NULL;
943   else
944     xfree_null (local_file);
945
946   if (orig_parsed != u)
947     {
948       url_free (u);
949     }
950
951   if (redirection_count || iri_fallbacked)
952     {
953       if (newloc)
954         *newloc = url;
955       else
956         xfree (url);
957     }
958   else
959     {
960       if (newloc)
961         *newloc = NULL;
962       xfree (url);
963     }
964
965   RESTORE_POST_DATA;
966
967 bail:
968   if (register_status)
969     inform_exit_status (result);
970   return result;
971 }
972
973 /* Find the URLs in the file and call retrieve_url() for each of them.
974    If HTML is true, treat the file as HTML, and construct the URLs
975    accordingly.
976
977    If opt.recursive is set, call retrieve_tree() for each file.  */
978
979 uerr_t
980 retrieve_from_file (const char *file, bool html, int *count)
981 {
982   uerr_t status;
983   struct urlpos *url_list, *cur_url;
984   struct iri *iri = iri_new();
985
986   char *input_file, *url_file = NULL;
987   const char *url = file;
988
989   status = RETROK;             /* Suppose everything is OK.  */
990   *count = 0;                  /* Reset the URL count.  */
991
992   /* sXXXav : Assume filename and links in the file are in the locale */
993   set_uri_encoding (iri, opt.locale, true);
994   set_content_encoding (iri, opt.locale);
995
996   if (url_valid_scheme (url))
997     {
998       int dt,url_err;
999       uerr_t status;
1000       struct url *url_parsed = url_parse (url, &url_err, iri, true);
1001       if (!url_parsed)
1002         {
1003           char *error = url_error (url, url_err);
1004           logprintf (LOG_NOTQUIET, "%s: %s.\n", url, error);
1005           xfree (error);
1006           return URLERROR;
1007         }
1008
1009       if (!opt.base_href)
1010         opt.base_href = xstrdup (url);
1011
1012       status = retrieve_url (url_parsed, url, &url_file, NULL, NULL, &dt,
1013                              false, iri, true);
1014       url_free (url_parsed);
1015
1016       if (!url_file || (status != RETROK))
1017         return status;
1018
1019       if (dt & TEXTHTML)
1020         html = true;
1021
1022       /* If we have a found a content encoding, use it.
1023        * ( == is okay, because we're checking for identical object) */
1024       if (iri->content_encoding != opt.locale)
1025           set_uri_encoding (iri, iri->content_encoding, false);
1026
1027       /* Reset UTF-8 encode status */
1028       iri->utf8_encode = opt.enable_iri;
1029       xfree_null (iri->orig_url);
1030       iri->orig_url = NULL;
1031
1032       input_file = url_file;
1033     }
1034   else
1035     input_file = (char *) file;
1036
1037   url_list = (html ? get_urls_html (input_file, NULL, NULL, iri)
1038               : get_urls_file (input_file));
1039
1040   xfree_null (url_file);
1041
1042   for (cur_url = url_list; cur_url; cur_url = cur_url->next, ++*count)
1043     {
1044       char *filename = NULL, *new_file = NULL;
1045       int dt;
1046       struct iri *tmpiri = iri_dup (iri);
1047       struct url *parsed_url = NULL;
1048
1049       if (cur_url->ignore_when_downloading)
1050         continue;
1051
1052       if (opt.quota && total_downloaded_bytes > opt.quota)
1053         {
1054           status = QUOTEXC;
1055           break;
1056         }
1057
1058       parsed_url = url_parse (cur_url->url->url, NULL, tmpiri, true);
1059
1060       if ((opt.recursive || opt.page_requisites)
1061           && (cur_url->url->scheme != SCHEME_FTP || getproxy (cur_url->url)))
1062         {
1063           int old_follow_ftp = opt.follow_ftp;
1064
1065           /* Turn opt.follow_ftp on in case of recursive FTP retrieval */
1066           if (cur_url->url->scheme == SCHEME_FTP)
1067             opt.follow_ftp = 1;
1068
1069           status = retrieve_tree (parsed_url ? parsed_url : cur_url->url,
1070                                   tmpiri);
1071
1072           opt.follow_ftp = old_follow_ftp;
1073         }
1074       else
1075         status = retrieve_url (parsed_url ? parsed_url : cur_url->url,
1076                                cur_url->url->url, &filename,
1077                                &new_file, NULL, &dt, opt.recursive, tmpiri,
1078                                true);
1079
1080       if (parsed_url)
1081           url_free (parsed_url);
1082
1083       if (filename && opt.delete_after && file_exists_p (filename))
1084         {
1085           DEBUGP (("\
1086 Removing file due to --delete-after in retrieve_from_file():\n"));
1087           logprintf (LOG_VERBOSE, _("Removing %s.\n"), filename);
1088           if (unlink (filename))
1089             logprintf (LOG_NOTQUIET, "unlink: %s\n", strerror (errno));
1090           dt &= ~RETROKF;
1091         }
1092
1093       xfree_null (new_file);
1094       xfree_null (filename);
1095       iri_free (tmpiri);
1096     }
1097
1098   /* Free the linked list of URL-s.  */
1099   free_urlpos (url_list);
1100
1101   iri_free (iri);
1102
1103   return status;
1104 }
1105
1106 /* Print `giving up', or `retrying', depending on the impending
1107    action.  N1 and N2 are the attempt number and the attempt limit.  */
1108 void
1109 printwhat (int n1, int n2)
1110 {
1111   logputs (LOG_VERBOSE, (n1 == n2) ? _("Giving up.\n\n") : _("Retrying.\n\n"));
1112 }
1113
1114 /* If opt.wait or opt.waitretry are specified, and if certain
1115    conditions are met, sleep the appropriate number of seconds.  See
1116    the documentation of --wait and --waitretry for more information.
1117
1118    COUNT is the count of current retrieval, beginning with 1. */
1119
1120 void
1121 sleep_between_retrievals (int count)
1122 {
1123   static bool first_retrieval = true;
1124
1125   if (first_retrieval)
1126     {
1127       /* Don't sleep before the very first retrieval. */
1128       first_retrieval = false;
1129       return;
1130     }
1131
1132   if (opt.waitretry && count > 1)
1133     {
1134       /* If opt.waitretry is specified and this is a retry, wait for
1135          COUNT-1 number of seconds, or for opt.waitretry seconds.  */
1136       if (count <= opt.waitretry)
1137         xsleep (count - 1);
1138       else
1139         xsleep (opt.waitretry);
1140     }
1141   else if (opt.wait)
1142     {
1143       if (!opt.random_wait || count > 1)
1144         /* If random-wait is not specified, or if we are sleeping
1145            between retries of the same download, sleep the fixed
1146            interval.  */
1147         xsleep (opt.wait);
1148       else
1149         {
1150           /* Sleep a random amount of time averaging in opt.wait
1151              seconds.  The sleeping amount ranges from 0.5*opt.wait to
1152              1.5*opt.wait.  */
1153           double waitsecs = (0.5 + random_float ()) * opt.wait;
1154           DEBUGP (("sleep_between_retrievals: avg=%f,sleep=%f\n",
1155                    opt.wait, waitsecs));
1156           xsleep (waitsecs);
1157         }
1158     }
1159 }
1160
1161 /* Free the linked list of urlpos.  */
1162 void
1163 free_urlpos (struct urlpos *l)
1164 {
1165   while (l)
1166     {
1167       struct urlpos *next = l->next;
1168       if (l->url)
1169         url_free (l->url);
1170       xfree_null (l->local_name);
1171       xfree (l);
1172       l = next;
1173     }
1174 }
1175
1176 /* Rotate FNAME opt.backups times */
1177 void
1178 rotate_backups(const char *fname)
1179 {
1180   int maxlen = strlen (fname) + 1 + numdigit (opt.backups) + 1;
1181   char *from = (char *)alloca (maxlen);
1182   char *to = (char *)alloca (maxlen);
1183   struct_stat sb;
1184   int i;
1185
1186   if (stat (fname, &sb) == 0)
1187     if (S_ISREG (sb.st_mode) == 0)
1188       return;
1189
1190   for (i = opt.backups; i > 1; i--)
1191     {
1192       sprintf (from, "%s.%d", fname, i - 1);
1193       sprintf (to, "%s.%d", fname, i);
1194       rename (from, to);
1195     }
1196
1197   sprintf (to, "%s.%d", fname, 1);
1198   rename(fname, to);
1199 }
1200
1201 static bool no_proxy_match (const char *, const char **);
1202
1203 /* Return the URL of the proxy appropriate for url U.  */
1204
1205 static char *
1206 getproxy (struct url *u)
1207 {
1208   char *proxy = NULL;
1209   char *rewritten_url;
1210   static char rewritten_storage[1024];
1211
1212   if (!opt.use_proxy)
1213     return NULL;
1214   if (no_proxy_match (u->host, (const char **)opt.no_proxy))
1215     return NULL;
1216
1217   switch (u->scheme)
1218     {
1219     case SCHEME_HTTP:
1220       proxy = opt.http_proxy ? opt.http_proxy : getenv ("http_proxy");
1221       break;
1222 #ifdef HAVE_SSL
1223     case SCHEME_HTTPS:
1224       proxy = opt.https_proxy ? opt.https_proxy : getenv ("https_proxy");
1225       break;
1226 #endif
1227     case SCHEME_FTP:
1228       proxy = opt.ftp_proxy ? opt.ftp_proxy : getenv ("ftp_proxy");
1229       break;
1230     case SCHEME_INVALID:
1231       break;
1232     }
1233   if (!proxy || !*proxy)
1234     return NULL;
1235
1236   /* Handle shorthands.  `rewritten_storage' is a kludge to allow
1237      getproxy() to return static storage. */
1238   rewritten_url = rewrite_shorthand_url (proxy);
1239   if (rewritten_url)
1240     {
1241       strncpy (rewritten_storage, rewritten_url, sizeof (rewritten_storage));
1242       rewritten_storage[sizeof (rewritten_storage) - 1] = '\0';
1243       proxy = rewritten_storage;
1244     }
1245
1246   return proxy;
1247 }
1248
1249 /* Returns true if URL would be downloaded through a proxy. */
1250
1251 bool
1252 url_uses_proxy (struct url * u)
1253 {
1254   bool ret;
1255   if (!u)
1256     return false;
1257   ret = getproxy (u) != NULL;
1258   return ret;
1259 }
1260
1261 /* Should a host be accessed through proxy, concerning no_proxy?  */
1262 static bool
1263 no_proxy_match (const char *host, const char **no_proxy)
1264 {
1265   if (!no_proxy)
1266     return false;
1267   else
1268     return sufmatch (no_proxy, host);
1269 }
1270
1271 /* Set the file parameter to point to the local file string.  */
1272 void
1273 set_local_file (const char **file, const char *default_file)
1274 {
1275   if (opt.output_document)
1276     {
1277       if (output_stream_regular)
1278         *file = opt.output_document;
1279     }
1280   else
1281     *file = default_file;
1282 }
1283
1284 /* Return true for an input file's own URL, false otherwise.  */
1285 bool
1286 input_file_url (const char *input_file)
1287 {
1288   static bool first = true;
1289
1290   if (input_file
1291       && url_has_scheme (input_file)
1292       && first)
1293     {
1294       first = false;
1295       return true;
1296     }
1297   else
1298     return false;
1299 }