]> sjero.net Git - wget/blob - src/http.c
Parse html from files when -r -nc is active.
[wget] / src / http.c
1 /* HTTP support.
2    Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
3    2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
4
5 This file is part of GNU Wget.
6
7 GNU Wget is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or
10  (at your option) any later version.
11
12 GNU Wget is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with Wget.  If not, see <http://www.gnu.org/licenses/>.
19
20 Additional permission under GNU GPL version 3 section 7
21
22 If you modify this program, or any covered work, by linking or
23 combining it with the OpenSSL project's OpenSSL library (or a
24 modified version of that library), containing parts covered by the
25 terms of the OpenSSL or SSLeay licenses, the Free Software Foundation
26 grants you additional permission to convey the resulting work.
27 Corresponding Source for a non-source form of such a combination
28 shall include the source code for the parts of OpenSSL used as well
29 as that of the covered work.  */
30
31 #include "wget.h"
32
33 #include <stdio.h>
34 #include <stdlib.h>
35 #include <string.h>
36 #ifdef HAVE_UNISTD_H
37 # include <unistd.h>
38 #endif
39 #include <assert.h>
40 #include <errno.h>
41 #include <time.h>
42 #include <locale.h>
43
44 #include "hash.h"
45 #include "http.h"
46 #include "utils.h"
47 #include "url.h"
48 #include "host.h"
49 #include "retr.h"
50 #include "connect.h"
51 #include "netrc.h"
52 #ifdef HAVE_SSL
53 # include "ssl.h"
54 #endif
55 #ifdef ENABLE_NTLM
56 # include "http-ntlm.h"
57 #endif
58 #include "cookies.h"
59 #ifdef ENABLE_DIGEST
60 # include "gen-md5.h"
61 #endif
62 #include "convert.h"
63 #include "spider.h"
64
65 #ifdef TESTING
66 #include "test.h"
67 #endif
68
69 extern char *version_string;
70
71 /* Forward decls. */
72 static char *create_authorization_line (const char *, const char *,
73                                         const char *, const char *,
74                                         const char *, bool *);
75 static char *basic_authentication_encode (const char *, const char *);
76 static bool known_authentication_scheme_p (const char *, const char *);
77 static void load_cookies (void);
78
79 #ifndef MIN
80 # define MIN(x, y) ((x) > (y) ? (y) : (x))
81 #endif
82
83 \f
84 static bool cookies_loaded_p;
85 static struct cookie_jar *wget_cookie_jar;
86
87 #define TEXTHTML_S "text/html"
88 #define TEXTXHTML_S "application/xhtml+xml"
89
90 /* Some status code validation macros: */
91 #define H_20X(x)        (((x) >= 200) && ((x) < 300))
92 #define H_PARTIAL(x)    ((x) == HTTP_STATUS_PARTIAL_CONTENTS)
93 #define H_REDIRECTED(x) ((x) == HTTP_STATUS_MOVED_PERMANENTLY          \
94                          || (x) == HTTP_STATUS_MOVED_TEMPORARILY       \
95                          || (x) == HTTP_STATUS_SEE_OTHER               \
96                          || (x) == HTTP_STATUS_TEMPORARY_REDIRECT)
97
98 /* HTTP/1.0 status codes from RFC1945, provided for reference.  */
99 /* Successful 2xx.  */
100 #define HTTP_STATUS_OK                    200
101 #define HTTP_STATUS_CREATED               201
102 #define HTTP_STATUS_ACCEPTED              202
103 #define HTTP_STATUS_NO_CONTENT            204
104 #define HTTP_STATUS_PARTIAL_CONTENTS      206
105
106 /* Redirection 3xx.  */
107 #define HTTP_STATUS_MULTIPLE_CHOICES      300
108 #define HTTP_STATUS_MOVED_PERMANENTLY     301
109 #define HTTP_STATUS_MOVED_TEMPORARILY     302
110 #define HTTP_STATUS_SEE_OTHER             303 /* from HTTP/1.1 */
111 #define HTTP_STATUS_NOT_MODIFIED          304
112 #define HTTP_STATUS_TEMPORARY_REDIRECT    307 /* from HTTP/1.1 */
113
114 /* Client error 4xx.  */
115 #define HTTP_STATUS_BAD_REQUEST           400
116 #define HTTP_STATUS_UNAUTHORIZED          401
117 #define HTTP_STATUS_FORBIDDEN             403
118 #define HTTP_STATUS_NOT_FOUND             404
119 #define HTTP_STATUS_RANGE_NOT_SATISFIABLE 416
120
121 /* Server errors 5xx.  */
122 #define HTTP_STATUS_INTERNAL              500
123 #define HTTP_STATUS_NOT_IMPLEMENTED       501
124 #define HTTP_STATUS_BAD_GATEWAY           502
125 #define HTTP_STATUS_UNAVAILABLE           503
126 \f
127 enum rp {
128   rel_none, rel_name, rel_value, rel_both
129 };
130
131 struct request {
132   const char *method;
133   char *arg;
134
135   struct request_header {
136     char *name, *value;
137     enum rp release_policy;
138   } *headers;
139   int hcount, hcapacity;
140 };
141
142 /* Create a new, empty request.  At least request_set_method must be
143    called before the request can be used.  */
144
145 static struct request *
146 request_new (void)
147 {
148   struct request *req = xnew0 (struct request);
149   req->hcapacity = 8;
150   req->headers = xnew_array (struct request_header, req->hcapacity);
151   return req;
152 }
153
154 /* Set the request's method and its arguments.  METH should be a
155    literal string (or it should outlive the request) because it will
156    not be freed.  ARG will be freed by request_free.  */
157
158 static void
159 request_set_method (struct request *req, const char *meth, char *arg)
160 {
161   req->method = meth;
162   req->arg = arg;
163 }
164
165 /* Return the method string passed with the last call to
166    request_set_method.  */
167
168 static const char *
169 request_method (const struct request *req)
170 {
171   return req->method;
172 }
173
174 /* Free one header according to the release policy specified with
175    request_set_header.  */
176
177 static void
178 release_header (struct request_header *hdr)
179 {
180   switch (hdr->release_policy)
181     {
182     case rel_none:
183       break;
184     case rel_name:
185       xfree (hdr->name);
186       break;
187     case rel_value:
188       xfree (hdr->value);
189       break;
190     case rel_both:
191       xfree (hdr->name);
192       xfree (hdr->value);
193       break;
194     }
195 }
196
197 /* Set the request named NAME to VALUE.  Specifically, this means that
198    a "NAME: VALUE\r\n" header line will be used in the request.  If a
199    header with the same name previously existed in the request, its
200    value will be replaced by this one.  A NULL value means do nothing.
201
202    RELEASE_POLICY determines whether NAME and VALUE should be released
203    (freed) with request_free.  Allowed values are:
204
205     - rel_none     - don't free NAME or VALUE
206     - rel_name     - free NAME when done
207     - rel_value    - free VALUE when done
208     - rel_both     - free both NAME and VALUE when done
209
210    Setting release policy is useful when arguments come from different
211    sources.  For example:
212
213      // Don't free literal strings!
214      request_set_header (req, "Pragma", "no-cache", rel_none);
215
216      // Don't free a global variable, we'll need it later.
217      request_set_header (req, "Referer", opt.referer, rel_none);
218
219      // Value freshly allocated, free it when done.
220      request_set_header (req, "Range",
221                          aprintf ("bytes=%s-", number_to_static_string (hs->restval)),
222                          rel_value);
223    */
224
225 static void
226 request_set_header (struct request *req, char *name, char *value,
227                     enum rp release_policy)
228 {
229   struct request_header *hdr;
230   int i;
231
232   if (!value)
233     {
234       /* A NULL value is a no-op; if freeing the name is requested,
235          free it now to avoid leaks.  */
236       if (release_policy == rel_name || release_policy == rel_both)
237         xfree (name);
238       return;
239     }
240
241   for (i = 0; i < req->hcount; i++)
242     {
243       hdr = &req->headers[i];
244       if (0 == strcasecmp (name, hdr->name))
245         {
246           /* Replace existing header. */
247           release_header (hdr);
248           hdr->name = name;
249           hdr->value = value;
250           hdr->release_policy = release_policy;
251           return;
252         }
253     }
254
255   /* Install new header. */
256
257   if (req->hcount >= req->hcapacity)
258     {
259       req->hcapacity <<= 1;
260       req->headers = xrealloc (req->headers, req->hcapacity * sizeof (*hdr));
261     }
262   hdr = &req->headers[req->hcount++];
263   hdr->name = name;
264   hdr->value = value;
265   hdr->release_policy = release_policy;
266 }
267
268 /* Like request_set_header, but sets the whole header line, as
269    provided by the user using the `--header' option.  For example,
270    request_set_user_header (req, "Foo: bar") works just like
271    request_set_header (req, "Foo", "bar").  */
272
273 static void
274 request_set_user_header (struct request *req, const char *header)
275 {
276   char *name;
277   const char *p = strchr (header, ':');
278   if (!p)
279     return;
280   BOUNDED_TO_ALLOCA (header, p, name);
281   ++p;
282   while (c_isspace (*p))
283     ++p;
284   request_set_header (req, xstrdup (name), (char *) p, rel_name);
285 }
286
287 /* Remove the header with specified name from REQ.  Returns true if
288    the header was actually removed, false otherwise.  */
289
290 static bool
291 request_remove_header (struct request *req, char *name)
292 {
293   int i;
294   for (i = 0; i < req->hcount; i++)
295     {
296       struct request_header *hdr = &req->headers[i];
297       if (0 == strcasecmp (name, hdr->name))
298         {
299           release_header (hdr);
300           /* Move the remaining headers by one. */
301           if (i < req->hcount - 1)
302             memmove (hdr, hdr + 1, (req->hcount - i - 1) * sizeof (*hdr));
303           --req->hcount;
304           return true;
305         }
306     }
307   return false;
308 }
309
310 #define APPEND(p, str) do {                     \
311   int A_len = strlen (str);                     \
312   memcpy (p, str, A_len);                       \
313   p += A_len;                                   \
314 } while (0)
315
316 /* Construct the request and write it to FD using fd_write.  */
317
318 static int
319 request_send (const struct request *req, int fd)
320 {
321   char *request_string, *p;
322   int i, size, write_error;
323
324   /* Count the request size. */
325   size = 0;
326
327   /* METHOD " " ARG " " "HTTP/1.0" "\r\n" */
328   size += strlen (req->method) + 1 + strlen (req->arg) + 1 + 8 + 2;
329
330   for (i = 0; i < req->hcount; i++)
331     {
332       struct request_header *hdr = &req->headers[i];
333       /* NAME ": " VALUE "\r\n" */
334       size += strlen (hdr->name) + 2 + strlen (hdr->value) + 2;
335     }
336
337   /* "\r\n\0" */
338   size += 3;
339
340   p = request_string = alloca_array (char, size);
341
342   /* Generate the request. */
343
344   APPEND (p, req->method); *p++ = ' ';
345   APPEND (p, req->arg);    *p++ = ' ';
346   memcpy (p, "HTTP/1.0\r\n", 10); p += 10;
347
348   for (i = 0; i < req->hcount; i++)
349     {
350       struct request_header *hdr = &req->headers[i];
351       APPEND (p, hdr->name);
352       *p++ = ':', *p++ = ' ';
353       APPEND (p, hdr->value);
354       *p++ = '\r', *p++ = '\n';
355     }
356
357   *p++ = '\r', *p++ = '\n', *p++ = '\0';
358   assert (p - request_string == size);
359
360 #undef APPEND
361
362   DEBUGP (("\n---request begin---\n%s---request end---\n", request_string));
363
364   /* Send the request to the server. */
365
366   write_error = fd_write (fd, request_string, size - 1, -1);
367   if (write_error < 0)
368     logprintf (LOG_VERBOSE, _("Failed writing HTTP request: %s.\n"),
369                fd_errstr (fd));
370   return write_error;
371 }
372
373 /* Release the resources used by REQ. */
374
375 static void
376 request_free (struct request *req)
377 {
378   int i;
379   xfree_null (req->arg);
380   for (i = 0; i < req->hcount; i++)
381     release_header (&req->headers[i]);
382   xfree_null (req->headers);
383   xfree (req);
384 }
385
386 static struct hash_table *basic_authed_hosts;
387
388 /* Find out if this host has issued a Basic challenge yet; if so, give
389  * it the username, password. A temporary measure until we can get
390  * proper authentication in place. */
391
392 static bool
393 maybe_send_basic_creds (const char *hostname, const char *user,
394                         const char *passwd, struct request *req)
395 {
396   bool do_challenge = false;
397
398   if (opt.auth_without_challenge)
399     {
400       DEBUGP(("Auth-without-challenge set, sending Basic credentials.\n"));
401       do_challenge = true;
402     }
403   else if (basic_authed_hosts
404       && hash_table_contains(basic_authed_hosts, hostname))
405     {
406       DEBUGP(("Found `%s' in basic_authed_hosts.\n", hostname));
407       do_challenge = true;
408     }
409   else
410     {
411       DEBUGP(("Host `%s' has not issued a general basic challenge.\n",
412               hostname));
413     }
414   if (do_challenge)
415     {
416       request_set_header (req, "Authorization",
417                           basic_authentication_encode (user, passwd),
418                           rel_value);
419     }
420   return do_challenge;
421 }
422
423 static void
424 register_basic_auth_host (const char *hostname)
425 {
426   if (!basic_authed_hosts)
427     {
428       basic_authed_hosts = make_nocase_string_hash_table (1);
429     }
430   if (!hash_table_contains(basic_authed_hosts, hostname))
431     {
432       hash_table_put (basic_authed_hosts, xstrdup(hostname), NULL);
433       DEBUGP(("Inserted `%s' into basic_authed_hosts\n", hostname));
434     }
435 }
436
437
438 /* Send the contents of FILE_NAME to SOCK.  Make sure that exactly
439    PROMISED_SIZE bytes are sent over the wire -- if the file is
440    longer, read only that much; if the file is shorter, report an error.  */
441
442 static int
443 post_file (int sock, const char *file_name, wgint promised_size)
444 {
445   static char chunk[8192];
446   wgint written = 0;
447   int write_error;
448   FILE *fp;
449
450   DEBUGP (("[writing POST file %s ... ", file_name));
451
452   fp = fopen (file_name, "rb");
453   if (!fp)
454     return -1;
455   while (!feof (fp) && written < promised_size)
456     {
457       int towrite;
458       int length = fread (chunk, 1, sizeof (chunk), fp);
459       if (length == 0)
460         break;
461       towrite = MIN (promised_size - written, length);
462       write_error = fd_write (sock, chunk, towrite, -1);
463       if (write_error < 0)
464         {
465           fclose (fp);
466           return -1;
467         }
468       written += towrite;
469     }
470   fclose (fp);
471
472   /* If we've written less than was promised, report a (probably
473      nonsensical) error rather than break the promise.  */
474   if (written < promised_size)
475     {
476       errno = EINVAL;
477       return -1;
478     }
479
480   assert (written == promised_size);
481   DEBUGP (("done]\n"));
482   return 0;
483 }
484 \f
485 /* Determine whether [START, PEEKED + PEEKLEN) contains an empty line.
486    If so, return the pointer to the position after the line, otherwise
487    return NULL.  This is used as callback to fd_read_hunk.  The data
488    between START and PEEKED has been read and cannot be "unread"; the
489    data after PEEKED has only been peeked.  */
490
491 static const char *
492 response_head_terminator (const char *start, const char *peeked, int peeklen)
493 {
494   const char *p, *end;
495
496   /* If at first peek, verify whether HUNK starts with "HTTP".  If
497      not, this is a HTTP/0.9 request and we must bail out without
498      reading anything.  */
499   if (start == peeked && 0 != memcmp (start, "HTTP", MIN (peeklen, 4)))
500     return start;
501
502   /* Look for "\n[\r]\n", and return the following position if found.
503      Start two chars before the current to cover the possibility that
504      part of the terminator (e.g. "\n\r") arrived in the previous
505      batch.  */
506   p = peeked - start < 2 ? start : peeked - 2;
507   end = peeked + peeklen;
508
509   /* Check for \n\r\n or \n\n anywhere in [p, end-2). */
510   for (; p < end - 2; p++)
511     if (*p == '\n')
512       {
513         if (p[1] == '\r' && p[2] == '\n')
514           return p + 3;
515         else if (p[1] == '\n')
516           return p + 2;
517       }
518   /* p==end-2: check for \n\n directly preceding END. */
519   if (p[0] == '\n' && p[1] == '\n')
520     return p + 2;
521
522   return NULL;
523 }
524
525 /* The maximum size of a single HTTP response we care to read.  Rather
526    than being a limit of the reader implementation, this limit
527    prevents Wget from slurping all available memory upon encountering
528    malicious or buggy server output, thus protecting the user.  Define
529    it to 0 to remove the limit.  */
530
531 #define HTTP_RESPONSE_MAX_SIZE 65536
532
533 /* Read the HTTP request head from FD and return it.  The error
534    conditions are the same as with fd_read_hunk.
535
536    To support HTTP/0.9 responses, this function tries to make sure
537    that the data begins with "HTTP".  If this is not the case, no data
538    is read and an empty request is returned, so that the remaining
539    data can be treated as body.  */
540
541 static char *
542 read_http_response_head (int fd)
543 {
544   return fd_read_hunk (fd, response_head_terminator, 512,
545                        HTTP_RESPONSE_MAX_SIZE);
546 }
547
548 struct response {
549   /* The response data. */
550   const char *data;
551
552   /* The array of pointers that indicate where each header starts.
553      For example, given this HTTP response:
554
555        HTTP/1.0 200 Ok
556        Description: some
557         text
558        Etag: x
559
560      The headers are located like this:
561
562      "HTTP/1.0 200 Ok\r\nDescription: some\r\n text\r\nEtag: x\r\n\r\n"
563      ^                   ^                             ^          ^
564      headers[0]          headers[1]                    headers[2] headers[3]
565
566      I.e. headers[0] points to the beginning of the request,
567      headers[1] points to the end of the first header and the
568      beginning of the second one, etc.  */
569
570   const char **headers;
571 };
572
573 /* Create a new response object from the text of the HTTP response,
574    available in HEAD.  That text is automatically split into
575    constituent header lines for fast retrieval using
576    resp_header_*.  */
577
578 static struct response *
579 resp_new (const char *head)
580 {
581   const char *hdr;
582   int count, size;
583
584   struct response *resp = xnew0 (struct response);
585   resp->data = head;
586
587   if (*head == '\0')
588     {
589       /* Empty head means that we're dealing with a headerless
590          (HTTP/0.9) response.  In that case, don't set HEADERS at
591          all.  */
592       return resp;
593     }
594
595   /* Split HEAD into header lines, so that resp_header_* functions
596      don't need to do this over and over again.  */
597
598   size = count = 0;
599   hdr = head;
600   while (1)
601     {
602       DO_REALLOC (resp->headers, size, count + 1, const char *);
603       resp->headers[count++] = hdr;
604
605       /* Break upon encountering an empty line. */
606       if (!hdr[0] || (hdr[0] == '\r' && hdr[1] == '\n') || hdr[0] == '\n')
607         break;
608
609       /* Find the end of HDR, including continuations. */
610       do
611         {
612           const char *end = strchr (hdr, '\n');
613           if (end)
614             hdr = end + 1;
615           else
616             hdr += strlen (hdr);
617         }
618       while (*hdr == ' ' || *hdr == '\t');
619     }
620   DO_REALLOC (resp->headers, size, count + 1, const char *);
621   resp->headers[count] = NULL;
622
623   return resp;
624 }
625
626 /* Locate the header named NAME in the request data, starting with
627    position START.  This allows the code to loop through the request
628    data, filtering for all requests of a given name.  Returns the
629    found position, or -1 for failure.  The code that uses this
630    function typically looks like this:
631
632      for (pos = 0; (pos = resp_header_locate (...)) != -1; pos++)
633        ... do something with header ...
634
635    If you only care about one header, use resp_header_get instead of
636    this function.  */
637
638 static int
639 resp_header_locate (const struct response *resp, const char *name, int start,
640                     const char **begptr, const char **endptr)
641 {
642   int i;
643   const char **headers = resp->headers;
644   int name_len;
645
646   if (!headers || !headers[1])
647     return -1;
648
649   name_len = strlen (name);
650   if (start > 0)
651     i = start;
652   else
653     i = 1;
654
655   for (; headers[i + 1]; i++)
656     {
657       const char *b = headers[i];
658       const char *e = headers[i + 1];
659       if (e - b > name_len
660           && b[name_len] == ':'
661           && 0 == strncasecmp (b, name, name_len))
662         {
663           b += name_len + 1;
664           while (b < e && c_isspace (*b))
665             ++b;
666           while (b < e && c_isspace (e[-1]))
667             --e;
668           *begptr = b;
669           *endptr = e;
670           return i;
671         }
672     }
673   return -1;
674 }
675
676 /* Find and retrieve the header named NAME in the request data.  If
677    found, set *BEGPTR to its starting, and *ENDPTR to its ending
678    position, and return true.  Otherwise return false.
679
680    This function is used as a building block for resp_header_copy
681    and resp_header_strdup.  */
682
683 static bool
684 resp_header_get (const struct response *resp, const char *name,
685                  const char **begptr, const char **endptr)
686 {
687   int pos = resp_header_locate (resp, name, 0, begptr, endptr);
688   return pos != -1;
689 }
690
691 /* Copy the response header named NAME to buffer BUF, no longer than
692    BUFSIZE (BUFSIZE includes the terminating 0).  If the header
693    exists, true is returned, false otherwise.  If there should be no
694    limit on the size of the header, use resp_header_strdup instead.
695
696    If BUFSIZE is 0, no data is copied, but the boolean indication of
697    whether the header is present is still returned.  */
698
699 static bool
700 resp_header_copy (const struct response *resp, const char *name,
701                   char *buf, int bufsize)
702 {
703   const char *b, *e;
704   if (!resp_header_get (resp, name, &b, &e))
705     return false;
706   if (bufsize)
707     {
708       int len = MIN (e - b, bufsize - 1);
709       memcpy (buf, b, len);
710       buf[len] = '\0';
711     }
712   return true;
713 }
714
715 /* Return the value of header named NAME in RESP, allocated with
716    malloc.  If such a header does not exist in RESP, return NULL.  */
717
718 static char *
719 resp_header_strdup (const struct response *resp, const char *name)
720 {
721   const char *b, *e;
722   if (!resp_header_get (resp, name, &b, &e))
723     return NULL;
724   return strdupdelim (b, e);
725 }
726
727 /* Parse the HTTP status line, which is of format:
728
729    HTTP-Version SP Status-Code SP Reason-Phrase
730
731    The function returns the status-code, or -1 if the status line
732    appears malformed.  The pointer to "reason-phrase" message is
733    returned in *MESSAGE.  */
734
735 static int
736 resp_status (const struct response *resp, char **message)
737 {
738   int status;
739   const char *p, *end;
740
741   if (!resp->headers)
742     {
743       /* For a HTTP/0.9 response, assume status 200. */
744       if (message)
745         *message = xstrdup (_("No headers, assuming HTTP/0.9"));
746       return 200;
747     }
748
749   p = resp->headers[0];
750   end = resp->headers[1];
751
752   if (!end)
753     return -1;
754
755   /* "HTTP" */
756   if (end - p < 4 || 0 != strncmp (p, "HTTP", 4))
757     return -1;
758   p += 4;
759
760   /* Match the HTTP version.  This is optional because Gnutella
761      servers have been reported to not specify HTTP version.  */
762   if (p < end && *p == '/')
763     {
764       ++p;
765       while (p < end && c_isdigit (*p))
766         ++p;
767       if (p < end && *p == '.')
768         ++p; 
769       while (p < end && c_isdigit (*p))
770         ++p;
771     }
772
773   while (p < end && c_isspace (*p))
774     ++p;
775   if (end - p < 3 || !c_isdigit (p[0]) || !c_isdigit (p[1]) || !c_isdigit (p[2]))
776     return -1;
777
778   status = 100 * (p[0] - '0') + 10 * (p[1] - '0') + (p[2] - '0');
779   p += 3;
780
781   if (message)
782     {
783       while (p < end && c_isspace (*p))
784         ++p;
785       while (p < end && c_isspace (end[-1]))
786         --end;
787       *message = strdupdelim (p, end);
788     }
789
790   return status;
791 }
792
793 /* Release the resources used by RESP.  */
794
795 static void
796 resp_free (struct response *resp)
797 {
798   xfree_null (resp->headers);
799   xfree (resp);
800 }
801
802 /* Print a single line of response, the characters [b, e).  We tried
803    getting away with
804       logprintf (LOG_VERBOSE, "%s%.*s\n", prefix, (int) (e - b), b);
805    but that failed to escape the non-printable characters and, in fact,
806    caused crashes in UTF-8 locales.  */
807
808 static void
809 print_response_line(const char *prefix, const char *b, const char *e)
810 {
811   char *copy;
812   BOUNDED_TO_ALLOCA(b, e, copy);
813   logprintf (LOG_ALWAYS, "%s%s\n", prefix, escnonprint(copy));
814 }
815
816 /* Print the server response, line by line, omitting the trailing CRLF
817    from individual header lines, and prefixed with PREFIX.  */
818
819 static void
820 print_server_response (const struct response *resp, const char *prefix)
821 {
822   int i;
823   if (!resp->headers)
824     return;
825   for (i = 0; resp->headers[i + 1]; i++)
826     {
827       const char *b = resp->headers[i];
828       const char *e = resp->headers[i + 1];
829       /* Skip CRLF */
830       if (b < e && e[-1] == '\n')
831         --e;
832       if (b < e && e[-1] == '\r')
833         --e;
834       print_response_line(prefix, b, e);
835     }
836 }
837
838 /* Parse the `Content-Range' header and extract the information it
839    contains.  Returns true if successful, false otherwise.  */
840 static bool
841 parse_content_range (const char *hdr, wgint *first_byte_ptr,
842                      wgint *last_byte_ptr, wgint *entity_length_ptr)
843 {
844   wgint num;
845
846   /* Ancient versions of Netscape proxy server, presumably predating
847      rfc2068, sent out `Content-Range' without the "bytes"
848      specifier.  */
849   if (0 == strncasecmp (hdr, "bytes", 5))
850     {
851       hdr += 5;
852       /* "JavaWebServer/1.1.1" sends "bytes: x-y/z", contrary to the
853          HTTP spec. */
854       if (*hdr == ':')
855         ++hdr;
856       while (c_isspace (*hdr))
857         ++hdr;
858       if (!*hdr)
859         return false;
860     }
861   if (!c_isdigit (*hdr))
862     return false;
863   for (num = 0; c_isdigit (*hdr); hdr++)
864     num = 10 * num + (*hdr - '0');
865   if (*hdr != '-' || !c_isdigit (*(hdr + 1)))
866     return false;
867   *first_byte_ptr = num;
868   ++hdr;
869   for (num = 0; c_isdigit (*hdr); hdr++)
870     num = 10 * num + (*hdr - '0');
871   if (*hdr != '/' || !c_isdigit (*(hdr + 1)))
872     return false;
873   *last_byte_ptr = num;
874   ++hdr;
875   if (*hdr == '*')
876     num = -1;
877   else
878     for (num = 0; c_isdigit (*hdr); hdr++)
879       num = 10 * num + (*hdr - '0');
880   *entity_length_ptr = num;
881   return true;
882 }
883
884 /* Read the body of the request, but don't store it anywhere and don't
885    display a progress gauge.  This is useful for reading the bodies of
886    administrative responses to which we will soon issue another
887    request.  The response is not useful to the user, but reading it
888    allows us to continue using the same connection to the server.
889
890    If reading fails, false is returned, true otherwise.  In debug
891    mode, the body is displayed for debugging purposes.  */
892
893 static bool
894 skip_short_body (int fd, wgint contlen)
895 {
896   enum {
897     SKIP_SIZE = 512,                /* size of the download buffer */
898     SKIP_THRESHOLD = 4096        /* the largest size we read */
899   };
900   char dlbuf[SKIP_SIZE + 1];
901   dlbuf[SKIP_SIZE] = '\0';        /* so DEBUGP can safely print it */
902
903   /* We shouldn't get here with unknown contlen.  (This will change
904      with HTTP/1.1, which supports "chunked" transfer.)  */
905   assert (contlen != -1);
906
907   /* If the body is too large, it makes more sense to simply close the
908      connection than to try to read the body.  */
909   if (contlen > SKIP_THRESHOLD)
910     return false;
911
912   DEBUGP (("Skipping %s bytes of body: [", number_to_static_string (contlen)));
913
914   while (contlen > 0)
915     {
916       int ret = fd_read (fd, dlbuf, MIN (contlen, SKIP_SIZE), -1);
917       if (ret <= 0)
918         {
919           /* Don't normally report the error since this is an
920              optimization that should be invisible to the user.  */
921           DEBUGP (("] aborting (%s).\n",
922                    ret < 0 ? fd_errstr (fd) : "EOF received"));
923           return false;
924         }
925       contlen -= ret;
926       /* Safe even if %.*s bogusly expects terminating \0 because
927          we've zero-terminated dlbuf above.  */
928       DEBUGP (("%.*s", ret, dlbuf));
929     }
930
931   DEBUGP (("] done.\n"));
932   return true;
933 }
934
935 /* Extract a parameter from the string (typically an HTTP header) at
936    **SOURCE and advance SOURCE to the next parameter.  Return false
937    when there are no more parameters to extract.  The name of the
938    parameter is returned in NAME, and the value in VALUE.  If the
939    parameter has no value, the token's value is zeroed out.
940
941    For example, if *SOURCE points to the string "attachment;
942    filename=\"foo bar\"", the first call to this function will return
943    the token named "attachment" and no value, and the second call will
944    return the token named "filename" and value "foo bar".  The third
945    call will return false, indicating no more valid tokens.  */
946
947 bool
948 extract_param (const char **source, param_token *name, param_token *value,
949                char separator)
950 {
951   const char *p = *source;
952
953   while (c_isspace (*p)) ++p;
954   if (!*p)
955     {
956       *source = p;
957       return false;             /* no error; nothing more to extract */
958     }
959
960   /* Extract name. */
961   name->b = p;
962   while (*p && !c_isspace (*p) && *p != '=' && *p != separator) ++p;
963   name->e = p;
964   if (name->b == name->e)
965     return false;               /* empty name: error */
966   while (c_isspace (*p)) ++p;
967   if (*p == separator || !*p)           /* no value */
968     {
969       xzero (*value);
970       if (*p == separator) ++p;
971       *source = p;
972       return true;
973     }
974   if (*p != '=')
975     return false;               /* error */
976
977   /* *p is '=', extract value */
978   ++p;
979   while (c_isspace (*p)) ++p;
980   if (*p == '"')                /* quoted */
981     {
982       value->b = ++p;
983       while (*p && *p != '"') ++p;
984       if (!*p)
985         return false;
986       value->e = p++;
987       /* Currently at closing quote; find the end of param. */
988       while (c_isspace (*p)) ++p;
989       while (*p && *p != separator) ++p;
990       if (*p == separator)
991         ++p;
992       else if (*p)
993         /* garbage after closed quote, e.g. foo="bar"baz */
994         return false;
995     }
996   else                          /* unquoted */
997     {
998       value->b = p;
999       while (*p && *p != separator) ++p;
1000       value->e = p;
1001       while (value->e != value->b && c_isspace (value->e[-1]))
1002         --value->e;
1003       if (*p == separator) ++p;
1004     }
1005   *source = p;
1006   return true;
1007 }
1008
1009 #undef MAX
1010 #define MAX(p, q) ((p) > (q) ? (p) : (q))
1011
1012 /* Parse the contents of the `Content-Disposition' header, extracting
1013    the information useful to Wget.  Content-Disposition is a header
1014    borrowed from MIME; when used in HTTP, it typically serves for
1015    specifying the desired file name of the resource.  For example:
1016
1017        Content-Disposition: attachment; filename="flora.jpg"
1018
1019    Wget will skip the tokens it doesn't care about, such as
1020    "attachment" in the previous example; it will also skip other
1021    unrecognized params.  If the header is syntactically correct and
1022    contains a file name, a copy of the file name is stored in
1023    *filename and true is returned.  Otherwise, the function returns
1024    false.
1025
1026    The file name is stripped of directory components and must not be
1027    empty.  */
1028
1029 static bool
1030 parse_content_disposition (const char *hdr, char **filename)
1031 {
1032   param_token name, value;
1033   while (extract_param (&hdr, &name, &value, ';'))
1034     if (BOUNDED_EQUAL_NO_CASE (name.b, name.e, "filename") && value.b != NULL)
1035       {
1036         /* Make the file name begin at the last slash or backslash. */
1037         const char *last_slash = memrchr (value.b, '/', value.e - value.b);
1038         const char *last_bs = memrchr (value.b, '\\', value.e - value.b);
1039         if (last_slash && last_bs)
1040           value.b = 1 + MAX (last_slash, last_bs);
1041         else if (last_slash || last_bs)
1042           value.b = 1 + (last_slash ? last_slash : last_bs);
1043         if (value.b == value.e)
1044           continue;
1045         /* Start with the directory prefix, if specified. */
1046         if (opt.dir_prefix)
1047           {
1048             int prefix_length = strlen (opt.dir_prefix);
1049             bool add_slash = (opt.dir_prefix[prefix_length - 1] != '/');
1050             int total_length;
1051
1052             if (add_slash) 
1053               ++prefix_length;
1054             total_length = prefix_length + (value.e - value.b);            
1055             *filename = xmalloc (total_length + 1);
1056             strcpy (*filename, opt.dir_prefix);
1057             if (add_slash) 
1058               (*filename)[prefix_length - 1] = '/';
1059             memcpy (*filename + prefix_length, value.b, (value.e - value.b));
1060             (*filename)[total_length] = '\0';
1061           }
1062         else
1063           *filename = strdupdelim (value.b, value.e);
1064         return true;
1065       }
1066   return false;
1067 }
1068 \f
1069 /* Persistent connections.  Currently, we cache the most recently used
1070    connection as persistent, provided that the HTTP server agrees to
1071    make it such.  The persistence data is stored in the variables
1072    below.  Ideally, it should be possible to cache an arbitrary fixed
1073    number of these connections.  */
1074
1075 /* Whether a persistent connection is active. */
1076 static bool pconn_active;
1077
1078 static struct {
1079   /* The socket of the connection.  */
1080   int socket;
1081
1082   /* Host and port of the currently active persistent connection. */
1083   char *host;
1084   int port;
1085
1086   /* Whether a ssl handshake has occoured on this connection.  */
1087   bool ssl;
1088
1089   /* Whether the connection was authorized.  This is only done by
1090      NTLM, which authorizes *connections* rather than individual
1091      requests.  (That practice is peculiar for HTTP, but it is a
1092      useful optimization.)  */
1093   bool authorized;
1094
1095 #ifdef ENABLE_NTLM
1096   /* NTLM data of the current connection.  */
1097   struct ntlmdata ntlm;
1098 #endif
1099 } pconn;
1100
1101 /* Mark the persistent connection as invalid and free the resources it
1102    uses.  This is used by the CLOSE_* macros after they forcefully
1103    close a registered persistent connection.  */
1104
1105 static void
1106 invalidate_persistent (void)
1107 {
1108   DEBUGP (("Disabling further reuse of socket %d.\n", pconn.socket));
1109   pconn_active = false;
1110   fd_close (pconn.socket);
1111   xfree (pconn.host);
1112   xzero (pconn);
1113 }
1114
1115 /* Register FD, which should be a TCP/IP connection to HOST:PORT, as
1116    persistent.  This will enable someone to use the same connection
1117    later.  In the context of HTTP, this must be called only AFTER the
1118    response has been received and the server has promised that the
1119    connection will remain alive.
1120
1121    If a previous connection was persistent, it is closed. */
1122
1123 static void
1124 register_persistent (const char *host, int port, int fd, bool ssl)
1125 {
1126   if (pconn_active)
1127     {
1128       if (pconn.socket == fd)
1129         {
1130           /* The connection FD is already registered. */
1131           return;
1132         }
1133       else
1134         {
1135           /* The old persistent connection is still active; close it
1136              first.  This situation arises whenever a persistent
1137              connection exists, but we then connect to a different
1138              host, and try to register a persistent connection to that
1139              one.  */
1140           invalidate_persistent ();
1141         }
1142     }
1143
1144   pconn_active = true;
1145   pconn.socket = fd;
1146   pconn.host = xstrdup (host);
1147   pconn.port = port;
1148   pconn.ssl = ssl;
1149   pconn.authorized = false;
1150
1151   DEBUGP (("Registered socket %d for persistent reuse.\n", fd));
1152 }
1153
1154 /* Return true if a persistent connection is available for connecting
1155    to HOST:PORT.  */
1156
1157 static bool
1158 persistent_available_p (const char *host, int port, bool ssl,
1159                         bool *host_lookup_failed)
1160 {
1161   /* First, check whether a persistent connection is active at all.  */
1162   if (!pconn_active)
1163     return false;
1164
1165   /* If we want SSL and the last connection wasn't or vice versa,
1166      don't use it.  Checking for host and port is not enough because
1167      HTTP and HTTPS can apparently coexist on the same port.  */
1168   if (ssl != pconn.ssl)
1169     return false;
1170
1171   /* If we're not connecting to the same port, we're not interested. */
1172   if (port != pconn.port)
1173     return false;
1174
1175   /* If the host is the same, we're in business.  If not, there is
1176      still hope -- read below.  */
1177   if (0 != strcasecmp (host, pconn.host))
1178     {
1179       /* Check if pconn.socket is talking to HOST under another name.
1180          This happens often when both sites are virtual hosts
1181          distinguished only by name and served by the same network
1182          interface, and hence the same web server (possibly set up by
1183          the ISP and serving many different web sites).  This
1184          admittedly unconventional optimization does not contradict
1185          HTTP and works well with popular server software.  */
1186
1187       bool found;
1188       ip_address ip;
1189       struct address_list *al;
1190
1191       if (ssl)
1192         /* Don't try to talk to two different SSL sites over the same
1193            secure connection!  (Besides, it's not clear that
1194            name-based virtual hosting is even possible with SSL.)  */
1195         return false;
1196
1197       /* If pconn.socket's peer is one of the IP addresses HOST
1198          resolves to, pconn.socket is for all intents and purposes
1199          already talking to HOST.  */
1200
1201       if (!socket_ip_address (pconn.socket, &ip, ENDPOINT_PEER))
1202         {
1203           /* Can't get the peer's address -- something must be very
1204              wrong with the connection.  */
1205           invalidate_persistent ();
1206           return false;
1207         }
1208       al = lookup_host (host, 0);
1209       if (!al)
1210         {
1211           *host_lookup_failed = true;
1212           return false;
1213         }
1214
1215       found = address_list_contains (al, &ip);
1216       address_list_release (al);
1217
1218       if (!found)
1219         return false;
1220
1221       /* The persistent connection's peer address was found among the
1222          addresses HOST resolved to; therefore, pconn.sock is in fact
1223          already talking to HOST -- no need to reconnect.  */
1224     }
1225
1226   /* Finally, check whether the connection is still open.  This is
1227      important because most servers implement liberal (short) timeout
1228      on persistent connections.  Wget can of course always reconnect
1229      if the connection doesn't work out, but it's nicer to know in
1230      advance.  This test is a logical followup of the first test, but
1231      is "expensive" and therefore placed at the end of the list.
1232
1233      (Current implementation of test_socket_open has a nice side
1234      effect that it treats sockets with pending data as "closed".
1235      This is exactly what we want: if a broken server sends message
1236      body in response to HEAD, or if it sends more than conent-length
1237      data, we won't reuse the corrupted connection.)  */
1238
1239   if (!test_socket_open (pconn.socket))
1240     {
1241       /* Oops, the socket is no longer open.  Now that we know that,
1242          let's invalidate the persistent connection before returning
1243          0.  */
1244       invalidate_persistent ();
1245       return false;
1246     }
1247
1248   return true;
1249 }
1250
1251 /* The idea behind these two CLOSE macros is to distinguish between
1252    two cases: one when the job we've been doing is finished, and we
1253    want to close the connection and leave, and two when something is
1254    seriously wrong and we're closing the connection as part of
1255    cleanup.
1256
1257    In case of keep_alive, CLOSE_FINISH should leave the connection
1258    open, while CLOSE_INVALIDATE should still close it.
1259
1260    Note that the semantics of the flag `keep_alive' is "this
1261    connection *will* be reused (the server has promised not to close
1262    the connection once we're done)", while the semantics of
1263    `pc_active_p && (fd) == pc_last_fd' is "we're *now* using an
1264    active, registered connection".  */
1265
1266 #define CLOSE_FINISH(fd) do {                   \
1267   if (!keep_alive)                              \
1268     {                                           \
1269       if (pconn_active && (fd) == pconn.socket) \
1270         invalidate_persistent ();               \
1271       else                                      \
1272         {                                       \
1273           fd_close (fd);                        \
1274           fd = -1;                              \
1275         }                                       \
1276     }                                           \
1277 } while (0)
1278
1279 #define CLOSE_INVALIDATE(fd) do {               \
1280   if (pconn_active && (fd) == pconn.socket)     \
1281     invalidate_persistent ();                   \
1282   else                                          \
1283     fd_close (fd);                              \
1284   fd = -1;                                      \
1285 } while (0)
1286 \f
1287 struct http_stat
1288 {
1289   wgint len;                    /* received length */
1290   wgint contlen;                /* expected length */
1291   wgint restval;                /* the restart value */
1292   int res;                      /* the result of last read */
1293   char *rderrmsg;               /* error message from read error */
1294   char *newloc;                 /* new location (redirection) */
1295   char *remote_time;            /* remote time-stamp string */
1296   char *error;                  /* textual HTTP error */
1297   int statcode;                 /* status code */
1298   wgint rd_size;                /* amount of data read from socket */
1299   double dltime;                /* time it took to download the data */
1300   const char *referer;          /* value of the referer header. */
1301   char *local_file;             /* local file name. */
1302   bool existence_checked;       /* true if we already checked for a file's
1303                                    existence after having begun to download
1304                                    (needed in gethttp for when connection is
1305                                    interrupted/restarted. */
1306   bool timestamp_checked;       /* true if pre-download time-stamping checks 
1307                                  * have already been performed */
1308   char *orig_file_name;         /* name of file to compare for time-stamping
1309                                  * (might be != local_file if -K is set) */
1310   wgint orig_file_size;         /* size of file to compare for time-stamping */
1311   time_t orig_file_tstamp;      /* time-stamp of file to compare for 
1312                                  * time-stamping */
1313 };
1314
1315 static void
1316 free_hstat (struct http_stat *hs)
1317 {
1318   xfree_null (hs->newloc);
1319   xfree_null (hs->remote_time);
1320   xfree_null (hs->error);
1321   xfree_null (hs->rderrmsg);
1322   xfree_null (hs->local_file);
1323   xfree_null (hs->orig_file_name);
1324
1325   /* Guard against being called twice. */
1326   hs->newloc = NULL;
1327   hs->remote_time = NULL;
1328   hs->error = NULL;
1329 }
1330
1331 #define BEGINS_WITH(line, string_constant)                               \
1332   (!strncasecmp (line, string_constant, sizeof (string_constant) - 1)    \
1333    && (c_isspace (line[sizeof (string_constant) - 1])                      \
1334        || !line[sizeof (string_constant) - 1]))
1335
1336 #define SET_USER_AGENT(req) do {                                         \
1337   if (!opt.useragent)                                                    \
1338     request_set_header (req, "User-Agent",                               \
1339                         aprintf ("Wget/%s", version_string), rel_value); \
1340   else if (*opt.useragent)                                               \
1341     request_set_header (req, "User-Agent", opt.useragent, rel_none);     \
1342 } while (0)
1343
1344 /* The flags that allow clobbering the file (opening with "wb").
1345    Defined here to avoid repetition later.  #### This will require
1346    rework.  */
1347 #define ALLOW_CLOBBER (opt.noclobber || opt.always_rest || opt.timestamping \
1348                        || opt.dirstruct || opt.output_document)
1349
1350 /* Retrieve a document through HTTP protocol.  It recognizes status
1351    code, and correctly handles redirections.  It closes the network
1352    socket.  If it receives an error from the functions below it, it
1353    will print it if there is enough information to do so (almost
1354    always), returning the error to the caller (i.e. http_loop).
1355
1356    Various HTTP parameters are stored to hs.
1357
1358    If PROXY is non-NULL, the connection will be made to the proxy
1359    server, and u->url will be requested.  */
1360 static uerr_t
1361 gethttp (struct url *u, struct http_stat *hs, int *dt, struct url *proxy)
1362 {
1363   struct request *req;
1364
1365   char *type;
1366   char *user, *passwd;
1367   char *proxyauth;
1368   int statcode;
1369   int write_error;
1370   wgint contlen, contrange;
1371   struct url *conn;
1372   FILE *fp;
1373
1374   int sock = -1;
1375   int flags;
1376
1377   /* Set to 1 when the authorization has already been sent and should
1378      not be tried again. */
1379   bool auth_finished = false;
1380
1381   /* Set to 1 when just globally-set Basic authorization has been sent;
1382    * should prevent further Basic negotiations, but not other
1383    * mechanisms. */
1384   bool basic_auth_finished = false;
1385
1386   /* Whether NTLM authentication is used for this request. */
1387   bool ntlm_seen = false;
1388
1389   /* Whether our connection to the remote host is through SSL.  */
1390   bool using_ssl = false;
1391
1392   /* Whether a HEAD request will be issued (as opposed to GET or
1393      POST). */
1394   bool head_only = !!(*dt & HEAD_ONLY);
1395
1396   char *head;
1397   struct response *resp;
1398   char hdrval[256];
1399   char *message;
1400
1401   /* Whether this connection will be kept alive after the HTTP request
1402      is done. */
1403   bool keep_alive;
1404
1405   /* Whether keep-alive should be inhibited.
1406
1407      RFC 2068 requests that 1.0 clients not send keep-alive requests
1408      to proxies.  This is because many 1.0 proxies do not interpret
1409      the Connection header and transfer it to the remote server,
1410      causing it to not close the connection and leave both the proxy
1411      and the client hanging.  */
1412   bool inhibit_keep_alive =
1413     !opt.http_keep_alive || opt.ignore_length || proxy != NULL;
1414
1415   /* Headers sent when using POST. */
1416   wgint post_data_size = 0;
1417
1418   bool host_lookup_failed = false;
1419
1420 #ifdef HAVE_SSL
1421   if (u->scheme == SCHEME_HTTPS)
1422     {
1423       /* Initialize the SSL context.  After this has once been done,
1424          it becomes a no-op.  */
1425       if (!ssl_init ())
1426         {
1427           scheme_disable (SCHEME_HTTPS);
1428           logprintf (LOG_NOTQUIET,
1429                      _("Disabling SSL due to encountered errors.\n"));
1430           return SSLINITFAILED;
1431         }
1432     }
1433 #endif /* HAVE_SSL */
1434
1435   /* Initialize certain elements of struct http_stat.  */
1436   hs->len = 0;
1437   hs->contlen = -1;
1438   hs->res = -1;
1439   hs->rderrmsg = NULL;
1440   hs->newloc = NULL;
1441   hs->remote_time = NULL;
1442   hs->error = NULL;
1443
1444   conn = u;
1445
1446   /* Prepare the request to send. */
1447
1448   req = request_new ();
1449   {
1450     char *meth_arg;
1451     const char *meth = "GET";
1452     if (head_only)
1453       meth = "HEAD";
1454     else if (opt.post_file_name || opt.post_data)
1455       meth = "POST";
1456     /* Use the full path, i.e. one that includes the leading slash and
1457        the query string.  E.g. if u->path is "foo/bar" and u->query is
1458        "param=value", full_path will be "/foo/bar?param=value".  */
1459     if (proxy
1460 #ifdef HAVE_SSL
1461         /* When using SSL over proxy, CONNECT establishes a direct
1462            connection to the HTTPS server.  Therefore use the same
1463            argument as when talking to the server directly. */
1464         && u->scheme != SCHEME_HTTPS
1465 #endif
1466         )
1467       meth_arg = xstrdup (u->url);
1468     else
1469       meth_arg = url_full_path (u);
1470     request_set_method (req, meth, meth_arg);
1471   }
1472
1473   request_set_header (req, "Referer", (char *) hs->referer, rel_none);
1474   if (*dt & SEND_NOCACHE)
1475     request_set_header (req, "Pragma", "no-cache", rel_none);
1476   if (hs->restval)
1477     request_set_header (req, "Range",
1478                         aprintf ("bytes=%s-",
1479                                  number_to_static_string (hs->restval)),
1480                         rel_value);
1481   SET_USER_AGENT (req);
1482   request_set_header (req, "Accept", "*/*", rel_none);
1483
1484   /* Find the username and password for authentication. */
1485   user = u->user;
1486   passwd = u->passwd;
1487   search_netrc (u->host, (const char **)&user, (const char **)&passwd, 0);
1488   user = user ? user : (opt.http_user ? opt.http_user : opt.user);
1489   passwd = passwd ? passwd : (opt.http_passwd ? opt.http_passwd : opt.passwd);
1490
1491   if (user && passwd
1492       && !u->user) /* We only do "site-wide" authentication with "global"
1493                       user/password values; URL user/password info overrides. */
1494     {
1495       /* If this is a host for which we've already received a Basic
1496        * challenge, we'll go ahead and send Basic authentication creds. */
1497       basic_auth_finished = maybe_send_basic_creds(u->host, user, passwd, req);
1498     }
1499
1500   /* Generate the Host header, HOST:PORT.  Take into account that:
1501
1502      - Broken server-side software often doesn't recognize the PORT
1503        argument, so we must generate "Host: www.server.com" instead of
1504        "Host: www.server.com:80" (and likewise for https port).
1505
1506      - IPv6 addresses contain ":", so "Host: 3ffe:8100:200:2::2:1234"
1507        becomes ambiguous and needs to be rewritten as "Host:
1508        [3ffe:8100:200:2::2]:1234".  */
1509   {
1510     /* Formats arranged for hfmt[add_port][add_squares].  */
1511     static const char *hfmt[][2] = {
1512       { "%s", "[%s]" }, { "%s:%d", "[%s]:%d" }
1513     };
1514     int add_port = u->port != scheme_default_port (u->scheme);
1515     int add_squares = strchr (u->host, ':') != NULL;
1516     request_set_header (req, "Host",
1517                         aprintf (hfmt[add_port][add_squares], u->host, u->port),
1518                         rel_value);
1519   }
1520
1521   if (!inhibit_keep_alive)
1522     request_set_header (req, "Connection", "Keep-Alive", rel_none);
1523
1524   if (opt.cookies)
1525     request_set_header (req, "Cookie",
1526                         cookie_header (wget_cookie_jar,
1527                                        u->host, u->port, u->path,
1528 #ifdef HAVE_SSL
1529                                        u->scheme == SCHEME_HTTPS
1530 #else
1531                                        0
1532 #endif
1533                                        ),
1534                         rel_value);
1535
1536   if (opt.post_data || opt.post_file_name)
1537     {
1538       request_set_header (req, "Content-Type",
1539                           "application/x-www-form-urlencoded", rel_none);
1540       if (opt.post_data)
1541         post_data_size = strlen (opt.post_data);
1542       else
1543         {
1544           post_data_size = file_size (opt.post_file_name);
1545           if (post_data_size == -1)
1546             {
1547               logprintf (LOG_NOTQUIET, _("POST data file `%s' missing: %s\n"),
1548                          opt.post_file_name, strerror (errno));
1549               post_data_size = 0;
1550             }
1551         }
1552       request_set_header (req, "Content-Length",
1553                           xstrdup (number_to_static_string (post_data_size)),
1554                           rel_value);
1555     }
1556
1557   /* Add the user headers. */
1558   if (opt.user_headers)
1559     {
1560       int i;
1561       for (i = 0; opt.user_headers[i]; i++)
1562         request_set_user_header (req, opt.user_headers[i]);
1563     }
1564
1565  retry_with_auth:
1566   /* We need to come back here when the initial attempt to retrieve
1567      without authorization header fails.  (Expected to happen at least
1568      for the Digest authorization scheme.)  */
1569
1570   proxyauth = NULL;
1571   if (proxy)
1572     {
1573       char *proxy_user, *proxy_passwd;
1574       /* For normal username and password, URL components override
1575          command-line/wgetrc parameters.  With proxy
1576          authentication, it's the reverse, because proxy URLs are
1577          normally the "permanent" ones, so command-line args
1578          should take precedence.  */
1579       if (opt.proxy_user && opt.proxy_passwd)
1580         {
1581           proxy_user = opt.proxy_user;
1582           proxy_passwd = opt.proxy_passwd;
1583         }
1584       else
1585         {
1586           proxy_user = proxy->user;
1587           proxy_passwd = proxy->passwd;
1588         }
1589       /* #### This does not appear right.  Can't the proxy request,
1590          say, `Digest' authentication?  */
1591       if (proxy_user && proxy_passwd)
1592         proxyauth = basic_authentication_encode (proxy_user, proxy_passwd);
1593
1594       /* If we're using a proxy, we will be connecting to the proxy
1595          server.  */
1596       conn = proxy;
1597
1598       /* Proxy authorization over SSL is handled below. */
1599 #ifdef HAVE_SSL
1600       if (u->scheme != SCHEME_HTTPS)
1601 #endif
1602         request_set_header (req, "Proxy-Authorization", proxyauth, rel_value);
1603     }
1604
1605   keep_alive = false;
1606
1607   /* Establish the connection.  */
1608
1609   if (!inhibit_keep_alive)
1610     {
1611       /* Look for a persistent connection to target host, unless a
1612          proxy is used.  The exception is when SSL is in use, in which
1613          case the proxy is nothing but a passthrough to the target
1614          host, registered as a connection to the latter.  */
1615       struct url *relevant = conn;
1616 #ifdef HAVE_SSL
1617       if (u->scheme == SCHEME_HTTPS)
1618         relevant = u;
1619 #endif
1620
1621       if (persistent_available_p (relevant->host, relevant->port,
1622 #ifdef HAVE_SSL
1623                                   relevant->scheme == SCHEME_HTTPS,
1624 #else
1625                                   0,
1626 #endif
1627                                   &host_lookup_failed))
1628         {
1629           sock = pconn.socket;
1630           using_ssl = pconn.ssl;
1631           logprintf (LOG_VERBOSE, _("Reusing existing connection to %s:%d.\n"),
1632                      escnonprint (pconn.host), pconn.port);
1633           DEBUGP (("Reusing fd %d.\n", sock));
1634           if (pconn.authorized)
1635             /* If the connection is already authorized, the "Basic"
1636                authorization added by code above is unnecessary and
1637                only hurts us.  */
1638             request_remove_header (req, "Authorization");
1639         }
1640       else if (host_lookup_failed)
1641         {
1642           request_free (req);
1643           logprintf(LOG_NOTQUIET,
1644                     _("%s: unable to resolve host address `%s'\n"),
1645                     exec_name, relevant->host);
1646           return HOSTERR;
1647         }
1648     }
1649
1650   if (sock < 0)
1651     {
1652       sock = connect_to_host (conn->host, conn->port);
1653       if (sock == E_HOST)
1654         {
1655           request_free (req);
1656           return HOSTERR;
1657         }
1658       else if (sock < 0)
1659         {
1660           request_free (req);
1661           return (retryable_socket_connect_error (errno)
1662                   ? CONERROR : CONIMPOSSIBLE);
1663         }
1664
1665 #ifdef HAVE_SSL
1666       if (proxy && u->scheme == SCHEME_HTTPS)
1667         {
1668           /* When requesting SSL URLs through proxies, use the
1669              CONNECT method to request passthrough.  */
1670           struct request *connreq = request_new ();
1671           request_set_method (connreq, "CONNECT",
1672                               aprintf ("%s:%d", u->host, u->port));
1673           SET_USER_AGENT (connreq);
1674           if (proxyauth)
1675             {
1676               request_set_header (connreq, "Proxy-Authorization",
1677                                   proxyauth, rel_value);
1678               /* Now that PROXYAUTH is part of the CONNECT request,
1679                  zero it out so we don't send proxy authorization with
1680                  the regular request below.  */
1681               proxyauth = NULL;
1682             }
1683           /* Examples in rfc2817 use the Host header in CONNECT
1684              requests.  I don't see how that gains anything, given
1685              that the contents of Host would be exactly the same as
1686              the contents of CONNECT.  */
1687
1688           write_error = request_send (connreq, sock);
1689           request_free (connreq);
1690           if (write_error < 0)
1691             {
1692               CLOSE_INVALIDATE (sock);
1693               return WRITEFAILED;
1694             }
1695
1696           head = read_http_response_head (sock);
1697           if (!head)
1698             {
1699               logprintf (LOG_VERBOSE, _("Failed reading proxy response: %s\n"),
1700                          fd_errstr (sock));
1701               CLOSE_INVALIDATE (sock);
1702               return HERR;
1703             }
1704           message = NULL;
1705           if (!*head)
1706             {
1707               xfree (head);
1708               goto failed_tunnel;
1709             }
1710           DEBUGP (("proxy responded with: [%s]\n", head));
1711
1712           resp = resp_new (head);
1713           statcode = resp_status (resp, &message);
1714           resp_free (resp);
1715           xfree (head);
1716           if (statcode != 200)
1717             {
1718             failed_tunnel:
1719               logprintf (LOG_NOTQUIET, _("Proxy tunneling failed: %s"),
1720                          message ? escnonprint (message) : "?");
1721               xfree_null (message);
1722               return CONSSLERR;
1723             }
1724           xfree_null (message);
1725
1726           /* SOCK is now *really* connected to u->host, so update CONN
1727              to reflect this.  That way register_persistent will
1728              register SOCK as being connected to u->host:u->port.  */
1729           conn = u;
1730         }
1731
1732       if (conn->scheme == SCHEME_HTTPS)
1733         {
1734           if (!ssl_connect (sock) || !ssl_check_certificate (sock, u->host))
1735             {
1736               fd_close (sock);
1737               return CONSSLERR;
1738             }
1739           using_ssl = true;
1740         }
1741 #endif /* HAVE_SSL */
1742     }
1743
1744   /* Send the request to server.  */
1745   write_error = request_send (req, sock);
1746
1747   if (write_error >= 0)
1748     {
1749       if (opt.post_data)
1750         {
1751           DEBUGP (("[POST data: %s]\n", opt.post_data));
1752           write_error = fd_write (sock, opt.post_data, post_data_size, -1);
1753         }
1754       else if (opt.post_file_name && post_data_size != 0)
1755         write_error = post_file (sock, opt.post_file_name, post_data_size);
1756     }
1757
1758   if (write_error < 0)
1759     {
1760       CLOSE_INVALIDATE (sock);
1761       request_free (req);
1762       return WRITEFAILED;
1763     }
1764   logprintf (LOG_VERBOSE, _("%s request sent, awaiting response... "),
1765              proxy ? "Proxy" : "HTTP");
1766   contlen = -1;
1767   contrange = 0;
1768   *dt &= ~RETROKF;
1769
1770   head = read_http_response_head (sock);
1771   if (!head)
1772     {
1773       if (errno == 0)
1774         {
1775           logputs (LOG_NOTQUIET, _("No data received.\n"));
1776           CLOSE_INVALIDATE (sock);
1777           request_free (req);
1778           return HEOF;
1779         }
1780       else
1781         {
1782           logprintf (LOG_NOTQUIET, _("Read error (%s) in headers.\n"),
1783                      fd_errstr (sock));
1784           CLOSE_INVALIDATE (sock);
1785           request_free (req);
1786           return HERR;
1787         }
1788     }
1789   DEBUGP (("\n---response begin---\n%s---response end---\n", head));
1790
1791   resp = resp_new (head);
1792
1793   /* Check for status line.  */
1794   message = NULL;
1795   statcode = resp_status (resp, &message);
1796   if (!opt.server_response)
1797     logprintf (LOG_VERBOSE, "%2d %s\n", statcode,
1798                message ? escnonprint (message) : "");
1799   else
1800     {
1801       logprintf (LOG_VERBOSE, "\n");
1802       print_server_response (resp, "  ");
1803     }
1804
1805   /* Determine the local filename if needed. Notice that if -O is used 
1806    * hstat.local_file is set by http_loop to the argument of -O. */
1807   if (!hs->local_file)
1808     {
1809       /* Honor Content-Disposition whether possible. */
1810       if (!opt.content_disposition
1811           || !resp_header_copy (resp, "Content-Disposition", 
1812                                 hdrval, sizeof (hdrval))
1813           || !parse_content_disposition (hdrval, &hs->local_file))
1814         {
1815           /* The Content-Disposition header is missing or broken. 
1816            * Choose unique file name according to given URL. */
1817           hs->local_file = url_file_name (u);
1818         }
1819     }
1820   
1821   /* TODO: perform this check only once. */
1822   if (!hs->existence_checked && file_exists_p (hs->local_file))
1823     {
1824       if (opt.noclobber)
1825         {
1826           /* If opt.noclobber is turned on and file already exists, do not
1827              retrieve the file */
1828           logprintf (LOG_VERBOSE, _("\
1829 File `%s' already there; not retrieving.\n\n"), hs->local_file);
1830           /* If the file is there, we suppose it's retrieved OK.  */
1831           *dt |= RETROKF;
1832
1833           /* #### Bogusness alert.  */
1834           /* If its suffix is "html" or "htm" or similar, assume text/html.  */
1835           if (has_html_suffix_p (hs->local_file))
1836             *dt |= TEXTHTML;
1837
1838           return RETRUNNEEDED;
1839         }
1840       else if (!ALLOW_CLOBBER)
1841         {
1842           char *unique = unique_name (hs->local_file, true);
1843           if (unique != hs->local_file)
1844             xfree (hs->local_file);
1845           hs->local_file = unique;
1846         }
1847     }
1848   hs->existence_checked = true;
1849
1850   /* Support timestamping */
1851   /* TODO: move this code out of gethttp. */
1852   if (opt.timestamping && !hs->timestamp_checked)
1853     {
1854       size_t filename_len = strlen (hs->local_file);
1855       char *filename_plus_orig_suffix = alloca (filename_len + sizeof (".orig"));
1856       bool local_dot_orig_file_exists = false;
1857       char *local_filename = NULL;
1858       struct_stat st;
1859
1860       if (opt.backup_converted)
1861         /* If -K is specified, we'll act on the assumption that it was specified
1862            last time these files were downloaded as well, and instead of just
1863            comparing local file X against server file X, we'll compare local
1864            file X.orig (if extant, else X) against server file X.  If -K
1865            _wasn't_ specified last time, or the server contains files called
1866            *.orig, -N will be back to not operating correctly with -k. */
1867         {
1868           /* Would a single s[n]printf() call be faster?  --dan
1869
1870              Definitely not.  sprintf() is horribly slow.  It's a
1871              different question whether the difference between the two
1872              affects a program.  Usually I'd say "no", but at one
1873              point I profiled Wget, and found that a measurable and
1874              non-negligible amount of time was lost calling sprintf()
1875              in url.c.  Replacing sprintf with inline calls to
1876              strcpy() and number_to_string() made a difference.
1877              --hniksic */
1878           memcpy (filename_plus_orig_suffix, hs->local_file, filename_len);
1879           memcpy (filename_plus_orig_suffix + filename_len,
1880                   ".orig", sizeof (".orig"));
1881
1882           /* Try to stat() the .orig file. */
1883           if (stat (filename_plus_orig_suffix, &st) == 0)
1884             {
1885               local_dot_orig_file_exists = true;
1886               local_filename = filename_plus_orig_suffix;
1887             }
1888         }      
1889
1890       if (!local_dot_orig_file_exists)
1891         /* Couldn't stat() <file>.orig, so try to stat() <file>. */
1892         if (stat (hs->local_file, &st) == 0)
1893           local_filename = hs->local_file;
1894
1895       if (local_filename != NULL)
1896         /* There was a local file, so we'll check later to see if the version
1897            the server has is the same version we already have, allowing us to
1898            skip a download. */
1899         {
1900           hs->orig_file_name = xstrdup (local_filename);
1901           hs->orig_file_size = st.st_size;
1902           hs->orig_file_tstamp = st.st_mtime;
1903 #ifdef WINDOWS
1904           /* Modification time granularity is 2 seconds for Windows, so
1905              increase local time by 1 second for later comparison. */
1906           ++hs->orig_file_tstamp;
1907 #endif
1908         }
1909     }
1910
1911   if (!opt.ignore_length
1912       && resp_header_copy (resp, "Content-Length", hdrval, sizeof (hdrval)))
1913     {
1914       wgint parsed;
1915       errno = 0;
1916       parsed = str_to_wgint (hdrval, NULL, 10);
1917       if (parsed == WGINT_MAX && errno == ERANGE)
1918         {
1919           /* Out of range.
1920              #### If Content-Length is out of range, it most likely
1921              means that the file is larger than 2G and that we're
1922              compiled without LFS.  In that case we should probably
1923              refuse to even attempt to download the file.  */
1924           contlen = -1;
1925         }
1926       else if (parsed < 0)
1927         {
1928           /* Negative Content-Length; nonsensical, so we can't
1929              assume any information about the content to receive. */
1930           contlen = -1;
1931         }
1932       else
1933         contlen = parsed;
1934     }
1935
1936   /* Check for keep-alive related responses. */
1937   if (!inhibit_keep_alive && contlen != -1)
1938     {
1939       if (resp_header_copy (resp, "Keep-Alive", NULL, 0))
1940         keep_alive = true;
1941       else if (resp_header_copy (resp, "Connection", hdrval, sizeof (hdrval)))
1942         {
1943           if (0 == strcasecmp (hdrval, "Keep-Alive"))
1944             keep_alive = true;
1945         }
1946     }
1947   if (keep_alive)
1948     /* The server has promised that it will not close the connection
1949        when we're done.  This means that we can register it.  */
1950     register_persistent (conn->host, conn->port, sock, using_ssl);
1951
1952   if (statcode == HTTP_STATUS_UNAUTHORIZED)
1953     {
1954       /* Authorization is required.  */
1955       if (keep_alive && !head_only && skip_short_body (sock, contlen))
1956         CLOSE_FINISH (sock);
1957       else
1958         CLOSE_INVALIDATE (sock);
1959       pconn.authorized = false;
1960       if (!auth_finished && (user && passwd))
1961         {
1962           /* IIS sends multiple copies of WWW-Authenticate, one with
1963              the value "negotiate", and other(s) with data.  Loop over
1964              all the occurrences and pick the one we recognize.  */
1965           int wapos;
1966           const char *wabeg, *waend;
1967           char *www_authenticate = NULL;
1968           for (wapos = 0;
1969                (wapos = resp_header_locate (resp, "WWW-Authenticate", wapos,
1970                                             &wabeg, &waend)) != -1;
1971                ++wapos)
1972             if (known_authentication_scheme_p (wabeg, waend))
1973               {
1974                 BOUNDED_TO_ALLOCA (wabeg, waend, www_authenticate);
1975                 break;
1976               }
1977
1978           if (!www_authenticate)
1979             {
1980               /* If the authentication header is missing or
1981                  unrecognized, there's no sense in retrying.  */
1982               logputs (LOG_NOTQUIET, _("Unknown authentication scheme.\n"));
1983             }
1984           else if (!basic_auth_finished
1985                    || !BEGINS_WITH (www_authenticate, "Basic"))
1986             {
1987               char *pth;
1988               pth = url_full_path (u);
1989               request_set_header (req, "Authorization",
1990                                   create_authorization_line (www_authenticate,
1991                                                              user, passwd,
1992                                                              request_method (req),
1993                                                              pth,
1994                                                              &auth_finished),
1995                                   rel_value);
1996               if (BEGINS_WITH (www_authenticate, "NTLM"))
1997                 ntlm_seen = true;
1998               else if (!u->user && BEGINS_WITH (www_authenticate, "Basic"))
1999                 {
2000                   /* Need to register this host as using basic auth,
2001                    * so we automatically send creds next time. */
2002                   register_basic_auth_host (u->host);
2003                 }
2004               xfree (pth);
2005               goto retry_with_auth;
2006             }
2007           else
2008             {
2009               /* We already did Basic auth, and it failed. Gotta
2010                * give up. */
2011             }
2012         }
2013       logputs (LOG_NOTQUIET, _("Authorization failed.\n"));
2014       request_free (req);
2015       return AUTHFAILED;
2016     }
2017   else /* statcode != HTTP_STATUS_UNAUTHORIZED */
2018     {
2019       /* Kludge: if NTLM is used, mark the TCP connection as authorized. */
2020       if (ntlm_seen)
2021         pconn.authorized = true;
2022     }
2023   request_free (req);
2024
2025   hs->statcode = statcode;
2026   if (statcode == -1)
2027     hs->error = xstrdup (_("Malformed status line"));
2028   else if (!*message)
2029     hs->error = xstrdup (_("(no description)"));
2030   else
2031     hs->error = xstrdup (message);
2032   xfree_null (message);
2033
2034   type = resp_header_strdup (resp, "Content-Type");
2035   if (type)
2036     {
2037       char *tmp = strchr (type, ';');
2038       if (tmp)
2039         {
2040           while (tmp > type && c_isspace (tmp[-1]))
2041             --tmp;
2042           *tmp = '\0';
2043         }
2044     }
2045   hs->newloc = resp_header_strdup (resp, "Location");
2046   hs->remote_time = resp_header_strdup (resp, "Last-Modified");
2047
2048   /* Handle (possibly multiple instances of) the Set-Cookie header. */
2049   if (opt.cookies)
2050     {
2051       int scpos;
2052       const char *scbeg, *scend;
2053       /* The jar should have been created by now. */
2054       assert (wget_cookie_jar != NULL);
2055       for (scpos = 0;
2056            (scpos = resp_header_locate (resp, "Set-Cookie", scpos,
2057                                         &scbeg, &scend)) != -1;
2058            ++scpos)
2059         {
2060           char *set_cookie; BOUNDED_TO_ALLOCA (scbeg, scend, set_cookie);
2061           cookie_handle_set_cookie (wget_cookie_jar, u->host, u->port,
2062                                     u->path, set_cookie);
2063         }
2064     }
2065
2066   if (resp_header_copy (resp, "Content-Range", hdrval, sizeof (hdrval)))
2067     {
2068       wgint first_byte_pos, last_byte_pos, entity_length;
2069       if (parse_content_range (hdrval, &first_byte_pos, &last_byte_pos,
2070                                &entity_length))
2071         {
2072           contrange = first_byte_pos;
2073           contlen = last_byte_pos - first_byte_pos + 1;
2074         }
2075     }
2076   resp_free (resp);
2077
2078   /* 20x responses are counted among successful by default.  */
2079   if (H_20X (statcode))
2080     *dt |= RETROKF;
2081
2082   /* Return if redirected.  */
2083   if (H_REDIRECTED (statcode) || statcode == HTTP_STATUS_MULTIPLE_CHOICES)
2084     {
2085       /* RFC2068 says that in case of the 300 (multiple choices)
2086          response, the server can output a preferred URL through
2087          `Location' header; otherwise, the request should be treated
2088          like GET.  So, if the location is set, it will be a
2089          redirection; otherwise, just proceed normally.  */
2090       if (statcode == HTTP_STATUS_MULTIPLE_CHOICES && !hs->newloc)
2091         *dt |= RETROKF;
2092       else
2093         {
2094           logprintf (LOG_VERBOSE,
2095                      _("Location: %s%s\n"),
2096                      hs->newloc ? escnonprint_uri (hs->newloc) : _("unspecified"),
2097                      hs->newloc ? _(" [following]") : "");
2098           if (keep_alive && !head_only && skip_short_body (sock, contlen))
2099             CLOSE_FINISH (sock);
2100           else
2101             CLOSE_INVALIDATE (sock);
2102           xfree_null (type);
2103           return NEWLOCATION;
2104         }
2105     }
2106
2107   /* If content-type is not given, assume text/html.  This is because
2108      of the multitude of broken CGI's that "forget" to generate the
2109      content-type.  */
2110   if (!type ||
2111         0 == strncasecmp (type, TEXTHTML_S, strlen (TEXTHTML_S)) ||
2112         0 == strncasecmp (type, TEXTXHTML_S, strlen (TEXTXHTML_S)))    
2113     *dt |= TEXTHTML;
2114   else
2115     *dt &= ~TEXTHTML;
2116
2117   if (opt.html_extension && (*dt & TEXTHTML))
2118     /* -E / --html-extension / html_extension = on was specified, and this is a
2119        text/html file.  If some case-insensitive variation on ".htm[l]" isn't
2120        already the file's suffix, tack on ".html". */
2121     {
2122       char *last_period_in_local_filename = strrchr (hs->local_file, '.');
2123
2124       if (last_period_in_local_filename == NULL
2125           || !(0 == strcasecmp (last_period_in_local_filename, ".htm")
2126                || 0 == strcasecmp (last_period_in_local_filename, ".html")))
2127         {
2128           int local_filename_len = strlen (hs->local_file);
2129           /* Resize the local file, allowing for ".html" preceded by
2130              optional ".NUMBER".  */
2131           hs->local_file = xrealloc (hs->local_file,
2132                                      local_filename_len + 24 + sizeof (".html"));
2133           strcpy(hs->local_file + local_filename_len, ".html");
2134           /* If clobbering is not allowed and the file, as named,
2135              exists, tack on ".NUMBER.html" instead. */
2136           if (!ALLOW_CLOBBER && file_exists_p (hs->local_file))
2137             {
2138               int ext_num = 1;
2139               do
2140                 sprintf (hs->local_file + local_filename_len,
2141                          ".%d.html", ext_num++);
2142               while (file_exists_p (hs->local_file));
2143             }
2144           *dt |= ADDED_HTML_EXTENSION;
2145         }
2146     }
2147
2148   if (statcode == HTTP_STATUS_RANGE_NOT_SATISFIABLE)
2149     {
2150       /* If `-c' is in use and the file has been fully downloaded (or
2151          the remote file has shrunk), Wget effectively requests bytes
2152          after the end of file and the server response with 416.  */
2153       logputs (LOG_VERBOSE, _("\
2154 \n    The file is already fully retrieved; nothing to do.\n\n"));
2155       /* In case the caller inspects. */
2156       hs->len = contlen;
2157       hs->res = 0;
2158       /* Mark as successfully retrieved. */
2159       *dt |= RETROKF;
2160       xfree_null (type);
2161       CLOSE_INVALIDATE (sock);        /* would be CLOSE_FINISH, but there
2162                                    might be more bytes in the body. */
2163       return RETRUNNEEDED;
2164     }
2165   if ((contrange != 0 && contrange != hs->restval)
2166       || (H_PARTIAL (statcode) && !contrange))
2167     {
2168       /* The Range request was somehow misunderstood by the server.
2169          Bail out.  */
2170       xfree_null (type);
2171       CLOSE_INVALIDATE (sock);
2172       return RANGEERR;
2173     }
2174   if (contlen == -1)
2175     hs->contlen = -1;
2176   else
2177     hs->contlen = contlen + contrange;
2178
2179   if (opt.verbose)
2180     {
2181       if (*dt & RETROKF)
2182         {
2183           /* No need to print this output if the body won't be
2184              downloaded at all, or if the original server response is
2185              printed.  */
2186           logputs (LOG_VERBOSE, _("Length: "));
2187           if (contlen != -1)
2188             {
2189               logputs (LOG_VERBOSE, number_to_static_string (contlen + contrange));
2190               if (contlen + contrange >= 1024)
2191                 logprintf (LOG_VERBOSE, " (%s)",
2192                            human_readable (contlen + contrange));
2193               if (contrange)
2194                 {
2195                   if (contlen >= 1024)
2196                     logprintf (LOG_VERBOSE, _(", %s (%s) remaining"),
2197                                number_to_static_string (contlen),
2198                                human_readable (contlen));
2199                   else
2200                     logprintf (LOG_VERBOSE, _(", %s remaining"),
2201                                number_to_static_string (contlen));
2202                 }
2203             }
2204           else
2205             logputs (LOG_VERBOSE,
2206                      opt.ignore_length ? _("ignored") : _("unspecified"));
2207           if (type)
2208             logprintf (LOG_VERBOSE, " [%s]\n", escnonprint (type));
2209           else
2210             logputs (LOG_VERBOSE, "\n");
2211         }
2212     }
2213   xfree_null (type);
2214   type = NULL;                        /* We don't need it any more.  */
2215
2216   /* Return if we have no intention of further downloading.  */
2217   if (!(*dt & RETROKF) || head_only)
2218     {
2219       /* In case the caller cares to look...  */
2220       hs->len = 0;
2221       hs->res = 0;
2222       xfree_null (type);
2223       if (head_only)
2224         /* Pre-1.10 Wget used CLOSE_INVALIDATE here.  Now we trust the
2225            servers not to send body in response to a HEAD request, and
2226            those that do will likely be caught by test_socket_open.
2227            If not, they can be worked around using
2228            `--no-http-keep-alive'.  */
2229         CLOSE_FINISH (sock);
2230       else if (keep_alive && skip_short_body (sock, contlen))
2231         /* Successfully skipped the body; also keep using the socket. */
2232         CLOSE_FINISH (sock);
2233       else
2234         CLOSE_INVALIDATE (sock);
2235       return RETRFINISHED;
2236     }
2237
2238   /* Open the local file.  */
2239   if (!output_stream)
2240     {
2241       mkalldirs (hs->local_file);
2242       if (opt.backups)
2243         rotate_backups (hs->local_file);
2244       if (hs->restval)
2245         fp = fopen (hs->local_file, "ab");
2246       else if (ALLOW_CLOBBER)
2247         fp = fopen (hs->local_file, "wb");
2248       else
2249         {
2250           fp = fopen_excl (hs->local_file, true);
2251           if (!fp && errno == EEXIST)
2252             {
2253               /* We cannot just invent a new name and use it (which is
2254                  what functions like unique_create typically do)
2255                  because we told the user we'd use this name.
2256                  Instead, return and retry the download.  */
2257               logprintf (LOG_NOTQUIET,
2258                          _("%s has sprung into existence.\n"),
2259                          hs->local_file);
2260               CLOSE_INVALIDATE (sock);
2261               return FOPEN_EXCL_ERR;
2262             }
2263         }
2264       if (!fp)
2265         {
2266           logprintf (LOG_NOTQUIET, "%s: %s\n", hs->local_file, strerror (errno));
2267           CLOSE_INVALIDATE (sock);
2268           return FOPENERR;
2269         }
2270     }
2271   else
2272     fp = output_stream;
2273
2274   /* Print fetch message, if opt.verbose.  */
2275   if (opt.verbose)
2276     {
2277       logprintf (LOG_NOTQUIET, _("Saving to: `%s'\n"), 
2278                  HYPHENP (hs->local_file) ? "STDOUT" : hs->local_file);
2279     }
2280     
2281   /* This confuses the timestamping code that checks for file size.
2282      #### The timestamping code should be smarter about file size.  */
2283   if (opt.save_headers && hs->restval == 0)
2284     fwrite (head, 1, strlen (head), fp);
2285
2286   /* Now we no longer need to store the response header. */
2287   xfree (head);
2288
2289   /* Download the request body.  */
2290   flags = 0;
2291   if (contlen != -1)
2292     /* If content-length is present, read that much; otherwise, read
2293        until EOF.  The HTTP spec doesn't require the server to
2294        actually close the connection when it's done sending data. */
2295     flags |= rb_read_exactly;
2296   if (hs->restval > 0 && contrange == 0)
2297     /* If the server ignored our range request, instruct fd_read_body
2298        to skip the first RESTVAL bytes of body.  */
2299     flags |= rb_skip_startpos;
2300   hs->len = hs->restval;
2301   hs->rd_size = 0;
2302   hs->res = fd_read_body (sock, fp, contlen != -1 ? contlen : 0,
2303                           hs->restval, &hs->rd_size, &hs->len, &hs->dltime,
2304                           flags);
2305
2306   if (hs->res >= 0)
2307     CLOSE_FINISH (sock);
2308   else
2309     {
2310       if (hs->res < 0)
2311         hs->rderrmsg = xstrdup (fd_errstr (sock));
2312       CLOSE_INVALIDATE (sock);
2313     }
2314
2315   if (!output_stream)
2316     fclose (fp);
2317   if (hs->res == -2)
2318     return FWRITEERR;
2319   return RETRFINISHED;
2320 }
2321
2322 /* The genuine HTTP loop!  This is the part where the retrieval is
2323    retried, and retried, and retried, and...  */
2324 uerr_t
2325 http_loop (struct url *u, char **newloc, char **local_file, const char *referer,
2326            int *dt, struct url *proxy)
2327 {
2328   int count;
2329   bool got_head = false;         /* used for time-stamping and filename detection */
2330   bool time_came_from_head = false;
2331   bool got_name = false;
2332   char *tms;
2333   const char *tmrate;
2334   uerr_t err, ret = TRYLIMEXC;
2335   time_t tmr = -1;               /* remote time-stamp */
2336   struct http_stat hstat;        /* HTTP status */
2337   struct_stat st;  
2338   bool send_head_first = true;
2339
2340   /* Assert that no value for *LOCAL_FILE was passed. */
2341   assert (local_file == NULL || *local_file == NULL);
2342   
2343   /* Set LOCAL_FILE parameter. */
2344   if (local_file && opt.output_document)
2345     *local_file = HYPHENP (opt.output_document) ? NULL : xstrdup (opt.output_document);
2346   
2347   /* Reset NEWLOC parameter. */
2348   *newloc = NULL;
2349
2350   /* This used to be done in main(), but it's a better idea to do it
2351      here so that we don't go through the hoops if we're just using
2352      FTP or whatever. */
2353   if (opt.cookies)
2354     load_cookies();
2355
2356   /* Warn on (likely bogus) wildcard usage in HTTP. */
2357   if (opt.ftp_glob && has_wildcards_p (u->path))
2358     logputs (LOG_VERBOSE, _("Warning: wildcards not supported in HTTP.\n"));
2359
2360   /* Setup hstat struct. */
2361   xzero (hstat);
2362   hstat.referer = referer;
2363
2364   if (opt.output_document)
2365     {
2366       hstat.local_file = xstrdup (opt.output_document);
2367       got_name = true;
2368     }
2369   else if (!opt.content_disposition)
2370     {
2371       hstat.local_file = url_file_name (u);
2372       got_name = true;
2373     }
2374
2375   /* TODO: Ick! This code is now in both gethttp and http_loop, and is
2376    * screaming for some refactoring. */
2377   if (got_name && file_exists_p (hstat.local_file) && opt.noclobber)
2378     {
2379       /* If opt.noclobber is turned on and file already exists, do not
2380          retrieve the file */
2381       logprintf (LOG_VERBOSE, _("\
2382 File `%s' already there; not retrieving.\n\n"), 
2383                  hstat.local_file);
2384       /* If the file is there, we suppose it's retrieved OK.  */
2385       *dt |= RETROKF;
2386
2387       /* #### Bogusness alert.  */
2388       /* If its suffix is "html" or "htm" or similar, assume text/html.  */
2389       if (has_html_suffix_p (hstat.local_file))
2390         *dt |= TEXTHTML;
2391
2392       ret = RETROK;
2393       goto exit;
2394     }
2395
2396   /* Reset the counter. */
2397   count = 0;
2398   
2399   /* Reset the document type. */
2400   *dt = 0;
2401   
2402   /* Skip preliminary HEAD request if we're not in spider mode AND
2403    * if -O was given or HTTP Content-Disposition support is disabled. */
2404   if (!opt.spider
2405       && (got_name || !opt.content_disposition))
2406     send_head_first = false;
2407
2408   /* Send preliminary HEAD request if -N is given and we have an existing 
2409    * destination file. */
2410   if (opt.timestamping 
2411       && !opt.content_disposition
2412       && file_exists_p (url_file_name (u)))
2413     send_head_first = true;
2414   
2415   /* THE loop */
2416   do
2417     {
2418       /* Increment the pass counter.  */
2419       ++count;
2420       sleep_between_retrievals (count);
2421       
2422       /* Get the current time string.  */
2423       tms = datetime_str (time (NULL));
2424       
2425       if (opt.spider && !got_head)
2426         logprintf (LOG_VERBOSE, _("\
2427 Spider mode enabled. Check if remote file exists.\n"));
2428
2429       /* Print fetch message, if opt.verbose.  */
2430       if (opt.verbose)
2431         {
2432           char *hurl = url_string (u, URL_AUTH_HIDE_PASSWD);
2433           
2434           if (count > 1) 
2435             {
2436               char tmp[256];
2437               sprintf (tmp, _("(try:%2d)"), count);
2438               logprintf (LOG_NOTQUIET, "--%s--  %s  %s\n",
2439                          tms, tmp, hurl);
2440             }
2441           else 
2442             {
2443               logprintf (LOG_NOTQUIET, "--%s--  %s\n",
2444                          tms, hurl);
2445             }
2446           
2447 #ifdef WINDOWS
2448           ws_changetitle (hurl);
2449 #endif
2450           xfree (hurl);
2451         }
2452
2453       /* Default document type is empty.  However, if spider mode is
2454          on or time-stamping is employed, HEAD_ONLY commands is
2455          encoded within *dt.  */
2456       if (send_head_first && !got_head) 
2457         *dt |= HEAD_ONLY;
2458       else
2459         *dt &= ~HEAD_ONLY;
2460
2461       /* Decide whether or not to restart.  */
2462       if (opt.always_rest
2463           && got_name
2464           && stat (hstat.local_file, &st) == 0
2465           && S_ISREG (st.st_mode))
2466         /* When -c is used, continue from on-disk size.  (Can't use
2467            hstat.len even if count>1 because we don't want a failed
2468            first attempt to clobber existing data.)  */
2469         hstat.restval = st.st_size;
2470       else if (count > 1)
2471         /* otherwise, continue where the previous try left off */
2472         hstat.restval = hstat.len;
2473       else
2474         hstat.restval = 0;
2475
2476       /* Decide whether to send the no-cache directive.  We send it in
2477          two cases:
2478            a) we're using a proxy, and we're past our first retrieval.
2479               Some proxies are notorious for caching incomplete data, so
2480               we require a fresh get.
2481            b) caching is explicitly inhibited. */
2482       if ((proxy && count > 1)        /* a */
2483           || !opt.allow_cache)        /* b */
2484         *dt |= SEND_NOCACHE;
2485       else
2486         *dt &= ~SEND_NOCACHE;
2487
2488       /* Try fetching the document, or at least its head.  */
2489       err = gethttp (u, &hstat, dt, proxy);
2490
2491       /* Time?  */
2492       tms = datetime_str (time (NULL));
2493       
2494       /* Get the new location (with or without the redirection).  */
2495       if (hstat.newloc)
2496         *newloc = xstrdup (hstat.newloc);
2497
2498       switch (err)
2499         {
2500         case HERR: case HEOF: case CONSOCKERR: case CONCLOSED:
2501         case CONERROR: case READERR: case WRITEFAILED:
2502         case RANGEERR: case FOPEN_EXCL_ERR:
2503           /* Non-fatal errors continue executing the loop, which will
2504              bring them to "while" statement at the end, to judge
2505              whether the number of tries was exceeded.  */
2506           printwhat (count, opt.ntry);
2507           continue;
2508         case FWRITEERR: case FOPENERR:
2509           /* Another fatal error.  */
2510           logputs (LOG_VERBOSE, "\n");
2511           logprintf (LOG_NOTQUIET, _("Cannot write to `%s' (%s).\n"),
2512                      hstat.local_file, strerror (errno));
2513         case HOSTERR: case CONIMPOSSIBLE: case PROXERR: case AUTHFAILED: 
2514         case SSLINITFAILED: case CONTNOTSUPPORTED:
2515           /* Fatal errors just return from the function.  */
2516           ret = err;
2517           goto exit;
2518         case CONSSLERR:
2519           /* Another fatal error.  */
2520           logprintf (LOG_NOTQUIET, _("Unable to establish SSL connection.\n"));
2521           ret = err;
2522           goto exit;
2523         case NEWLOCATION:
2524           /* Return the new location to the caller.  */
2525           if (!*newloc)
2526             {
2527               logprintf (LOG_NOTQUIET,
2528                          _("ERROR: Redirection (%d) without location.\n"),
2529                          hstat.statcode);
2530               ret = WRONGCODE;
2531             }
2532           else 
2533             {
2534               ret = NEWLOCATION;
2535             }
2536           goto exit;
2537         case RETRUNNEEDED:
2538           /* The file was already fully retrieved. */
2539           ret = RETROK;
2540           goto exit;
2541         case RETRFINISHED:
2542           /* Deal with you later.  */
2543           break;
2544         default:
2545           /* All possibilities should have been exhausted.  */
2546           abort ();
2547         }
2548       
2549       if (!(*dt & RETROKF))
2550         {
2551           char *hurl = NULL;
2552           if (!opt.verbose)
2553             {
2554               /* #### Ugly ugly ugly! */
2555               hurl = url_string (u, URL_AUTH_HIDE_PASSWD);
2556               logprintf (LOG_NONVERBOSE, "%s:\n", hurl);
2557             }
2558
2559           /* Fall back to GET if HEAD fails with a 500 or 501 error code. */
2560           if (*dt & HEAD_ONLY
2561               && (hstat.statcode == 500 || hstat.statcode == 501))
2562             {
2563               got_head = true;
2564               continue;
2565             }
2566           /* Maybe we should always keep track of broken links, not just in
2567            * spider mode.  */
2568           else if (opt.spider)
2569             {
2570               /* #### Again: ugly ugly ugly! */
2571               if (!hurl) 
2572                 hurl = url_string (u, URL_AUTH_HIDE_PASSWD);
2573               nonexisting_url (hurl);
2574               logprintf (LOG_NOTQUIET, _("\
2575 Remote file does not exist -- broken link!!!\n"));
2576             }
2577           else
2578             {
2579               logprintf (LOG_NOTQUIET, _("%s ERROR %d: %s.\n"),
2580                          tms, hstat.statcode, escnonprint (hstat.error));
2581             }
2582           logputs (LOG_VERBOSE, "\n");
2583           ret = WRONGCODE;
2584           xfree_null (hurl);
2585           goto exit;
2586         }
2587
2588       /* Did we get the time-stamp? */
2589       if (!got_head)
2590         {
2591           got_head = true;    /* no more time-stamping */
2592
2593           if (opt.timestamping && !hstat.remote_time)
2594             {
2595               logputs (LOG_NOTQUIET, _("\
2596 Last-modified header missing -- time-stamps turned off.\n"));
2597             }
2598           else if (hstat.remote_time)
2599             {
2600               /* Convert the date-string into struct tm.  */
2601               tmr = http_atotm (hstat.remote_time);
2602               if (tmr == (time_t) (-1))
2603                 logputs (LOG_VERBOSE, _("\
2604 Last-modified header invalid -- time-stamp ignored.\n"));
2605               if (*dt & HEAD_ONLY)
2606                 time_came_from_head = true;
2607             }
2608       
2609           if (send_head_first)
2610             {
2611               /* The time-stamping section.  */
2612               if (opt.timestamping)
2613                 {
2614                   if (hstat.orig_file_name) /* Perform the following
2615                                                checks only if the file
2616                                                we're supposed to
2617                                                download already exists.  */
2618                     {
2619                       if (hstat.remote_time && 
2620                           tmr != (time_t) (-1))
2621                         {
2622                           /* Now time-stamping can be used validly.
2623                              Time-stamping means that if the sizes of
2624                              the local and remote file match, and local
2625                              file is newer than the remote file, it will
2626                              not be retrieved.  Otherwise, the normal
2627                              download procedure is resumed.  */
2628                           if (hstat.orig_file_tstamp >= tmr)
2629                             {
2630                               if (hstat.contlen == -1 
2631                                   || hstat.orig_file_size == hstat.contlen)
2632                                 {
2633                                   logprintf (LOG_VERBOSE, _("\
2634 Server file no newer than local file `%s' -- not retrieving.\n\n"),
2635                                              hstat.orig_file_name);
2636                                   ret = RETROK;
2637                                   goto exit;
2638                                 }
2639                               else
2640                                 {
2641                                   logprintf (LOG_VERBOSE, _("\
2642 The sizes do not match (local %s) -- retrieving.\n"),
2643                                              number_to_static_string (hstat.orig_file_size));
2644                                 }
2645                             }
2646                           else
2647                             logputs (LOG_VERBOSE,
2648                                      _("Remote file is newer, retrieving.\n"));
2649
2650                           logputs (LOG_VERBOSE, "\n");
2651                         }
2652                     }
2653                   
2654                   /* free_hstat (&hstat); */
2655                   hstat.timestamp_checked = true;
2656                 }
2657               
2658               if (opt.spider)
2659                 {
2660                   if (opt.recursive)
2661                     {
2662                       if (*dt & TEXTHTML)
2663                         {
2664                           logputs (LOG_VERBOSE, _("\
2665 Remote file exists and could contain links to other resources -- retrieving.\n\n"));
2666                         }
2667                       else 
2668                         {
2669                           logprintf (LOG_VERBOSE, _("\
2670 Remote file exists but does not contain any link -- not retrieving.\n\n"));
2671                           ret = RETROK; /* RETRUNNEEDED is not for caller. */
2672                           goto exit;
2673                         }
2674                     }
2675                   else
2676                     {
2677                       if (*dt & TEXTHTML)
2678                         {
2679                           logprintf (LOG_VERBOSE, _("\
2680 Remote file exists and could contain further links,\n\
2681 but recursion is disabled -- not retrieving.\n\n"));
2682                         }
2683                       else 
2684                         {
2685                           logprintf (LOG_VERBOSE, _("\
2686 Remote file exists.\n\n"));
2687                         }
2688                       ret = RETROK; /* RETRUNNEEDED is not for caller. */
2689                       goto exit;
2690                     }
2691                 }
2692
2693               got_name = true;
2694               *dt &= ~HEAD_ONLY;
2695               count = 0;          /* the retrieve count for HEAD is reset */
2696               continue;
2697             } /* send_head_first */
2698         } /* !got_head */
2699           
2700       if ((tmr != (time_t) (-1))
2701           && ((hstat.len == hstat.contlen) ||
2702               ((hstat.res == 0) && (hstat.contlen == -1))))
2703         {
2704           /* #### This code repeats in http.c and ftp.c.  Move it to a
2705              function!  */
2706           const char *fl = NULL;
2707           if (opt.output_document)
2708             {
2709               if (output_stream_regular)
2710                 fl = opt.output_document;
2711             }
2712           else
2713             fl = hstat.local_file;
2714           if (fl)
2715             {
2716               time_t newtmr = -1;
2717               /* Reparse time header, in case it's changed. */
2718               if (time_came_from_head
2719                   && hstat.remote_time && hstat.remote_time[0])
2720                 {
2721                   newtmr = http_atotm (hstat.remote_time);
2722                   if (newtmr != -1)
2723                     tmr = newtmr;
2724                 }
2725               touch (fl, tmr);
2726             }
2727         }
2728       /* End of time-stamping section. */
2729
2730       tmrate = retr_rate (hstat.rd_size, hstat.dltime);
2731       total_download_time += hstat.dltime;
2732
2733       if (hstat.len == hstat.contlen)
2734         {
2735           if (*dt & RETROKF)
2736             {
2737               logprintf (LOG_VERBOSE,
2738                          _("%s (%s) - `%s' saved [%s/%s]\n\n"),
2739                          tms, tmrate, hstat.local_file,
2740                          number_to_static_string (hstat.len),
2741                          number_to_static_string (hstat.contlen));
2742               logprintf (LOG_NONVERBOSE,
2743                          "%s URL:%s [%s/%s] -> \"%s\" [%d]\n",
2744                          tms, u->url,
2745                          number_to_static_string (hstat.len),
2746                          number_to_static_string (hstat.contlen),
2747                          hstat.local_file, count);
2748             }
2749           ++opt.numurls;
2750           total_downloaded_bytes += hstat.len;
2751
2752           /* Remember that we downloaded the file for later ".orig" code. */
2753           if (*dt & ADDED_HTML_EXTENSION)
2754             downloaded_file(FILE_DOWNLOADED_AND_HTML_EXTENSION_ADDED, hstat.local_file);
2755           else
2756             downloaded_file(FILE_DOWNLOADED_NORMALLY, hstat.local_file);
2757
2758           ret = RETROK;
2759           goto exit;
2760         }
2761       else if (hstat.res == 0) /* No read error */
2762         {
2763           if (hstat.contlen == -1)  /* We don't know how much we were supposed
2764                                        to get, so assume we succeeded. */ 
2765             {
2766               if (*dt & RETROKF)
2767                 {
2768                   logprintf (LOG_VERBOSE,
2769                              _("%s (%s) - `%s' saved [%s]\n\n"),
2770                              tms, tmrate, hstat.local_file,
2771                              number_to_static_string (hstat.len));
2772                   logprintf (LOG_NONVERBOSE,
2773                              "%s URL:%s [%s] -> \"%s\" [%d]\n",
2774                              tms, u->url, number_to_static_string (hstat.len),
2775                              hstat.local_file, count);
2776                 }
2777               ++opt.numurls;
2778               total_downloaded_bytes += hstat.len;
2779
2780               /* Remember that we downloaded the file for later ".orig" code. */
2781               if (*dt & ADDED_HTML_EXTENSION)
2782                 downloaded_file(FILE_DOWNLOADED_AND_HTML_EXTENSION_ADDED, hstat.local_file);
2783               else
2784                 downloaded_file(FILE_DOWNLOADED_NORMALLY, hstat.local_file);
2785               
2786               ret = RETROK;
2787               goto exit;
2788             }
2789           else if (hstat.len < hstat.contlen) /* meaning we lost the
2790                                                  connection too soon */
2791             {
2792               logprintf (LOG_VERBOSE,
2793                          _("%s (%s) - Connection closed at byte %s. "),
2794                          tms, tmrate, number_to_static_string (hstat.len));
2795               printwhat (count, opt.ntry);
2796               continue;
2797             }
2798           else
2799             /* Getting here would mean reading more data than
2800                requested with content-length, which we never do.  */
2801             abort ();
2802         }
2803       else /* from now on hstat.res can only be -1 */
2804         {
2805           if (hstat.contlen == -1)
2806             {
2807               logprintf (LOG_VERBOSE,
2808                          _("%s (%s) - Read error at byte %s (%s)."),
2809                          tms, tmrate, number_to_static_string (hstat.len),
2810                          hstat.rderrmsg);
2811               printwhat (count, opt.ntry);
2812               continue;
2813             }
2814           else /* hstat.res == -1 and contlen is given */
2815             {
2816               logprintf (LOG_VERBOSE,
2817                          _("%s (%s) - Read error at byte %s/%s (%s). "),
2818                          tms, tmrate,
2819                          number_to_static_string (hstat.len),
2820                          number_to_static_string (hstat.contlen),
2821                          hstat.rderrmsg);
2822               printwhat (count, opt.ntry);
2823               continue;
2824             }
2825         }
2826       /* not reached */
2827     }
2828   while (!opt.ntry || (count < opt.ntry));
2829
2830 exit:
2831   if (ret == RETROK) 
2832     *local_file = xstrdup (hstat.local_file);
2833   free_hstat (&hstat);
2834   
2835   return ret;
2836 }
2837 \f
2838 /* Check whether the result of strptime() indicates success.
2839    strptime() returns the pointer to how far it got to in the string.
2840    The processing has been successful if the string is at `GMT' or
2841    `+X', or at the end of the string.
2842
2843    In extended regexp parlance, the function returns 1 if P matches
2844    "^ *(GMT|[+-][0-9]|$)", 0 otherwise.  P being NULL (which strptime
2845    can return) is considered a failure and 0 is returned.  */
2846 static bool
2847 check_end (const char *p)
2848 {
2849   if (!p)
2850     return false;
2851   while (c_isspace (*p))
2852     ++p;
2853   if (!*p
2854       || (p[0] == 'G' && p[1] == 'M' && p[2] == 'T')
2855       || ((p[0] == '+' || p[0] == '-') && c_isdigit (p[1])))
2856     return true;
2857   else
2858     return false;
2859 }
2860
2861 /* Convert the textual specification of time in TIME_STRING to the
2862    number of seconds since the Epoch.
2863
2864    TIME_STRING can be in any of the three formats RFC2616 allows the
2865    HTTP servers to emit -- RFC1123-date, RFC850-date or asctime-date,
2866    as well as the time format used in the Set-Cookie header.
2867    Timezones are ignored, and should be GMT.
2868
2869    Return the computed time_t representation, or -1 if the conversion
2870    fails.
2871
2872    This function uses strptime with various string formats for parsing
2873    TIME_STRING.  This results in a parser that is not as lenient in
2874    interpreting TIME_STRING as I would like it to be.  Being based on
2875    strptime, it always allows shortened months, one-digit days, etc.,
2876    but due to the multitude of formats in which time can be
2877    represented, an ideal HTTP time parser would be even more
2878    forgiving.  It should completely ignore things like week days and
2879    concentrate only on the various forms of representing years,
2880    months, days, hours, minutes, and seconds.  For example, it would
2881    be nice if it accepted ISO 8601 out of the box.
2882
2883    I've investigated free and PD code for this purpose, but none was
2884    usable.  getdate was big and unwieldy, and had potential copyright
2885    issues, or so I was informed.  Dr. Marcus Hennecke's atotm(),
2886    distributed with phttpd, is excellent, but we cannot use it because
2887    it is not assigned to the FSF.  So I stuck it with strptime.  */
2888
2889 time_t
2890 http_atotm (const char *time_string)
2891 {
2892   /* NOTE: Solaris strptime man page claims that %n and %t match white
2893      space, but that's not universally available.  Instead, we simply
2894      use ` ' to mean "skip all WS", which works under all strptime
2895      implementations I've tested.  */
2896
2897   static const char *time_formats[] = {
2898     "%a, %d %b %Y %T",          /* rfc1123: Thu, 29 Jan 1998 22:12:57 */
2899     "%A, %d-%b-%y %T",          /* rfc850:  Thursday, 29-Jan-98 22:12:57 */
2900     "%a %b %d %T %Y",           /* asctime: Thu Jan 29 22:12:57 1998 */
2901     "%a, %d-%b-%Y %T"           /* cookies: Thu, 29-Jan-1998 22:12:57
2902                                    (used in Set-Cookie, defined in the
2903                                    Netscape cookie specification.) */
2904   };
2905   const char *oldlocale;
2906   int i;
2907   time_t ret = (time_t) -1;
2908
2909   /* Solaris strptime fails to recognize English month names in
2910      non-English locales, which we work around by temporarily setting
2911      locale to C before invoking strptime.  */
2912   oldlocale = setlocale (LC_TIME, NULL);
2913   setlocale (LC_TIME, "C");
2914
2915   for (i = 0; i < countof (time_formats); i++)
2916     {
2917       struct tm t;
2918
2919       /* Some versions of strptime use the existing contents of struct
2920          tm to recalculate the date according to format.  Zero it out
2921          to prevent stack garbage from influencing strptime.  */
2922       xzero (t);
2923
2924       if (check_end (strptime (time_string, time_formats[i], &t)))
2925         {
2926           ret = timegm (&t);
2927           break;
2928         }
2929     }
2930
2931   /* Restore the previous locale. */
2932   setlocale (LC_TIME, oldlocale);
2933
2934   return ret;
2935 }
2936 \f
2937 /* Authorization support: We support three authorization schemes:
2938
2939    * `Basic' scheme, consisting of base64-ing USER:PASSWORD string;
2940
2941    * `Digest' scheme, added by Junio Hamano <junio@twinsun.com>,
2942    consisting of answering to the server's challenge with the proper
2943    MD5 digests.
2944
2945    * `NTLM' ("NT Lan Manager") scheme, based on code written by Daniel
2946    Stenberg for libcurl.  Like digest, NTLM is based on a
2947    challenge-response mechanism, but unlike digest, it is non-standard
2948    (authenticates TCP connections rather than requests), undocumented
2949    and Microsoft-specific.  */
2950
2951 /* Create the authentication header contents for the `Basic' scheme.
2952    This is done by encoding the string "USER:PASS" to base64 and
2953    prepending the string "Basic " in front of it.  */
2954
2955 static char *
2956 basic_authentication_encode (const char *user, const char *passwd)
2957 {
2958   char *t1, *t2;
2959   int len1 = strlen (user) + 1 + strlen (passwd);
2960
2961   t1 = (char *)alloca (len1 + 1);
2962   sprintf (t1, "%s:%s", user, passwd);
2963
2964   t2 = (char *)alloca (BASE64_LENGTH (len1) + 1);
2965   base64_encode (t1, len1, t2);
2966
2967   return concat_strings ("Basic ", t2, (char *) 0);
2968 }
2969
2970 #define SKIP_WS(x) do {                         \
2971   while (c_isspace (*(x)))                        \
2972     ++(x);                                      \
2973 } while (0)
2974
2975 #ifdef ENABLE_DIGEST
2976 /* Dump the hexadecimal representation of HASH to BUF.  HASH should be
2977    an array of 16 bytes containing the hash keys, and BUF should be a
2978    buffer of 33 writable characters (32 for hex digits plus one for
2979    zero termination).  */
2980 static void
2981 dump_hash (char *buf, const unsigned char *hash)
2982 {
2983   int i;
2984
2985   for (i = 0; i < MD5_HASHLEN; i++, hash++)
2986     {
2987       *buf++ = XNUM_TO_digit (*hash >> 4);
2988       *buf++ = XNUM_TO_digit (*hash & 0xf);
2989     }
2990   *buf = '\0';
2991 }
2992
2993 /* Take the line apart to find the challenge, and compose a digest
2994    authorization header.  See RFC2069 section 2.1.2.  */
2995 static char *
2996 digest_authentication_encode (const char *au, const char *user,
2997                               const char *passwd, const char *method,
2998                               const char *path)
2999 {
3000   static char *realm, *opaque, *nonce;
3001   static struct {
3002     const char *name;
3003     char **variable;
3004   } options[] = {
3005     { "realm", &realm },
3006     { "opaque", &opaque },
3007     { "nonce", &nonce }
3008   };
3009   char *res;
3010   param_token name, value;
3011
3012   realm = opaque = nonce = NULL;
3013
3014   au += 6;                      /* skip over `Digest' */
3015   while (extract_param (&au, &name, &value, ','))
3016     {
3017       int i;
3018       for (i = 0; i < countof (options); i++)
3019         if (name.e - name.b == strlen (options[i].name)
3020             && 0 == strncmp (name.b, options[i].name, name.e - name.b))
3021           {
3022             *options[i].variable = strdupdelim (value.b, value.e);
3023             break;
3024           }
3025     }
3026   if (!realm || !nonce || !user || !passwd || !path || !method)
3027     {
3028       xfree_null (realm);
3029       xfree_null (opaque);
3030       xfree_null (nonce);
3031       return NULL;
3032     }
3033
3034   /* Calculate the digest value.  */
3035   {
3036     ALLOCA_MD5_CONTEXT (ctx);
3037     unsigned char hash[MD5_HASHLEN];
3038     char a1buf[MD5_HASHLEN * 2 + 1], a2buf[MD5_HASHLEN * 2 + 1];
3039     char response_digest[MD5_HASHLEN * 2 + 1];
3040
3041     /* A1BUF = H(user ":" realm ":" password) */
3042     gen_md5_init (ctx);
3043     gen_md5_update ((unsigned char *)user, strlen (user), ctx);
3044     gen_md5_update ((unsigned char *)":", 1, ctx);
3045     gen_md5_update ((unsigned char *)realm, strlen (realm), ctx);
3046     gen_md5_update ((unsigned char *)":", 1, ctx);
3047     gen_md5_update ((unsigned char *)passwd, strlen (passwd), ctx);
3048     gen_md5_finish (ctx, hash);
3049     dump_hash (a1buf, hash);
3050
3051     /* A2BUF = H(method ":" path) */
3052     gen_md5_init (ctx);
3053     gen_md5_update ((unsigned char *)method, strlen (method), ctx);
3054     gen_md5_update ((unsigned char *)":", 1, ctx);
3055     gen_md5_update ((unsigned char *)path, strlen (path), ctx);
3056     gen_md5_finish (ctx, hash);
3057     dump_hash (a2buf, hash);
3058
3059     /* RESPONSE_DIGEST = H(A1BUF ":" nonce ":" A2BUF) */
3060     gen_md5_init (ctx);
3061     gen_md5_update ((unsigned char *)a1buf, MD5_HASHLEN * 2, ctx);
3062     gen_md5_update ((unsigned char *)":", 1, ctx);
3063     gen_md5_update ((unsigned char *)nonce, strlen (nonce), ctx);
3064     gen_md5_update ((unsigned char *)":", 1, ctx);
3065     gen_md5_update ((unsigned char *)a2buf, MD5_HASHLEN * 2, ctx);
3066     gen_md5_finish (ctx, hash);
3067     dump_hash (response_digest, hash);
3068
3069     res = xmalloc (strlen (user)
3070                    + strlen (user)
3071                    + strlen (realm)
3072                    + strlen (nonce)
3073                    + strlen (path)
3074                    + 2 * MD5_HASHLEN /*strlen (response_digest)*/
3075                    + (opaque ? strlen (opaque) : 0)
3076                    + 128);
3077     sprintf (res, "Digest \
3078 username=\"%s\", realm=\"%s\", nonce=\"%s\", uri=\"%s\", response=\"%s\"",
3079              user, realm, nonce, path, response_digest);
3080     if (opaque)
3081       {
3082         char *p = res + strlen (res);
3083         strcat (p, ", opaque=\"");
3084         strcat (p, opaque);
3085         strcat (p, "\"");
3086       }
3087   }
3088   return res;
3089 }
3090 #endif /* ENABLE_DIGEST */
3091
3092 /* Computing the size of a string literal must take into account that
3093    value returned by sizeof includes the terminating \0.  */
3094 #define STRSIZE(literal) (sizeof (literal) - 1)
3095
3096 /* Whether chars in [b, e) begin with the literal string provided as
3097    first argument and are followed by whitespace or terminating \0.
3098    The comparison is case-insensitive.  */
3099 #define STARTS(literal, b, e)                           \
3100   ((e) - (b) >= STRSIZE (literal)                       \
3101    && 0 == strncasecmp (b, literal, STRSIZE (literal))  \
3102    && ((e) - (b) == STRSIZE (literal)                   \
3103        || c_isspace (b[STRSIZE (literal)])))
3104
3105 static bool
3106 known_authentication_scheme_p (const char *hdrbeg, const char *hdrend)
3107 {
3108   return STARTS ("Basic", hdrbeg, hdrend)
3109 #ifdef ENABLE_DIGEST
3110     || STARTS ("Digest", hdrbeg, hdrend)
3111 #endif
3112 #ifdef ENABLE_NTLM
3113     || STARTS ("NTLM", hdrbeg, hdrend)
3114 #endif
3115     ;
3116 }
3117
3118 #undef STARTS
3119
3120 /* Create the HTTP authorization request header.  When the
3121    `WWW-Authenticate' response header is seen, according to the
3122    authorization scheme specified in that header (`Basic' and `Digest'
3123    are supported by the current implementation), produce an
3124    appropriate HTTP authorization request header.  */
3125 static char *
3126 create_authorization_line (const char *au, const char *user,
3127                            const char *passwd, const char *method,
3128                            const char *path, bool *finished)
3129 {
3130   /* We are called only with known schemes, so we can dispatch on the
3131      first letter. */
3132   switch (c_toupper (*au))
3133     {
3134     case 'B':                   /* Basic */
3135       *finished = true;
3136       return basic_authentication_encode (user, passwd);
3137 #ifdef ENABLE_DIGEST
3138     case 'D':                   /* Digest */
3139       *finished = true;
3140       return digest_authentication_encode (au, user, passwd, method, path);
3141 #endif
3142 #ifdef ENABLE_NTLM
3143     case 'N':                   /* NTLM */
3144       if (!ntlm_input (&pconn.ntlm, au))
3145         {
3146           *finished = true;
3147           return NULL;
3148         }
3149       return ntlm_output (&pconn.ntlm, user, passwd, finished);
3150 #endif
3151     default:
3152       /* We shouldn't get here -- this function should be only called
3153          with values approved by known_authentication_scheme_p.  */
3154       abort ();
3155     }
3156 }
3157 \f
3158 static void
3159 load_cookies (void)
3160 {
3161   if (!wget_cookie_jar)
3162     wget_cookie_jar = cookie_jar_new ();
3163   if (opt.cookies_input && !cookies_loaded_p)
3164     {
3165       cookie_jar_load (wget_cookie_jar, opt.cookies_input);
3166       cookies_loaded_p = true;
3167     }
3168 }
3169
3170 void
3171 save_cookies (void)
3172 {
3173   if (wget_cookie_jar)
3174     cookie_jar_save (wget_cookie_jar, opt.cookies_output);
3175 }
3176
3177 void
3178 http_cleanup (void)
3179 {
3180   xfree_null (pconn.host);
3181   if (wget_cookie_jar)
3182     cookie_jar_delete (wget_cookie_jar);
3183 }
3184
3185
3186 #ifdef TESTING
3187
3188 const char *
3189 test_parse_content_disposition()
3190 {
3191   int i;
3192   struct {
3193     char *hdrval;    
3194     char *opt_dir_prefix;
3195     char *filename;
3196     bool result;
3197   } test_array[] = {
3198     { "filename=\"file.ext\"", NULL, "file.ext", true },
3199     { "filename=\"file.ext\"", "somedir", "somedir/file.ext", true },
3200     { "attachment; filename=\"file.ext\"", NULL, "file.ext", true },
3201     { "attachment; filename=\"file.ext\"", "somedir", "somedir/file.ext", true },
3202     { "attachment; filename=\"file.ext\"; dummy", NULL, "file.ext", true },
3203     { "attachment; filename=\"file.ext\"; dummy", "somedir", "somedir/file.ext", true },
3204     { "attachment", NULL, NULL, false },
3205     { "attachment", "somedir", NULL, false },
3206   };
3207   
3208   for (i = 0; i < sizeof(test_array)/sizeof(test_array[0]); ++i) 
3209     {
3210       char *filename;
3211       bool res;
3212
3213       opt.dir_prefix = test_array[i].opt_dir_prefix;
3214       res = parse_content_disposition (test_array[i].hdrval, &filename);
3215
3216       mu_assert ("test_parse_content_disposition: wrong result", 
3217                  res == test_array[i].result
3218                  && (res == false 
3219                      || 0 == strcmp (test_array[i].filename, filename)));
3220     }
3221
3222   return NULL;
3223 }
3224
3225 #endif /* TESTING */
3226
3227 /*
3228  * vim: et sts=2 sw=2 cino+={s
3229  */
3230