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