]> sjero.net Git - wget/blob - src/retr.c
Bugfix: Avoid double free of iri->orig_url
[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       iri->orig_url = NULL;
842
843       /* Now, see if this new location makes sense. */
844       newloc_parsed = url_parse (mynewloc, &up_error_code, iri, true);
845       if (!newloc_parsed)
846         {
847           char *error = url_error (mynewloc, up_error_code);
848           logprintf (LOG_NOTQUIET, "%s: %s.\n", escnonprint_uri (mynewloc),
849                      error);
850           if (orig_parsed != u)
851             {
852               url_free (u);
853             }
854           xfree (url);
855           xfree (mynewloc);
856           xfree (error);
857           RESTORE_POST_DATA;
858           goto bail;
859         }
860
861       /* Now mynewloc will become newloc_parsed->url, because if the
862          Location contained relative paths like .././something, we
863          don't want that propagating as url.  */
864       xfree (mynewloc);
865       mynewloc = xstrdup (newloc_parsed->url);
866
867       /* Check for max. number of redirections.  */
868       if (++redirection_count > opt.max_redirect)
869         {
870           logprintf (LOG_NOTQUIET, _("%d redirections exceeded.\n"),
871                      opt.max_redirect);
872           url_free (newloc_parsed);
873           if (orig_parsed != u)
874             {
875               url_free (u);
876             }
877           xfree (url);
878           xfree (mynewloc);
879           RESTORE_POST_DATA;
880           result = WRONGCODE;
881           goto bail;
882         }
883
884       xfree (url);
885       url = mynewloc;
886       if (orig_parsed != u)
887         {
888           url_free (u);
889         }
890       u = newloc_parsed;
891
892       /* If we're being redirected from POST, and we received a
893          redirect code different than 307, we don't want to POST
894          again.  Many requests answer POST with a redirection to an
895          index page; that redirection is clearly a GET.  We "suspend"
896          POST data for the duration of the redirections, and restore
897          it when we're done.
898          
899          RFC2616 HTTP/1.1 introduces code 307 Temporary Redirect
900          specifically to preserve the method of the request.
901          */
902       if (result != NEWLOCATION_KEEP_POST && !post_data_suspended)
903         SUSPEND_POST_DATA;
904
905       goto redirected;
906     }
907
908   /* Try to not encode in UTF-8 if fetching failed */
909   if (!(*dt & RETROKF) && iri->utf8_encode)
910     {
911       iri->utf8_encode = false;
912       if (orig_parsed != u)
913         {
914           url_free (u);
915         }
916       u = url_parse (origurl, NULL, iri, true);
917       if (u)
918         {
919           DEBUGP (("[IRI fallbacking to non-utf8 for %s\n", quote (url)));
920           url = xstrdup (u->url);
921           iri_fallbacked = 1;
922           goto redirected;
923         }
924       else
925           DEBUGP (("[Couldn't fallback to non-utf8 for %s\n", quote (url)));
926     }
927
928   if (local_file && u && *dt & RETROKF)
929     {
930       register_download (u->url, local_file);
931
932       if (!opt.spider && redirection_count && 0 != strcmp (origurl, u->url))
933         register_redirection (origurl, u->url);
934
935       if (*dt & TEXTHTML)
936         register_html (local_file);
937
938       if (*dt & TEXTCSS)
939         register_css (local_file);
940     }
941
942   if (file)
943     *file = local_file ? local_file : NULL;
944   else
945     xfree_null (local_file);
946
947   if (orig_parsed != u)
948     {
949       url_free (u);
950     }
951
952   if (redirection_count || iri_fallbacked)
953     {
954       if (newloc)
955         *newloc = url;
956       else
957         xfree (url);
958     }
959   else
960     {
961       if (newloc)
962         *newloc = NULL;
963       xfree (url);
964     }
965
966   RESTORE_POST_DATA;
967
968 bail:
969   if (register_status)
970     inform_exit_status (result);
971   return result;
972 }
973
974 /* Find the URLs in the file and call retrieve_url() for each of them.
975    If HTML is true, treat the file as HTML, and construct the URLs
976    accordingly.
977
978    If opt.recursive is set, call retrieve_tree() for each file.  */
979
980 uerr_t
981 retrieve_from_file (const char *file, bool html, int *count)
982 {
983   uerr_t status;
984   struct urlpos *url_list, *cur_url;
985   struct iri *iri = iri_new();
986
987   char *input_file, *url_file = NULL;
988   const char *url = file;
989
990   status = RETROK;             /* Suppose everything is OK.  */
991   *count = 0;                  /* Reset the URL count.  */
992
993   /* sXXXav : Assume filename and links in the file are in the locale */
994   set_uri_encoding (iri, opt.locale, true);
995   set_content_encoding (iri, opt.locale);
996
997   if (url_valid_scheme (url))
998     {
999       int dt,url_err;
1000       uerr_t status;
1001       struct url *url_parsed = url_parse (url, &url_err, iri, true);
1002       if (!url_parsed)
1003         {
1004           char *error = url_error (url, url_err);
1005           logprintf (LOG_NOTQUIET, "%s: %s.\n", url, error);
1006           xfree (error);
1007           return URLERROR;
1008         }
1009
1010       if (!opt.base_href)
1011         opt.base_href = xstrdup (url);
1012
1013       status = retrieve_url (url_parsed, url, &url_file, NULL, NULL, &dt,
1014                              false, iri, true);
1015       url_free (url_parsed);
1016
1017       if (!url_file || (status != RETROK))
1018         return status;
1019
1020       if (dt & TEXTHTML)
1021         html = true;
1022
1023       /* If we have a found a content encoding, use it.
1024        * ( == is okay, because we're checking for identical object) */
1025       if (iri->content_encoding != opt.locale)
1026           set_uri_encoding (iri, iri->content_encoding, false);
1027
1028       /* Reset UTF-8 encode status */
1029       iri->utf8_encode = opt.enable_iri;
1030       xfree_null (iri->orig_url);
1031       iri->orig_url = NULL;
1032
1033       input_file = url_file;
1034     }
1035   else
1036     input_file = (char *) file;
1037
1038   url_list = (html ? get_urls_html (input_file, NULL, NULL, iri)
1039               : get_urls_file (input_file));
1040
1041   xfree_null (url_file);
1042
1043   for (cur_url = url_list; cur_url; cur_url = cur_url->next, ++*count)
1044     {
1045       char *filename = NULL, *new_file = NULL;
1046       int dt;
1047       struct iri *tmpiri = iri_dup (iri);
1048       struct url *parsed_url = NULL;
1049
1050       if (cur_url->ignore_when_downloading)
1051         continue;
1052
1053       if (opt.quota && total_downloaded_bytes > opt.quota)
1054         {
1055           status = QUOTEXC;
1056           break;
1057         }
1058
1059       parsed_url = url_parse (cur_url->url->url, NULL, tmpiri, true);
1060
1061       if ((opt.recursive || opt.page_requisites)
1062           && (cur_url->url->scheme != SCHEME_FTP || getproxy (cur_url->url)))
1063         {
1064           int old_follow_ftp = opt.follow_ftp;
1065
1066           /* Turn opt.follow_ftp on in case of recursive FTP retrieval */
1067           if (cur_url->url->scheme == SCHEME_FTP)
1068             opt.follow_ftp = 1;
1069
1070           status = retrieve_tree (parsed_url ? parsed_url : cur_url->url,
1071                                   tmpiri);
1072
1073           opt.follow_ftp = old_follow_ftp;
1074         }
1075       else
1076         status = retrieve_url (parsed_url ? parsed_url : cur_url->url,
1077                                cur_url->url->url, &filename,
1078                                &new_file, NULL, &dt, opt.recursive, tmpiri,
1079                                true);
1080
1081       if (parsed_url)
1082           url_free (parsed_url);
1083
1084       if (filename && opt.delete_after && file_exists_p (filename))
1085         {
1086           DEBUGP (("\
1087 Removing file due to --delete-after in retrieve_from_file():\n"));
1088           logprintf (LOG_VERBOSE, _("Removing %s.\n"), filename);
1089           if (unlink (filename))
1090             logprintf (LOG_NOTQUIET, "unlink: %s\n", strerror (errno));
1091           dt &= ~RETROKF;
1092         }
1093
1094       xfree_null (new_file);
1095       xfree_null (filename);
1096       iri_free (tmpiri);
1097     }
1098
1099   /* Free the linked list of URL-s.  */
1100   free_urlpos (url_list);
1101
1102   iri_free (iri);
1103
1104   return status;
1105 }
1106
1107 /* Print `giving up', or `retrying', depending on the impending
1108    action.  N1 and N2 are the attempt number and the attempt limit.  */
1109 void
1110 printwhat (int n1, int n2)
1111 {
1112   logputs (LOG_VERBOSE, (n1 == n2) ? _("Giving up.\n\n") : _("Retrying.\n\n"));
1113 }
1114
1115 /* If opt.wait or opt.waitretry are specified, and if certain
1116    conditions are met, sleep the appropriate number of seconds.  See
1117    the documentation of --wait and --waitretry for more information.
1118
1119    COUNT is the count of current retrieval, beginning with 1. */
1120
1121 void
1122 sleep_between_retrievals (int count)
1123 {
1124   static bool first_retrieval = true;
1125
1126   if (first_retrieval)
1127     {
1128       /* Don't sleep before the very first retrieval. */
1129       first_retrieval = false;
1130       return;
1131     }
1132
1133   if (opt.waitretry && count > 1)
1134     {
1135       /* If opt.waitretry is specified and this is a retry, wait for
1136          COUNT-1 number of seconds, or for opt.waitretry seconds.  */
1137       if (count <= opt.waitretry)
1138         xsleep (count - 1);
1139       else
1140         xsleep (opt.waitretry);
1141     }
1142   else if (opt.wait)
1143     {
1144       if (!opt.random_wait || count > 1)
1145         /* If random-wait is not specified, or if we are sleeping
1146            between retries of the same download, sleep the fixed
1147            interval.  */
1148         xsleep (opt.wait);
1149       else
1150         {
1151           /* Sleep a random amount of time averaging in opt.wait
1152              seconds.  The sleeping amount ranges from 0.5*opt.wait to
1153              1.5*opt.wait.  */
1154           double waitsecs = (0.5 + random_float ()) * opt.wait;
1155           DEBUGP (("sleep_between_retrievals: avg=%f,sleep=%f\n",
1156                    opt.wait, waitsecs));
1157           xsleep (waitsecs);
1158         }
1159     }
1160 }
1161
1162 /* Free the linked list of urlpos.  */
1163 void
1164 free_urlpos (struct urlpos *l)
1165 {
1166   while (l)
1167     {
1168       struct urlpos *next = l->next;
1169       if (l->url)
1170         url_free (l->url);
1171       xfree_null (l->local_name);
1172       xfree (l);
1173       l = next;
1174     }
1175 }
1176
1177 /* Rotate FNAME opt.backups times */
1178 void
1179 rotate_backups(const char *fname)
1180 {
1181   int maxlen = strlen (fname) + 1 + numdigit (opt.backups) + 1;
1182   char *from = (char *)alloca (maxlen);
1183   char *to = (char *)alloca (maxlen);
1184   struct_stat sb;
1185   int i;
1186
1187   if (stat (fname, &sb) == 0)
1188     if (S_ISREG (sb.st_mode) == 0)
1189       return;
1190
1191   for (i = opt.backups; i > 1; i--)
1192     {
1193       sprintf (from, "%s.%d", fname, i - 1);
1194       sprintf (to, "%s.%d", fname, i);
1195       rename (from, to);
1196     }
1197
1198   sprintf (to, "%s.%d", fname, 1);
1199   rename(fname, to);
1200 }
1201
1202 static bool no_proxy_match (const char *, const char **);
1203
1204 /* Return the URL of the proxy appropriate for url U.  */
1205
1206 static char *
1207 getproxy (struct url *u)
1208 {
1209   char *proxy = NULL;
1210   char *rewritten_url;
1211   static char rewritten_storage[1024];
1212
1213   if (!opt.use_proxy)
1214     return NULL;
1215   if (no_proxy_match (u->host, (const char **)opt.no_proxy))
1216     return NULL;
1217
1218   switch (u->scheme)
1219     {
1220     case SCHEME_HTTP:
1221       proxy = opt.http_proxy ? opt.http_proxy : getenv ("http_proxy");
1222       break;
1223 #ifdef HAVE_SSL
1224     case SCHEME_HTTPS:
1225       proxy = opt.https_proxy ? opt.https_proxy : getenv ("https_proxy");
1226       break;
1227 #endif
1228     case SCHEME_FTP:
1229       proxy = opt.ftp_proxy ? opt.ftp_proxy : getenv ("ftp_proxy");
1230       break;
1231     case SCHEME_INVALID:
1232       break;
1233     }
1234   if (!proxy || !*proxy)
1235     return NULL;
1236
1237   /* Handle shorthands.  `rewritten_storage' is a kludge to allow
1238      getproxy() to return static storage. */
1239   rewritten_url = rewrite_shorthand_url (proxy);
1240   if (rewritten_url)
1241     {
1242       strncpy (rewritten_storage, rewritten_url, sizeof (rewritten_storage));
1243       rewritten_storage[sizeof (rewritten_storage) - 1] = '\0';
1244       proxy = rewritten_storage;
1245     }
1246
1247   return proxy;
1248 }
1249
1250 /* Returns true if URL would be downloaded through a proxy. */
1251
1252 bool
1253 url_uses_proxy (struct url * u)
1254 {
1255   bool ret;
1256   if (!u)
1257     return false;
1258   ret = getproxy (u) != NULL;
1259   return ret;
1260 }
1261
1262 /* Should a host be accessed through proxy, concerning no_proxy?  */
1263 static bool
1264 no_proxy_match (const char *host, const char **no_proxy)
1265 {
1266   if (!no_proxy)
1267     return false;
1268   else
1269     return sufmatch (no_proxy, host);
1270 }
1271
1272 /* Set the file parameter to point to the local file string.  */
1273 void
1274 set_local_file (const char **file, const char *default_file)
1275 {
1276   if (opt.output_document)
1277     {
1278       if (output_stream_regular)
1279         *file = opt.output_document;
1280     }
1281   else
1282     *file = default_file;
1283 }
1284
1285 /* Return true for an input file's own URL, false otherwise.  */
1286 bool
1287 input_file_url (const char *input_file)
1288 {
1289   static bool first = true;
1290
1291   if (input_file
1292       && url_has_scheme (input_file)
1293       && first)
1294     {
1295       first = false;
1296       return true;
1297     }
1298   else
1299     return false;
1300 }