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