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