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