]> sjero.net Git - wget/blob - src/retr.c
Add support for chunks to the WARC outputter.
[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.  In case of any other error,
145    1 is returned.  */
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   int units;
624
625   double dlrate = calc_rate (bytes, secs, &units);
626   /* Use more digits for smaller numbers (regardless of unit used),
627      e.g. "1022", "247", "12.5", "2.38".  */
628   sprintf (res, "%.*f %s",
629            dlrate >= 99.95 ? 0 : dlrate >= 9.995 ? 1 : 2,
630            dlrate, rate_names[units]);
631
632   return res;
633 }
634
635 /* Calculate the download rate and trim it as appropriate for the
636    speed.  Appropriate means that if rate is greater than 1K/s,
637    kilobytes are used, and if rate is greater than 1MB/s, megabytes
638    are used.
639
640    UNITS is zero for B/s, one for KB/s, two for MB/s, and three for
641    GB/s.  */
642
643 double
644 calc_rate (wgint bytes, double secs, int *units)
645 {
646   double dlrate;
647
648   assert (secs >= 0);
649   assert (bytes >= 0);
650
651   if (secs == 0)
652     /* If elapsed time is exactly zero, it means we're under the
653        resolution of the timer.  This can easily happen on systems
654        that use time() for the timer.  Since the interval lies between
655        0 and the timer's resolution, assume half the resolution.  */
656     secs = ptimer_resolution () / 2.0;
657
658   dlrate = bytes / secs;
659   if (dlrate < 1024.0)
660     *units = 0;
661   else if (dlrate < 1024.0 * 1024.0)
662     *units = 1, dlrate /= 1024.0;
663   else if (dlrate < 1024.0 * 1024.0 * 1024.0)
664     *units = 2, dlrate /= (1024.0 * 1024.0);
665   else
666     /* Maybe someone will need this, one day. */
667     *units = 3, dlrate /= (1024.0 * 1024.0 * 1024.0);
668
669   return dlrate;
670 }
671 \f
672
673 #define SUSPEND_POST_DATA do {                  \
674   post_data_suspended = true;                   \
675   saved_post_data = opt.post_data;              \
676   saved_post_file_name = opt.post_file_name;    \
677   opt.post_data = NULL;                         \
678   opt.post_file_name = NULL;                    \
679 } while (0)
680
681 #define RESTORE_POST_DATA do {                          \
682   if (post_data_suspended)                              \
683     {                                                   \
684       opt.post_data = saved_post_data;                  \
685       opt.post_file_name = saved_post_file_name;        \
686       post_data_suspended = false;                      \
687     }                                                   \
688 } while (0)
689
690 static char *getproxy (struct url *);
691
692 /* Retrieve the given URL.  Decides which loop to call -- HTTP, FTP,
693    FTP, proxy, etc.  */
694
695 /* #### This function should be rewritten so it doesn't return from
696    multiple points. */
697
698 uerr_t
699 retrieve_url (struct url * orig_parsed, const char *origurl, char **file,
700               char **newloc, const char *refurl, int *dt, bool recursive,
701               struct iri *iri, bool register_status)
702 {
703   uerr_t result;
704   char *url;
705   bool location_changed;
706   bool iri_fallbacked = 0;
707   int dummy;
708   char *mynewloc, *proxy;
709   struct url *u = orig_parsed, *proxy_url;
710   int up_error_code;            /* url parse error code */
711   char *local_file;
712   int redirection_count = 0;
713
714   bool post_data_suspended = false;
715   char *saved_post_data = NULL;
716   char *saved_post_file_name = NULL;
717
718   /* If dt is NULL, use local storage.  */
719   if (!dt)
720     {
721       dt = &dummy;
722       dummy = 0;
723     }
724   url = xstrdup (origurl);
725   if (newloc)
726     *newloc = NULL;
727   if (file)
728     *file = NULL;
729
730   if (!refurl)
731     refurl = opt.referer;
732
733  redirected:
734   /* (also for IRI fallbacking) */
735
736   result = NOCONERROR;
737   mynewloc = NULL;
738   local_file = NULL;
739   proxy_url = NULL;
740
741   proxy = getproxy (u);
742   if (proxy)
743     {
744       struct iri *pi = iri_new ();
745       set_uri_encoding (pi, opt.locale, true);
746       pi->utf8_encode = false;
747
748       /* Parse the proxy URL.  */
749       proxy_url = url_parse (proxy, &up_error_code, NULL, true);
750       if (!proxy_url)
751         {
752           char *error = url_error (proxy, up_error_code);
753           logprintf (LOG_NOTQUIET, _("Error parsing proxy URL %s: %s.\n"),
754                      proxy, error);
755           xfree (url);
756           xfree (error);
757           RESTORE_POST_DATA;
758           result = PROXERR;
759           goto bail;
760         }
761       if (proxy_url->scheme != SCHEME_HTTP && proxy_url->scheme != u->scheme)
762         {
763           logprintf (LOG_NOTQUIET, _("Error in proxy URL %s: Must be HTTP.\n"), proxy);
764           url_free (proxy_url);
765           xfree (url);
766           RESTORE_POST_DATA;
767           result = PROXERR;
768           goto bail;
769         }
770     }
771
772   if (u->scheme == SCHEME_HTTP
773 #ifdef HAVE_SSL
774       || u->scheme == SCHEME_HTTPS
775 #endif
776       || (proxy_url && proxy_url->scheme == SCHEME_HTTP))
777     {
778       result = http_loop (u, orig_parsed, &mynewloc, &local_file, refurl, dt,
779                           proxy_url, iri);
780     }
781   else if (u->scheme == SCHEME_FTP)
782     {
783       /* If this is a redirection, temporarily turn off opt.ftp_glob
784          and opt.recursive, both being undesirable when following
785          redirects.  */
786       bool oldrec = recursive, glob = opt.ftp_glob;
787       if (redirection_count)
788         oldrec = glob = false;
789
790       result = ftp_loop (u, &local_file, dt, proxy_url, recursive, glob);
791       recursive = oldrec;
792
793       /* There is a possibility of having HTTP being redirected to
794          FTP.  In these cases we must decide whether the text is HTML
795          according to the suffix.  The HTML suffixes are `.html',
796          `.htm' and a few others, case-insensitive.  */
797       if (redirection_count && local_file && u->scheme == SCHEME_FTP)
798         {
799           if (has_html_suffix_p (local_file))
800             *dt |= TEXTHTML;
801         }
802     }
803
804   if (proxy_url)
805     {
806       url_free (proxy_url);
807       proxy_url = NULL;
808     }
809
810   location_changed = (result == NEWLOCATION || result == NEWLOCATION_KEEP_POST);
811   if (location_changed)
812     {
813       char *construced_newloc;
814       struct url *newloc_parsed;
815
816       assert (mynewloc != NULL);
817
818       if (local_file)
819         xfree (local_file);
820
821       /* The HTTP specs only allow absolute URLs to appear in
822          redirects, but a ton of boneheaded webservers and CGIs out
823          there break the rules and use relative URLs, and popular
824          browsers are lenient about this, so wget should be too. */
825       construced_newloc = uri_merge (url, mynewloc);
826       xfree (mynewloc);
827       mynewloc = construced_newloc;
828
829       /* Reset UTF-8 encoding state, keep the URI encoding and reset
830          the content encoding. */
831       iri->utf8_encode = opt.enable_iri;
832       set_content_encoding (iri, NULL);
833       xfree_null (iri->orig_url);
834
835       /* Now, see if this new location makes sense. */
836       newloc_parsed = url_parse (mynewloc, &up_error_code, iri, true);
837       if (!newloc_parsed)
838         {
839           char *error = url_error (mynewloc, up_error_code);
840           logprintf (LOG_NOTQUIET, "%s: %s.\n", escnonprint_uri (mynewloc),
841                      error);
842           if (orig_parsed != u)
843             {
844               url_free (u);
845             }
846           xfree (url);
847           xfree (mynewloc);
848           xfree (error);
849           RESTORE_POST_DATA;
850           goto bail;
851         }
852
853       /* Now mynewloc will become newloc_parsed->url, because if the
854          Location contained relative paths like .././something, we
855          don't want that propagating as url.  */
856       xfree (mynewloc);
857       mynewloc = xstrdup (newloc_parsed->url);
858
859       /* Check for max. number of redirections.  */
860       if (++redirection_count > opt.max_redirect)
861         {
862           logprintf (LOG_NOTQUIET, _("%d redirections exceeded.\n"),
863                      opt.max_redirect);
864           url_free (newloc_parsed);
865           if (orig_parsed != u)
866             {
867               url_free (u);
868             }
869           xfree (url);
870           xfree (mynewloc);
871           RESTORE_POST_DATA;
872           result = WRONGCODE;
873           goto bail;
874         }
875
876       xfree (url);
877       url = mynewloc;
878       if (orig_parsed != u)
879         {
880           url_free (u);
881         }
882       u = newloc_parsed;
883
884       /* If we're being redirected from POST, and we received a
885          redirect code different than 307, we don't want to POST
886          again.  Many requests answer POST with a redirection to an
887          index page; that redirection is clearly a GET.  We "suspend"
888          POST data for the duration of the redirections, and restore
889          it when we're done.
890          
891          RFC2616 HTTP/1.1 introduces code 307 Temporary Redirect
892          specifically to preserve the method of the request.
893          */
894       if (result != NEWLOCATION_KEEP_POST && !post_data_suspended)
895         SUSPEND_POST_DATA;
896
897       goto redirected;
898     }
899
900   /* Try to not encode in UTF-8 if fetching failed */
901   if (!(*dt & RETROKF) && iri->utf8_encode)
902     {
903       iri->utf8_encode = false;
904       if (orig_parsed != u)
905         {
906           url_free (u);
907         }
908       u = url_parse (origurl, NULL, iri, true);
909       if (u)
910         {
911           DEBUGP (("[IRI fallbacking to non-utf8 for %s\n", quote (url)));
912           url = xstrdup (u->url);
913           iri_fallbacked = 1;
914           goto redirected;
915         }
916       else
917           DEBUGP (("[Couldn't fallback to non-utf8 for %s\n", quote (url)));
918     }
919
920   if (local_file && u && *dt & RETROKF)
921     {
922       register_download (u->url, local_file);
923
924       if (!opt.spider && redirection_count && 0 != strcmp (origurl, u->url))
925         register_redirection (origurl, u->url);
926
927       if (*dt & TEXTHTML)
928         register_html (u->url, local_file);
929
930       if (*dt & TEXTCSS)
931         register_css (u->url, local_file);
932     }
933
934   if (file)
935     *file = local_file ? local_file : NULL;
936   else
937     xfree_null (local_file);
938
939   if (orig_parsed != u)
940     {
941       url_free (u);
942     }
943
944   if (redirection_count || iri_fallbacked)
945     {
946       if (newloc)
947         *newloc = url;
948       else
949         xfree (url);
950     }
951   else
952     {
953       if (newloc)
954         *newloc = NULL;
955       xfree (url);
956     }
957
958   RESTORE_POST_DATA;
959
960 bail:
961   if (register_status)
962     inform_exit_status (result);
963   return result;
964 }
965
966 /* Find the URLs in the file and call retrieve_url() for each of them.
967    If HTML is true, treat the file as HTML, and construct the URLs
968    accordingly.
969
970    If opt.recursive is set, call retrieve_tree() for each file.  */
971
972 uerr_t
973 retrieve_from_file (const char *file, bool html, int *count)
974 {
975   uerr_t status;
976   struct urlpos *url_list, *cur_url;
977   struct iri *iri = iri_new();
978
979   char *input_file, *url_file = NULL;
980   const char *url = file;
981
982   status = RETROK;             /* Suppose everything is OK.  */
983   *count = 0;                  /* Reset the URL count.  */
984
985   /* sXXXav : Assume filename and links in the file are in the locale */
986   set_uri_encoding (iri, opt.locale, true);
987   set_content_encoding (iri, opt.locale);
988
989   if (url_valid_scheme (url))
990     {
991       int dt,url_err;
992       uerr_t status;
993       struct url *url_parsed = url_parse (url, &url_err, iri, true);
994       if (!url_parsed)
995         {
996           char *error = url_error (url, url_err);
997           logprintf (LOG_NOTQUIET, "%s: %s.\n", url, error);
998           xfree (error);
999           return URLERROR;
1000         }
1001
1002       if (!opt.base_href)
1003         opt.base_href = xstrdup (url);
1004
1005       status = retrieve_url (url_parsed, url, &url_file, NULL, NULL, &dt,
1006                              false, iri, true);
1007       url_free (url_parsed);
1008
1009       if (!url_file || (status != RETROK))
1010         return status;
1011
1012       if (dt & TEXTHTML)
1013         html = true;
1014
1015       /* If we have a found a content encoding, use it.
1016        * ( == is okay, because we're checking for identical object) */
1017       if (iri->content_encoding != opt.locale)
1018           set_uri_encoding (iri, iri->content_encoding, false);
1019
1020       /* Reset UTF-8 encode status */
1021       iri->utf8_encode = opt.enable_iri;
1022       xfree_null (iri->orig_url);
1023       iri->orig_url = NULL;
1024
1025       input_file = url_file;
1026     }
1027   else
1028     input_file = (char *) file;
1029
1030   url_list = (html ? get_urls_html (input_file, NULL, NULL, iri)
1031               : get_urls_file (input_file));
1032
1033   xfree_null (url_file);
1034
1035   for (cur_url = url_list; cur_url; cur_url = cur_url->next, ++*count)
1036     {
1037       char *filename = NULL, *new_file = NULL;
1038       int dt;
1039       struct iri *tmpiri = iri_dup (iri);
1040       struct url *parsed_url = NULL;
1041
1042       if (cur_url->ignore_when_downloading)
1043         continue;
1044
1045       if (opt.quota && total_downloaded_bytes > opt.quota)
1046         {
1047           status = QUOTEXC;
1048           break;
1049         }
1050
1051       parsed_url = url_parse (cur_url->url->url, NULL, tmpiri, true);
1052
1053       if ((opt.recursive || opt.page_requisites)
1054           && (cur_url->url->scheme != SCHEME_FTP || getproxy (cur_url->url)))
1055         {
1056           int old_follow_ftp = opt.follow_ftp;
1057
1058           /* Turn opt.follow_ftp on in case of recursive FTP retrieval */
1059           if (cur_url->url->scheme == SCHEME_FTP)
1060             opt.follow_ftp = 1;
1061
1062           status = retrieve_tree (parsed_url ? parsed_url : cur_url->url,
1063                                   tmpiri);
1064
1065           opt.follow_ftp = old_follow_ftp;
1066         }
1067       else
1068         status = retrieve_url (parsed_url ? parsed_url : cur_url->url,
1069                                cur_url->url->url, &filename,
1070                                &new_file, NULL, &dt, opt.recursive, tmpiri,
1071                                true);
1072
1073       if (parsed_url)
1074           url_free (parsed_url);
1075
1076       if (filename && opt.delete_after && file_exists_p (filename))
1077         {
1078           DEBUGP (("\
1079 Removing file due to --delete-after in retrieve_from_file():\n"));
1080           logprintf (LOG_VERBOSE, _("Removing %s.\n"), filename);
1081           if (unlink (filename))
1082             logprintf (LOG_NOTQUIET, "unlink: %s\n", strerror (errno));
1083           dt &= ~RETROKF;
1084         }
1085
1086       xfree_null (new_file);
1087       xfree_null (filename);
1088       iri_free (tmpiri);
1089     }
1090
1091   /* Free the linked list of URL-s.  */
1092   free_urlpos (url_list);
1093
1094   iri_free (iri);
1095
1096   return status;
1097 }
1098
1099 /* Print `giving up', or `retrying', depending on the impending
1100    action.  N1 and N2 are the attempt number and the attempt limit.  */
1101 void
1102 printwhat (int n1, int n2)
1103 {
1104   logputs (LOG_VERBOSE, (n1 == n2) ? _("Giving up.\n\n") : _("Retrying.\n\n"));
1105 }
1106
1107 /* If opt.wait or opt.waitretry are specified, and if certain
1108    conditions are met, sleep the appropriate number of seconds.  See
1109    the documentation of --wait and --waitretry for more information.
1110
1111    COUNT is the count of current retrieval, beginning with 1. */
1112
1113 void
1114 sleep_between_retrievals (int count)
1115 {
1116   static bool first_retrieval = true;
1117
1118   if (first_retrieval)
1119     {
1120       /* Don't sleep before the very first retrieval. */
1121       first_retrieval = false;
1122       return;
1123     }
1124
1125   if (opt.waitretry && count > 1)
1126     {
1127       /* If opt.waitretry is specified and this is a retry, wait for
1128          COUNT-1 number of seconds, or for opt.waitretry seconds.  */
1129       if (count <= opt.waitretry)
1130         xsleep (count - 1);
1131       else
1132         xsleep (opt.waitretry);
1133     }
1134   else if (opt.wait)
1135     {
1136       if (!opt.random_wait || count > 1)
1137         /* If random-wait is not specified, or if we are sleeping
1138            between retries of the same download, sleep the fixed
1139            interval.  */
1140         xsleep (opt.wait);
1141       else
1142         {
1143           /* Sleep a random amount of time averaging in opt.wait
1144              seconds.  The sleeping amount ranges from 0.5*opt.wait to
1145              1.5*opt.wait.  */
1146           double waitsecs = (0.5 + random_float ()) * opt.wait;
1147           DEBUGP (("sleep_between_retrievals: avg=%f,sleep=%f\n",
1148                    opt.wait, waitsecs));
1149           xsleep (waitsecs);
1150         }
1151     }
1152 }
1153
1154 /* Free the linked list of urlpos.  */
1155 void
1156 free_urlpos (struct urlpos *l)
1157 {
1158   while (l)
1159     {
1160       struct urlpos *next = l->next;
1161       if (l->url)
1162         url_free (l->url);
1163       xfree_null (l->local_name);
1164       xfree (l);
1165       l = next;
1166     }
1167 }
1168
1169 /* Rotate FNAME opt.backups times */
1170 void
1171 rotate_backups(const char *fname)
1172 {
1173   int maxlen = strlen (fname) + 1 + numdigit (opt.backups) + 1;
1174   char *from = (char *)alloca (maxlen);
1175   char *to = (char *)alloca (maxlen);
1176   struct_stat sb;
1177   int i;
1178
1179   if (stat (fname, &sb) == 0)
1180     if (S_ISREG (sb.st_mode) == 0)
1181       return;
1182
1183   for (i = opt.backups; i > 1; i--)
1184     {
1185       sprintf (from, "%s.%d", fname, i - 1);
1186       sprintf (to, "%s.%d", fname, i);
1187       rename (from, to);
1188     }
1189
1190   sprintf (to, "%s.%d", fname, 1);
1191   rename(fname, to);
1192 }
1193
1194 static bool no_proxy_match (const char *, const char **);
1195
1196 /* Return the URL of the proxy appropriate for url U.  */
1197
1198 static char *
1199 getproxy (struct url *u)
1200 {
1201   char *proxy = NULL;
1202   char *rewritten_url;
1203   static char rewritten_storage[1024];
1204
1205   if (!opt.use_proxy)
1206     return NULL;
1207   if (no_proxy_match (u->host, (const char **)opt.no_proxy))
1208     return NULL;
1209
1210   switch (u->scheme)
1211     {
1212     case SCHEME_HTTP:
1213       proxy = opt.http_proxy ? opt.http_proxy : getenv ("http_proxy");
1214       break;
1215 #ifdef HAVE_SSL
1216     case SCHEME_HTTPS:
1217       proxy = opt.https_proxy ? opt.https_proxy : getenv ("https_proxy");
1218       break;
1219 #endif
1220     case SCHEME_FTP:
1221       proxy = opt.ftp_proxy ? opt.ftp_proxy : getenv ("ftp_proxy");
1222       break;
1223     case SCHEME_INVALID:
1224       break;
1225     }
1226   if (!proxy || !*proxy)
1227     return NULL;
1228
1229   /* Handle shorthands.  `rewritten_storage' is a kludge to allow
1230      getproxy() to return static storage. */
1231   rewritten_url = rewrite_shorthand_url (proxy);
1232   if (rewritten_url)
1233     {
1234       strncpy (rewritten_storage, rewritten_url, sizeof (rewritten_storage));
1235       rewritten_storage[sizeof (rewritten_storage) - 1] = '\0';
1236       proxy = rewritten_storage;
1237     }
1238
1239   return proxy;
1240 }
1241
1242 /* Returns true if URL would be downloaded through a proxy. */
1243
1244 bool
1245 url_uses_proxy (struct url * u)
1246 {
1247   bool ret;
1248   if (!u)
1249     return false;
1250   ret = getproxy (u) != NULL;
1251   return ret;
1252 }
1253
1254 /* Should a host be accessed through proxy, concerning no_proxy?  */
1255 static bool
1256 no_proxy_match (const char *host, const char **no_proxy)
1257 {
1258   if (!no_proxy)
1259     return false;
1260   else
1261     return sufmatch (no_proxy, host);
1262 }
1263
1264 /* Set the file parameter to point to the local file string.  */
1265 void
1266 set_local_file (const char **file, const char *default_file)
1267 {
1268   if (opt.output_document)
1269     {
1270       if (output_stream_regular)
1271         *file = opt.output_document;
1272     }
1273   else
1274     *file = default_file;
1275 }
1276
1277 /* Return true for an input file's own URL, false otherwise.  */
1278 bool
1279 input_file_url (const char *input_file)
1280 {
1281   static bool first = true;
1282
1283   if (input_file
1284       && url_has_scheme (input_file)
1285       && first)
1286     {
1287       first = false;
1288       return true;
1289     }
1290   else
1291     return false;
1292 }