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