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