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