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