]> sjero.net Git - wget/blob - src/http.c
[svn] Parse Content-Disposition better. Implement memrchr where missing.
[wget] / src / http.c
1 /* HTTP support.
2    Copyright (C) 1996-2005 Free Software Foundation, Inc.
3
4 This file is part of GNU Wget.
5
6 GNU Wget is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9  (at your option) any later version.
10
11 GNU Wget is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with Wget; if not, write to the Free Software 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, 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 static bool
859 extract_param_value_delim (const char *begin, const char *end, 
860                            const char *param_name, char **param_value)
861 {
862   const char *p; 
863   int len;  
864
865   assert (begin);
866   assert (end);
867   assert (param_name);
868   assert (param_value);
869
870   len = strlen (param_name);
871
872   /* skip initial whitespaces */
873   p = begin;
874   while (*p && ISSPACE (*p) && p < end) ++p;
875   
876   if (end - p > len
877       && 0 == strncasecmp (p, param_name, len))
878     {
879       const char *e;
880
881       /* skip white spaces, equal sign and inital quote */
882       p += len;
883       while (*p && (ISSPACE (*p) || *p == '\"' || *p == '=') && p < end) ++p;
884
885       /* find last quote */
886       e = p;
887       while (*e && *e != '\"' && e < end) ++e;
888       
889       *param_value = strdupdelim (p, e);
890       
891       return true;
892     }
893
894   return false;
895 }
896
897 typedef struct {
898   /* A token consists of characters in the [b, e) range. */
899   const char *b, *e;
900 } param_token;
901
902 /* Extract a parameter from the HTTP header at *SOURCE and advance
903    *SOURCE to the next parameter.  Return false when there are no more
904    parameters to extract.  The name of the parameter is returned in
905    NAME, and the value in VALUE.  If the parameter has no value, the
906    token's value is zeroed out.
907
908    For example, if *SOURCE points to the string "attachment;
909    filename=\"foo bar\"", the first call to this function will return
910    the token named "attachment" and no value, and the second call will
911    return the token named "filename" and value "foo bar".  The third
912    call will return false, indicating no more valid tokens.  */
913
914 static bool
915 extract_param (const char **source, param_token *name, param_token *value)
916 {
917   const char *p = *source;
918
919   while (ISSPACE (*p)) ++p;
920   if (!*p)
921     return false;               /* nothing more to extract */
922
923   /* Extract name. */
924   name->b = p;
925   while (*p && !ISSPACE (*p) && *p != '=' && *p != ';') ++p;
926   name->e = p;
927   while (ISSPACE (*p)) ++p;
928   if (*p == ';' || !*p)         /* no value */
929     {
930       xzero (*value);
931       if (*p == ';') ++p;
932       *source = p;
933       return true;
934     }
935   if (*p != '=')
936     return false;               /* error */
937
938   /* *p is '=', extract value */
939   ++p;
940   while (ISSPACE (*p)) ++p;
941   if (*p == '"')                /* quoted */
942     {
943       value->b = ++p;
944       while (*p && *p != '"') ++p;
945       if (!*p)
946         return false;
947       value->e = p++;
948       /* Currently at closing quote; find the end of param. */
949       while (ISSPACE (*p)) ++p;
950       while (*p && *p != ';') ++p;
951       if (*p == ';')
952         ++p;
953       else if (*p)
954         /* garbage after closed quote, e.g. foo="bar"baz */
955         return false;
956     }
957   else                          /* unquoted */
958     {
959       value->b = p;
960       while (*p && *p != ';') ++p;
961       value->e = p;
962       while (value->e != value->b && ISSPACE (value->e[-1]))
963         --value->e;
964       if (*p == ';') ++p;
965     }
966   *source = p;
967   return true;
968 }
969
970 #undef MAX
971 #define MAX(p, q) ((p) > (q) ? (p) : (q))
972
973 static bool
974 parse_content_disposition (const char *hdr, char **filename)
975 {
976   param_token name, value;
977   while (extract_param (&hdr, &name, &value))
978     if (BOUNDED_EQUAL_NO_CASE (name.b, name.e, "filename") && value.b != NULL)
979       {
980         /* Make the file name begin at the last slash or backslash. */
981         const char *last_slash = memrchr (value.b, '/', value.e - value.b);
982         const char *last_bs = memrchr (value.b, '\\', value.e - value.b);
983         if (last_slash && last_bs)
984           value.b = 1 + MAX (last_slash, last_bs);
985         else if (last_slash || last_bs)
986           value.b = 1 + (last_slash ? last_slash : last_bs);
987         if (value.b == value.e)
988           continue;
989         *filename = strdupdelim (value.b, value.e);
990         return true;
991       }
992   return false;
993 }
994 \f
995 /* Persistent connections.  Currently, we cache the most recently used
996    connection as persistent, provided that the HTTP server agrees to
997    make it such.  The persistence data is stored in the variables
998    below.  Ideally, it should be possible to cache an arbitrary fixed
999    number of these connections.  */
1000
1001 /* Whether a persistent connection is active. */
1002 static bool pconn_active;
1003
1004 static struct {
1005   /* The socket of the connection.  */
1006   int socket;
1007
1008   /* Host and port of the currently active persistent connection. */
1009   char *host;
1010   int port;
1011
1012   /* Whether a ssl handshake has occoured on this connection.  */
1013   bool ssl;
1014
1015   /* Whether the connection was authorized.  This is only done by
1016      NTLM, which authorizes *connections* rather than individual
1017      requests.  (That practice is peculiar for HTTP, but it is a
1018      useful optimization.)  */
1019   bool authorized;
1020
1021 #ifdef ENABLE_NTLM
1022   /* NTLM data of the current connection.  */
1023   struct ntlmdata ntlm;
1024 #endif
1025 } pconn;
1026
1027 /* Mark the persistent connection as invalid and free the resources it
1028    uses.  This is used by the CLOSE_* macros after they forcefully
1029    close a registered persistent connection.  */
1030
1031 static void
1032 invalidate_persistent (void)
1033 {
1034   DEBUGP (("Disabling further reuse of socket %d.\n", pconn.socket));
1035   pconn_active = false;
1036   fd_close (pconn.socket);
1037   xfree (pconn.host);
1038   xzero (pconn);
1039 }
1040
1041 /* Register FD, which should be a TCP/IP connection to HOST:PORT, as
1042    persistent.  This will enable someone to use the same connection
1043    later.  In the context of HTTP, this must be called only AFTER the
1044    response has been received and the server has promised that the
1045    connection will remain alive.
1046
1047    If a previous connection was persistent, it is closed. */
1048
1049 static void
1050 register_persistent (const char *host, int port, int fd, bool ssl)
1051 {
1052   if (pconn_active)
1053     {
1054       if (pconn.socket == fd)
1055         {
1056           /* The connection FD is already registered. */
1057           return;
1058         }
1059       else
1060         {
1061           /* The old persistent connection is still active; close it
1062              first.  This situation arises whenever a persistent
1063              connection exists, but we then connect to a different
1064              host, and try to register a persistent connection to that
1065              one.  */
1066           invalidate_persistent ();
1067         }
1068     }
1069
1070   pconn_active = true;
1071   pconn.socket = fd;
1072   pconn.host = xstrdup (host);
1073   pconn.port = port;
1074   pconn.ssl = ssl;
1075   pconn.authorized = false;
1076
1077   DEBUGP (("Registered socket %d for persistent reuse.\n", fd));
1078 }
1079
1080 /* Return true if a persistent connection is available for connecting
1081    to HOST:PORT.  */
1082
1083 static bool
1084 persistent_available_p (const char *host, int port, bool ssl,
1085                         bool *host_lookup_failed)
1086 {
1087   /* First, check whether a persistent connection is active at all.  */
1088   if (!pconn_active)
1089     return false;
1090
1091   /* If we want SSL and the last connection wasn't or vice versa,
1092      don't use it.  Checking for host and port is not enough because
1093      HTTP and HTTPS can apparently coexist on the same port.  */
1094   if (ssl != pconn.ssl)
1095     return false;
1096
1097   /* If we're not connecting to the same port, we're not interested. */
1098   if (port != pconn.port)
1099     return false;
1100
1101   /* If the host is the same, we're in business.  If not, there is
1102      still hope -- read below.  */
1103   if (0 != strcasecmp (host, pconn.host))
1104     {
1105       /* Check if pconn.socket is talking to HOST under another name.
1106          This happens often when both sites are virtual hosts
1107          distinguished only by name and served by the same network
1108          interface, and hence the same web server (possibly set up by
1109          the ISP and serving many different web sites).  This
1110          admittedly unconventional optimization does not contradict
1111          HTTP and works well with popular server software.  */
1112
1113       bool found;
1114       ip_address ip;
1115       struct address_list *al;
1116
1117       if (ssl)
1118         /* Don't try to talk to two different SSL sites over the same
1119            secure connection!  (Besides, it's not clear that
1120            name-based virtual hosting is even possible with SSL.)  */
1121         return false;
1122
1123       /* If pconn.socket's peer is one of the IP addresses HOST
1124          resolves to, pconn.socket is for all intents and purposes
1125          already talking to HOST.  */
1126
1127       if (!socket_ip_address (pconn.socket, &ip, ENDPOINT_PEER))
1128         {
1129           /* Can't get the peer's address -- something must be very
1130              wrong with the connection.  */
1131           invalidate_persistent ();
1132           return false;
1133         }
1134       al = lookup_host (host, 0);
1135       if (!al)
1136         {
1137           *host_lookup_failed = true;
1138           return false;
1139         }
1140
1141       found = address_list_contains (al, &ip);
1142       address_list_release (al);
1143
1144       if (!found)
1145         return false;
1146
1147       /* The persistent connection's peer address was found among the
1148          addresses HOST resolved to; therefore, pconn.sock is in fact
1149          already talking to HOST -- no need to reconnect.  */
1150     }
1151
1152   /* Finally, check whether the connection is still open.  This is
1153      important because most servers implement liberal (short) timeout
1154      on persistent connections.  Wget can of course always reconnect
1155      if the connection doesn't work out, but it's nicer to know in
1156      advance.  This test is a logical followup of the first test, but
1157      is "expensive" and therefore placed at the end of the list.
1158
1159      (Current implementation of test_socket_open has a nice side
1160      effect that it treats sockets with pending data as "closed".
1161      This is exactly what we want: if a broken server sends message
1162      body in response to HEAD, or if it sends more than conent-length
1163      data, we won't reuse the corrupted connection.)  */
1164
1165   if (!test_socket_open (pconn.socket))
1166     {
1167       /* Oops, the socket is no longer open.  Now that we know that,
1168          let's invalidate the persistent connection before returning
1169          0.  */
1170       invalidate_persistent ();
1171       return false;
1172     }
1173
1174   return true;
1175 }
1176
1177 /* The idea behind these two CLOSE macros is to distinguish between
1178    two cases: one when the job we've been doing is finished, and we
1179    want to close the connection and leave, and two when something is
1180    seriously wrong and we're closing the connection as part of
1181    cleanup.
1182
1183    In case of keep_alive, CLOSE_FINISH should leave the connection
1184    open, while CLOSE_INVALIDATE should still close it.
1185
1186    Note that the semantics of the flag `keep_alive' is "this
1187    connection *will* be reused (the server has promised not to close
1188    the connection once we're done)", while the semantics of
1189    `pc_active_p && (fd) == pc_last_fd' is "we're *now* using an
1190    active, registered connection".  */
1191
1192 #define CLOSE_FINISH(fd) do {                   \
1193   if (!keep_alive)                              \
1194     {                                           \
1195       if (pconn_active && (fd) == pconn.socket) \
1196         invalidate_persistent ();               \
1197       else                                      \
1198         {                                       \
1199           fd_close (fd);                        \
1200           fd = -1;                              \
1201         }                                       \
1202     }                                           \
1203 } while (0)
1204
1205 #define CLOSE_INVALIDATE(fd) do {               \
1206   if (pconn_active && (fd) == pconn.socket)     \
1207     invalidate_persistent ();                   \
1208   else                                          \
1209     fd_close (fd);                              \
1210   fd = -1;                                      \
1211 } while (0)
1212 \f
1213 struct http_stat
1214 {
1215   wgint len;                    /* received length */
1216   wgint contlen;                /* expected length */
1217   wgint restval;                /* the restart value */
1218   int res;                      /* the result of last read */
1219   char *rderrmsg;               /* error message from read error */
1220   char *newloc;                 /* new location (redirection) */
1221   char *remote_time;            /* remote time-stamp string */
1222   char *error;                  /* textual HTTP error */
1223   int statcode;                 /* status code */
1224   wgint rd_size;                /* amount of data read from socket */
1225   double dltime;                /* time it took to download the data */
1226   const char *referer;          /* value of the referer header. */
1227   char *local_file;             /* local file name. */
1228   bool timestamp_checked;       /* true if pre-download time-stamping checks 
1229                                  * have already been performed */
1230   char *orig_file_name;         /* name of file to compare for time-stamping
1231                                  * (might be != local_file if -K is set) */
1232   wgint orig_file_size;         /* size of file to compare for time-stamping */
1233   time_t orig_file_tstamp;      /* time-stamp of file to compare for 
1234                                  * time-stamping */
1235 };
1236
1237 static void
1238 free_hstat (struct http_stat *hs)
1239 {
1240   xfree_null (hs->newloc);
1241   xfree_null (hs->remote_time);
1242   xfree_null (hs->error);
1243   xfree_null (hs->rderrmsg);
1244   xfree_null (hs->local_file);
1245   xfree_null (hs->orig_file_name);
1246
1247   /* Guard against being called twice. */
1248   hs->newloc = NULL;
1249   hs->remote_time = NULL;
1250   hs->error = NULL;
1251 }
1252
1253 static char *create_authorization_line (const char *, const char *,
1254                                         const char *, const char *,
1255                                         const char *, bool *);
1256 static char *basic_authentication_encode (const char *, const char *);
1257 static bool known_authentication_scheme_p (const char *, const char *);
1258 static void load_cookies (void);
1259
1260 #define BEGINS_WITH(line, string_constant)                               \
1261   (!strncasecmp (line, string_constant, sizeof (string_constant) - 1)    \
1262    && (ISSPACE (line[sizeof (string_constant) - 1])                      \
1263        || !line[sizeof (string_constant) - 1]))
1264
1265 #define SET_USER_AGENT(req) do {                                         \
1266   if (!opt.useragent)                                                    \
1267     request_set_header (req, "User-Agent",                               \
1268                         aprintf ("Wget/%s", version_string), rel_value); \
1269   else if (*opt.useragent)                                               \
1270     request_set_header (req, "User-Agent", opt.useragent, rel_none);     \
1271 } while (0)
1272
1273 /* The flags that allow clobbering the file (opening with "wb").
1274    Defined here to avoid repetition later.  #### This will require
1275    rework.  */
1276 #define ALLOW_CLOBBER (opt.noclobber || opt.always_rest || opt.timestamping \
1277                        || opt.dirstruct || opt.output_document)
1278
1279 /* Retrieve a document through HTTP protocol.  It recognizes status
1280    code, and correctly handles redirections.  It closes the network
1281    socket.  If it receives an error from the functions below it, it
1282    will print it if there is enough information to do so (almost
1283    always), returning the error to the caller (i.e. http_loop).
1284
1285    Various HTTP parameters are stored to hs.
1286
1287    If PROXY is non-NULL, the connection will be made to the proxy
1288    server, and u->url will be requested.  */
1289 static uerr_t
1290 gethttp (struct url *u, struct http_stat *hs, int *dt, struct url *proxy)
1291 {
1292   struct request *req;
1293
1294   char *type;
1295   char *user, *passwd;
1296   char *proxyauth;
1297   int statcode;
1298   int write_error;
1299   wgint contlen, contrange;
1300   struct url *conn;
1301   FILE *fp;
1302
1303   int sock = -1;
1304   int flags;
1305
1306   /* Set to 1 when the authorization has failed permanently and should
1307      not be tried again. */
1308   bool auth_finished = false;
1309
1310   /* Whether NTLM authentication is used for this request. */
1311   bool ntlm_seen = false;
1312
1313   /* Whether our connection to the remote host is through SSL.  */
1314   bool using_ssl = false;
1315
1316   /* Whether a HEAD request will be issued (as opposed to GET or
1317      POST). */
1318   bool head_only = !!(*dt & HEAD_ONLY);
1319
1320   char *head;
1321   struct response *resp;
1322   char hdrval[256];
1323   char *message;
1324
1325   /* Whether this connection will be kept alive after the HTTP request
1326      is done. */
1327   bool keep_alive;
1328
1329   /* Whether keep-alive should be inhibited.
1330
1331      RFC 2068 requests that 1.0 clients not send keep-alive requests
1332      to proxies.  This is because many 1.0 proxies do not interpret
1333      the Connection header and transfer it to the remote server,
1334      causing it to not close the connection and leave both the proxy
1335      and the client hanging.  */
1336   bool inhibit_keep_alive =
1337     !opt.http_keep_alive || opt.ignore_length || proxy != NULL;
1338
1339   /* Headers sent when using POST. */
1340   wgint post_data_size = 0;
1341
1342   bool host_lookup_failed = false;
1343
1344 #ifdef HAVE_SSL
1345   if (u->scheme == SCHEME_HTTPS)
1346     {
1347       /* Initialize the SSL context.  After this has once been done,
1348          it becomes a no-op.  */
1349       if (!ssl_init ())
1350         {
1351           scheme_disable (SCHEME_HTTPS);
1352           logprintf (LOG_NOTQUIET,
1353                      _("Disabling SSL due to encountered errors.\n"));
1354           return SSLINITFAILED;
1355         }
1356     }
1357 #endif /* HAVE_SSL */
1358
1359   /* Initialize certain elements of struct http_stat.  */
1360   hs->len = 0;
1361   hs->contlen = -1;
1362   hs->res = -1;
1363   hs->rderrmsg = NULL;
1364   hs->newloc = NULL;
1365   hs->remote_time = NULL;
1366   hs->error = NULL;
1367
1368   conn = u;
1369
1370   /* Prepare the request to send. */
1371
1372   req = request_new ();
1373   {
1374     char *meth_arg;
1375     const char *meth = "GET";
1376     if (head_only)
1377       meth = "HEAD";
1378     else if (opt.post_file_name || opt.post_data)
1379       meth = "POST";
1380     /* Use the full path, i.e. one that includes the leading slash and
1381        the query string.  E.g. if u->path is "foo/bar" and u->query is
1382        "param=value", full_path will be "/foo/bar?param=value".  */
1383     if (proxy
1384 #ifdef HAVE_SSL
1385         /* When using SSL over proxy, CONNECT establishes a direct
1386            connection to the HTTPS server.  Therefore use the same
1387            argument as when talking to the server directly. */
1388         && u->scheme != SCHEME_HTTPS
1389 #endif
1390         )
1391       meth_arg = xstrdup (u->url);
1392     else
1393       meth_arg = url_full_path (u);
1394     request_set_method (req, meth, meth_arg);
1395   }
1396
1397   request_set_header (req, "Referer", (char *) hs->referer, rel_none);
1398   if (*dt & SEND_NOCACHE)
1399     request_set_header (req, "Pragma", "no-cache", rel_none);
1400   if (hs->restval)
1401     request_set_header (req, "Range",
1402                         aprintf ("bytes=%s-",
1403                                  number_to_static_string (hs->restval)),
1404                         rel_value);
1405   SET_USER_AGENT (req);
1406   request_set_header (req, "Accept", "*/*", rel_none);
1407
1408   /* Find the username and password for authentication. */
1409   user = u->user;
1410   passwd = u->passwd;
1411   search_netrc (u->host, (const char **)&user, (const char **)&passwd, 0);
1412   user = user ? user : (opt.http_user ? opt.http_user : opt.user);
1413   passwd = passwd ? passwd : (opt.http_passwd ? opt.http_passwd : opt.passwd);
1414
1415   if (user && passwd)
1416     {
1417       /* We have the username and the password, but haven't tried
1418          any authorization yet.  Let's see if the "Basic" method
1419          works.  If not, we'll come back here and construct a
1420          proper authorization method with the right challenges.
1421
1422          If we didn't employ this kind of logic, every URL that
1423          requires authorization would have to be processed twice,
1424          which is very suboptimal and generates a bunch of false
1425          "unauthorized" errors in the server log.
1426
1427          #### But this logic also has a serious problem when used
1428          with stronger authentications: we *first* transmit the
1429          username and the password in clear text, and *then* attempt a
1430          stronger authentication scheme.  That cannot be right!  We
1431          are only fortunate that almost everyone still uses the
1432          `Basic' scheme anyway.
1433
1434          There should be an option to prevent this from happening, for
1435          those who use strong authentication schemes and value their
1436          passwords.  */
1437       request_set_header (req, "Authorization",
1438                           basic_authentication_encode (user, passwd),
1439                           rel_value);
1440     }
1441
1442   proxyauth = NULL;
1443   if (proxy)
1444     {
1445       char *proxy_user, *proxy_passwd;
1446       /* For normal username and password, URL components override
1447          command-line/wgetrc parameters.  With proxy
1448          authentication, it's the reverse, because proxy URLs are
1449          normally the "permanent" ones, so command-line args
1450          should take precedence.  */
1451       if (opt.proxy_user && opt.proxy_passwd)
1452         {
1453           proxy_user = opt.proxy_user;
1454           proxy_passwd = opt.proxy_passwd;
1455         }
1456       else
1457         {
1458           proxy_user = proxy->user;
1459           proxy_passwd = proxy->passwd;
1460         }
1461       /* #### This does not appear right.  Can't the proxy request,
1462          say, `Digest' authentication?  */
1463       if (proxy_user && proxy_passwd)
1464         proxyauth = basic_authentication_encode (proxy_user, proxy_passwd);
1465
1466       /* If we're using a proxy, we will be connecting to the proxy
1467          server.  */
1468       conn = proxy;
1469
1470       /* Proxy authorization over SSL is handled below. */
1471 #ifdef HAVE_SSL
1472       if (u->scheme != SCHEME_HTTPS)
1473 #endif
1474         request_set_header (req, "Proxy-Authorization", proxyauth, rel_value);
1475     }
1476
1477   /* Generate the Host header, HOST:PORT.  Take into account that:
1478
1479      - Broken server-side software often doesn't recognize the PORT
1480        argument, so we must generate "Host: www.server.com" instead of
1481        "Host: www.server.com:80" (and likewise for https port).
1482
1483      - IPv6 addresses contain ":", so "Host: 3ffe:8100:200:2::2:1234"
1484        becomes ambiguous and needs to be rewritten as "Host:
1485        [3ffe:8100:200:2::2]:1234".  */
1486   {
1487     /* Formats arranged for hfmt[add_port][add_squares].  */
1488     static const char *hfmt[][2] = {
1489       { "%s", "[%s]" }, { "%s:%d", "[%s]:%d" }
1490     };
1491     int add_port = u->port != scheme_default_port (u->scheme);
1492     int add_squares = strchr (u->host, ':') != NULL;
1493     request_set_header (req, "Host",
1494                         aprintf (hfmt[add_port][add_squares], u->host, u->port),
1495                         rel_value);
1496   }
1497
1498   if (!inhibit_keep_alive)
1499     request_set_header (req, "Connection", "Keep-Alive", rel_none);
1500
1501   if (opt.cookies)
1502     request_set_header (req, "Cookie",
1503                         cookie_header (wget_cookie_jar,
1504                                        u->host, u->port, u->path,
1505 #ifdef HAVE_SSL
1506                                        u->scheme == SCHEME_HTTPS
1507 #else
1508                                        0
1509 #endif
1510                                        ),
1511                         rel_value);
1512
1513   if (opt.post_data || opt.post_file_name)
1514     {
1515       request_set_header (req, "Content-Type",
1516                           "application/x-www-form-urlencoded", rel_none);
1517       if (opt.post_data)
1518         post_data_size = strlen (opt.post_data);
1519       else
1520         {
1521           post_data_size = file_size (opt.post_file_name);
1522           if (post_data_size == -1)
1523             {
1524               logprintf (LOG_NOTQUIET, _("POST data file `%s' missing: %s\n"),
1525                          opt.post_file_name, strerror (errno));
1526               post_data_size = 0;
1527             }
1528         }
1529       request_set_header (req, "Content-Length",
1530                           xstrdup (number_to_static_string (post_data_size)),
1531                           rel_value);
1532     }
1533
1534   /* Add the user headers. */
1535   if (opt.user_headers)
1536     {
1537       int i;
1538       for (i = 0; opt.user_headers[i]; i++)
1539         request_set_user_header (req, opt.user_headers[i]);
1540     }
1541
1542  retry_with_auth:
1543   /* We need to come back here when the initial attempt to retrieve
1544      without authorization header fails.  (Expected to happen at least
1545      for the Digest authorization scheme.)  */
1546
1547   keep_alive = false;
1548
1549   /* Establish the connection.  */
1550
1551   if (!inhibit_keep_alive)
1552     {
1553       /* Look for a persistent connection to target host, unless a
1554          proxy is used.  The exception is when SSL is in use, in which
1555          case the proxy is nothing but a passthrough to the target
1556          host, registered as a connection to the latter.  */
1557       struct url *relevant = conn;
1558 #ifdef HAVE_SSL
1559       if (u->scheme == SCHEME_HTTPS)
1560         relevant = u;
1561 #endif
1562
1563       if (persistent_available_p (relevant->host, relevant->port,
1564 #ifdef HAVE_SSL
1565                                   relevant->scheme == SCHEME_HTTPS,
1566 #else
1567                                   0,
1568 #endif
1569                                   &host_lookup_failed))
1570         {
1571           sock = pconn.socket;
1572           using_ssl = pconn.ssl;
1573           logprintf (LOG_VERBOSE, _("Reusing existing connection to %s:%d.\n"),
1574                      escnonprint (pconn.host), pconn.port);
1575           DEBUGP (("Reusing fd %d.\n", sock));
1576           if (pconn.authorized)
1577             /* If the connection is already authorized, the "Basic"
1578                authorization added by code above is unnecessary and
1579                only hurts us.  */
1580             request_remove_header (req, "Authorization");
1581         }
1582     }
1583
1584   if (sock < 0)
1585     {
1586       /* In its current implementation, persistent_available_p will
1587          look up conn->host in some cases.  If that lookup failed, we
1588          don't need to bother with connect_to_host.  */
1589       if (host_lookup_failed)
1590         {
1591           request_free (req);
1592           return HOSTERR;
1593         }
1594
1595       sock = connect_to_host (conn->host, conn->port);
1596       if (sock == E_HOST)
1597         {
1598           request_free (req);
1599           return HOSTERR;
1600         }
1601       else if (sock < 0)
1602         {
1603           request_free (req);
1604           return (retryable_socket_connect_error (errno)
1605                   ? CONERROR : CONIMPOSSIBLE);
1606         }
1607
1608 #ifdef HAVE_SSL
1609       if (proxy && u->scheme == SCHEME_HTTPS)
1610         {
1611           /* When requesting SSL URLs through proxies, use the
1612              CONNECT method to request passthrough.  */
1613           struct request *connreq = request_new ();
1614           request_set_method (connreq, "CONNECT",
1615                               aprintf ("%s:%d", u->host, u->port));
1616           SET_USER_AGENT (connreq);
1617           if (proxyauth)
1618             {
1619               request_set_header (connreq, "Proxy-Authorization",
1620                                   proxyauth, rel_value);
1621               /* Now that PROXYAUTH is part of the CONNECT request,
1622                  zero it out so we don't send proxy authorization with
1623                  the regular request below.  */
1624               proxyauth = NULL;
1625             }
1626           /* Examples in rfc2817 use the Host header in CONNECT
1627              requests.  I don't see how that gains anything, given
1628              that the contents of Host would be exactly the same as
1629              the contents of CONNECT.  */
1630
1631           write_error = request_send (connreq, sock);
1632           request_free (connreq);
1633           if (write_error < 0)
1634             {
1635               CLOSE_INVALIDATE (sock);
1636               return WRITEFAILED;
1637             }
1638
1639           head = read_http_response_head (sock);
1640           if (!head)
1641             {
1642               logprintf (LOG_VERBOSE, _("Failed reading proxy response: %s\n"),
1643                          fd_errstr (sock));
1644               CLOSE_INVALIDATE (sock);
1645               return HERR;
1646             }
1647           message = NULL;
1648           if (!*head)
1649             {
1650               xfree (head);
1651               goto failed_tunnel;
1652             }
1653           DEBUGP (("proxy responded with: [%s]\n", head));
1654
1655           resp = resp_new (head);
1656           statcode = resp_status (resp, &message);
1657           resp_free (resp);
1658           xfree (head);
1659           if (statcode != 200)
1660             {
1661             failed_tunnel:
1662               logprintf (LOG_NOTQUIET, _("Proxy tunneling failed: %s"),
1663                          message ? escnonprint (message) : "?");
1664               xfree_null (message);
1665               return CONSSLERR;
1666             }
1667           xfree_null (message);
1668
1669           /* SOCK is now *really* connected to u->host, so update CONN
1670              to reflect this.  That way register_persistent will
1671              register SOCK as being connected to u->host:u->port.  */
1672           conn = u;
1673         }
1674
1675       if (conn->scheme == SCHEME_HTTPS)
1676         {
1677           if (!ssl_connect (sock) || !ssl_check_certificate (sock, u->host))
1678             {
1679               fd_close (sock);
1680               return CONSSLERR;
1681             }
1682           using_ssl = true;
1683         }
1684 #endif /* HAVE_SSL */
1685     }
1686
1687   /* Send the request to server.  */
1688   write_error = request_send (req, sock);
1689
1690   if (write_error >= 0)
1691     {
1692       if (opt.post_data)
1693         {
1694           DEBUGP (("[POST data: %s]\n", opt.post_data));
1695           write_error = fd_write (sock, opt.post_data, post_data_size, -1);
1696         }
1697       else if (opt.post_file_name && post_data_size != 0)
1698         write_error = post_file (sock, opt.post_file_name, post_data_size);
1699     }
1700
1701   if (write_error < 0)
1702     {
1703       CLOSE_INVALIDATE (sock);
1704       request_free (req);
1705       return WRITEFAILED;
1706     }
1707   logprintf (LOG_VERBOSE, _("%s request sent, awaiting response... "),
1708              proxy ? "Proxy" : "HTTP");
1709   contlen = -1;
1710   contrange = 0;
1711   *dt &= ~RETROKF;
1712
1713   head = read_http_response_head (sock);
1714   if (!head)
1715     {
1716       if (errno == 0)
1717         {
1718           logputs (LOG_NOTQUIET, _("No data received.\n"));
1719           CLOSE_INVALIDATE (sock);
1720           request_free (req);
1721           return HEOF;
1722         }
1723       else
1724         {
1725           logprintf (LOG_NOTQUIET, _("Read error (%s) in headers.\n"),
1726                      fd_errstr (sock));
1727           CLOSE_INVALIDATE (sock);
1728           request_free (req);
1729           return HERR;
1730         }
1731     }
1732   DEBUGP (("\n---response begin---\n%s---response end---\n", head));
1733
1734   resp = resp_new (head);
1735
1736   /* Check for status line.  */
1737   message = NULL;
1738   statcode = resp_status (resp, &message);
1739   if (!opt.server_response)
1740     logprintf (LOG_VERBOSE, "%2d %s\n", statcode,
1741                message ? escnonprint (message) : "");
1742   else
1743     {
1744       logprintf (LOG_VERBOSE, "\n");
1745       print_server_response (resp, "  ");
1746     }
1747
1748   /* Determine the local filename if needed. Notice that if -O is used 
1749    * hstat.local_file is set by http_loop to the argument of -O. */
1750   if (!hs->local_file)     
1751     {
1752       /* Honor Content-Disposition whether possible. */
1753       if (!resp_header_copy (resp, "Content-Disposition", hdrval, sizeof (hdrval))
1754           || !parse_content_disposition (hdrval, &hs->local_file))
1755         {
1756           /* Choose filename according to URL name. */
1757           hs->local_file = url_file_name (u);
1758         }
1759     }
1760   
1761   /* TODO: perform this check only once. */
1762   if (opt.noclobber && file_exists_p (hs->local_file))
1763     {
1764       /* If opt.noclobber is turned on and file already exists, do not
1765          retrieve the file */
1766       logprintf (LOG_VERBOSE, _("\
1767 File `%s' already there; not retrieving.\n\n"), hs->local_file);
1768       /* If the file is there, we suppose it's retrieved OK.  */
1769       *dt |= RETROKF;
1770
1771       /* #### Bogusness alert.  */
1772       /* If its suffix is "html" or "htm" or similar, assume text/html.  */
1773       if (has_html_suffix_p (hs->local_file))
1774         *dt |= TEXTHTML;
1775
1776       return RETROK;
1777     }
1778
1779   /* Support timestamping */
1780   /* TODO: move this code out of gethttp. */
1781   if (opt.timestamping && !hs->timestamp_checked)
1782     {
1783       size_t filename_len = strlen (hs->local_file);
1784       char *filename_plus_orig_suffix = alloca (filename_len + sizeof (".orig"));
1785       bool local_dot_orig_file_exists = false;
1786       char *local_filename = NULL;
1787       struct_stat st;
1788
1789       if (opt.backup_converted)
1790         /* If -K is specified, we'll act on the assumption that it was specified
1791            last time these files were downloaded as well, and instead of just
1792            comparing local file X against server file X, we'll compare local
1793            file X.orig (if extant, else X) against server file X.  If -K
1794            _wasn't_ specified last time, or the server contains files called
1795            *.orig, -N will be back to not operating correctly with -k. */
1796         {
1797           /* Would a single s[n]printf() call be faster?  --dan
1798
1799              Definitely not.  sprintf() is horribly slow.  It's a
1800              different question whether the difference between the two
1801              affects a program.  Usually I'd say "no", but at one
1802              point I profiled Wget, and found that a measurable and
1803              non-negligible amount of time was lost calling sprintf()
1804              in url.c.  Replacing sprintf with inline calls to
1805              strcpy() and number_to_string() made a difference.
1806              --hniksic */
1807           memcpy (filename_plus_orig_suffix, hs->local_file, filename_len);
1808           memcpy (filename_plus_orig_suffix + filename_len,
1809                   ".orig", sizeof (".orig"));
1810
1811           /* Try to stat() the .orig file. */
1812           if (stat (filename_plus_orig_suffix, &st) == 0)
1813             {
1814               local_dot_orig_file_exists = 1;
1815               local_filename = filename_plus_orig_suffix;
1816             }
1817         }      
1818
1819       if (!local_dot_orig_file_exists)
1820         /* Couldn't stat() <file>.orig, so try to stat() <file>. */
1821         if (stat (hs->local_file, &st) == 0)
1822           local_filename = hs->local_file;
1823
1824       if (local_filename != NULL)
1825         /* There was a local file, so we'll check later to see if the version
1826            the server has is the same version we already have, allowing us to
1827            skip a download. */
1828         {
1829           hs->orig_file_name = xstrdup (local_filename);
1830           hs->orig_file_size = st.st_size;
1831           hs->orig_file_tstamp = st.st_mtime;
1832 #ifdef WINDOWS
1833           /* Modification time granularity is 2 seconds for Windows, so
1834              increase local time by 1 second for later comparison. */
1835           ++hs->orig_file_tstamp;
1836 #endif
1837         }
1838     }
1839
1840   if (!opt.ignore_length
1841       && resp_header_copy (resp, "Content-Length", hdrval, sizeof (hdrval)))
1842     {
1843       wgint parsed;
1844       errno = 0;
1845       parsed = str_to_wgint (hdrval, NULL, 10);
1846       if (parsed == WGINT_MAX && errno == ERANGE)
1847         /* Out of range.
1848            #### If Content-Length is out of range, it most likely
1849            means that the file is larger than 2G and that we're
1850            compiled without LFS.  In that case we should probably
1851            refuse to even attempt to download the file.  */
1852         contlen = -1;
1853       else
1854         contlen = parsed;
1855     }
1856
1857   /* Check for keep-alive related responses. */
1858   if (!inhibit_keep_alive && contlen != -1)
1859     {
1860       if (resp_header_copy (resp, "Keep-Alive", NULL, 0))
1861         keep_alive = true;
1862       else if (resp_header_copy (resp, "Connection", hdrval, sizeof (hdrval)))
1863         {
1864           if (0 == strcasecmp (hdrval, "Keep-Alive"))
1865             keep_alive = true;
1866         }
1867     }
1868   if (keep_alive)
1869     /* The server has promised that it will not close the connection
1870        when we're done.  This means that we can register it.  */
1871     register_persistent (conn->host, conn->port, sock, using_ssl);
1872
1873   if (statcode == HTTP_STATUS_UNAUTHORIZED)
1874     {
1875       /* Authorization is required.  */
1876       if (keep_alive && !head_only && skip_short_body (sock, contlen))
1877         CLOSE_FINISH (sock);
1878       else
1879         CLOSE_INVALIDATE (sock);
1880       pconn.authorized = false;
1881       if (!auth_finished && (user && passwd))
1882         {
1883           /* IIS sends multiple copies of WWW-Authenticate, one with
1884              the value "negotiate", and other(s) with data.  Loop over
1885              all the occurrences and pick the one we recognize.  */
1886           int wapos;
1887           const char *wabeg, *waend;
1888           char *www_authenticate = NULL;
1889           for (wapos = 0;
1890                (wapos = resp_header_locate (resp, "WWW-Authenticate", wapos,
1891                                             &wabeg, &waend)) != -1;
1892                ++wapos)
1893             if (known_authentication_scheme_p (wabeg, waend))
1894               {
1895                 BOUNDED_TO_ALLOCA (wabeg, waend, www_authenticate);
1896                 break;
1897               }
1898
1899           if (!www_authenticate)
1900             /* If the authentication header is missing or
1901                unrecognized, there's no sense in retrying.  */
1902             logputs (LOG_NOTQUIET, _("Unknown authentication scheme.\n"));
1903           else if (BEGINS_WITH (www_authenticate, "Basic"))
1904             /* If the authentication scheme is "Basic", which we send
1905                by default, there's no sense in retrying either.  (This
1906                should be changed when we stop sending "Basic" data by
1907                default.)  */
1908             ;
1909           else
1910             {
1911               char *pth;
1912               pth = url_full_path (u);
1913               request_set_header (req, "Authorization",
1914                                   create_authorization_line (www_authenticate,
1915                                                              user, passwd,
1916                                                              request_method (req),
1917                                                              pth,
1918                                                              &auth_finished),
1919                                   rel_value);
1920               if (BEGINS_WITH (www_authenticate, "NTLM"))
1921                 ntlm_seen = true;
1922               xfree (pth);
1923               goto retry_with_auth;
1924             }
1925         }
1926       logputs (LOG_NOTQUIET, _("Authorization failed.\n"));
1927       request_free (req);
1928       return AUTHFAILED;
1929     }
1930   else /* statcode != HTTP_STATUS_UNAUTHORIZED */
1931     {
1932       /* Kludge: if NTLM is used, mark the TCP connection as authorized. */
1933       if (ntlm_seen)
1934         pconn.authorized = true;
1935     }
1936   request_free (req);
1937
1938   hs->statcode = statcode;
1939   if (statcode == -1)
1940     hs->error = xstrdup (_("Malformed status line"));
1941   else if (!*message)
1942     hs->error = xstrdup (_("(no description)"));
1943   else
1944     hs->error = xstrdup (message);
1945   xfree_null (message);
1946
1947   type = resp_header_strdup (resp, "Content-Type");
1948   if (type)
1949     {
1950       char *tmp = strchr (type, ';');
1951       if (tmp)
1952         {
1953           while (tmp > type && ISSPACE (tmp[-1]))
1954             --tmp;
1955           *tmp = '\0';
1956         }
1957     }
1958   hs->newloc = resp_header_strdup (resp, "Location");
1959   hs->remote_time = resp_header_strdup (resp, "Last-Modified");
1960
1961   /* Handle (possibly multiple instances of) the Set-Cookie header. */
1962   if (opt.cookies)
1963     {
1964       int scpos;
1965       const char *scbeg, *scend;
1966       /* The jar should have been created by now. */
1967       assert (wget_cookie_jar != NULL);
1968       for (scpos = 0;
1969            (scpos = resp_header_locate (resp, "Set-Cookie", scpos,
1970                                         &scbeg, &scend)) != -1;
1971            ++scpos)
1972         {
1973           char *set_cookie; BOUNDED_TO_ALLOCA (scbeg, scend, set_cookie);
1974           cookie_handle_set_cookie (wget_cookie_jar, u->host, u->port,
1975                                     u->path, set_cookie);
1976         }
1977     }
1978
1979   if (resp_header_copy (resp, "Content-Range", hdrval, sizeof (hdrval)))
1980     {
1981       wgint first_byte_pos, last_byte_pos, entity_length;
1982       if (parse_content_range (hdrval, &first_byte_pos, &last_byte_pos,
1983                                &entity_length))
1984         contrange = first_byte_pos;
1985     }
1986   resp_free (resp);
1987
1988   /* 20x responses are counted among successful by default.  */
1989   if (H_20X (statcode))
1990     *dt |= RETROKF;
1991
1992   /* Return if redirected.  */
1993   if (H_REDIRECTED (statcode) || statcode == HTTP_STATUS_MULTIPLE_CHOICES)
1994     {
1995       /* RFC2068 says that in case of the 300 (multiple choices)
1996          response, the server can output a preferred URL through
1997          `Location' header; otherwise, the request should be treated
1998          like GET.  So, if the location is set, it will be a
1999          redirection; otherwise, just proceed normally.  */
2000       if (statcode == HTTP_STATUS_MULTIPLE_CHOICES && !hs->newloc)
2001         *dt |= RETROKF;
2002       else
2003         {
2004           logprintf (LOG_VERBOSE,
2005                      _("Location: %s%s\n"),
2006                      hs->newloc ? escnonprint_uri (hs->newloc) : _("unspecified"),
2007                      hs->newloc ? _(" [following]") : "");
2008           if (keep_alive && !head_only && skip_short_body (sock, contlen))
2009             CLOSE_FINISH (sock);
2010           else
2011             CLOSE_INVALIDATE (sock);
2012           xfree_null (type);
2013           return NEWLOCATION;
2014         }
2015     }
2016
2017   /* If content-type is not given, assume text/html.  This is because
2018      of the multitude of broken CGI's that "forget" to generate the
2019      content-type.  */
2020   if (!type ||
2021         0 == strncasecmp (type, TEXTHTML_S, strlen (TEXTHTML_S)) ||
2022         0 == strncasecmp (type, TEXTXHTML_S, strlen (TEXTXHTML_S)))
2023     *dt |= TEXTHTML;
2024   else
2025     *dt &= ~TEXTHTML;
2026
2027   if (opt.html_extension && (*dt & TEXTHTML))
2028     /* -E / --html-extension / html_extension = on was specified, and this is a
2029        text/html file.  If some case-insensitive variation on ".htm[l]" isn't
2030        already the file's suffix, tack on ".html". */
2031     {
2032       char *last_period_in_local_filename = strrchr (hs->local_file, '.');
2033
2034       if (last_period_in_local_filename == NULL
2035           || !(0 == strcasecmp (last_period_in_local_filename, ".htm")
2036                || 0 == strcasecmp (last_period_in_local_filename, ".html")))
2037         {
2038           int local_filename_len = strlen (hs->local_file);
2039           /* Resize the local file, allowing for ".html" preceded by
2040              optional ".NUMBER".  */
2041           hs->local_file = xrealloc (hs->local_file,
2042                                      local_filename_len + 24 + sizeof (".html"));
2043           strcpy(hs->local_file + local_filename_len, ".html");
2044           /* If clobbering is not allowed and the file, as named,
2045              exists, tack on ".NUMBER.html" instead. */
2046           if (!ALLOW_CLOBBER && file_exists_p (hs->local_file))
2047             {
2048               int ext_num = 1;
2049               do
2050                 sprintf (hs->local_file + local_filename_len,
2051                          ".%d.html", ext_num++);
2052               while (file_exists_p (hs->local_file));
2053             }
2054           *dt |= ADDED_HTML_EXTENSION;
2055         }
2056     }
2057
2058   if (statcode == HTTP_STATUS_RANGE_NOT_SATISFIABLE)
2059     {
2060       /* If `-c' is in use and the file has been fully downloaded (or
2061          the remote file has shrunk), Wget effectively requests bytes
2062          after the end of file and the server response with 416.  */
2063       logputs (LOG_VERBOSE, _("\
2064 \n    The file is already fully retrieved; nothing to do.\n\n"));
2065       /* In case the caller inspects. */
2066       hs->len = contlen;
2067       hs->res = 0;
2068       /* Mark as successfully retrieved. */
2069       *dt |= RETROKF;
2070       xfree_null (type);
2071       CLOSE_INVALIDATE (sock);        /* would be CLOSE_FINISH, but there
2072                                    might be more bytes in the body. */
2073       return RETRUNNEEDED;
2074     }
2075   if ((contrange != 0 && contrange != hs->restval)
2076       || (H_PARTIAL (statcode) && !contrange))
2077     {
2078       /* The Range request was somehow misunderstood by the server.
2079          Bail out.  */
2080       xfree_null (type);
2081       CLOSE_INVALIDATE (sock);
2082       return RANGEERR;
2083     }
2084   hs->contlen = contlen + contrange;
2085
2086   if (opt.verbose)
2087     {
2088       if (*dt & RETROKF)
2089         {
2090           /* No need to print this output if the body won't be
2091              downloaded at all, or if the original server response is
2092              printed.  */
2093           logputs (LOG_VERBOSE, _("Length: "));
2094           if (contlen != -1)
2095             {
2096               logputs (LOG_VERBOSE, number_to_static_string (contlen + contrange));
2097               if (contlen + contrange >= 1024)
2098                 logprintf (LOG_VERBOSE, " (%s)",
2099                            human_readable (contlen + contrange));
2100               if (contrange)
2101                 {
2102                   if (contlen >= 1024)
2103                     logprintf (LOG_VERBOSE, _(", %s (%s) remaining"),
2104                                number_to_static_string (contlen),
2105                                human_readable (contlen));
2106                   else
2107                     logprintf (LOG_VERBOSE, _(", %s remaining"),
2108                                number_to_static_string (contlen));
2109                 }
2110             }
2111           else
2112             logputs (LOG_VERBOSE,
2113                      opt.ignore_length ? _("ignored") : _("unspecified"));
2114           if (type)
2115             logprintf (LOG_VERBOSE, " [%s]\n", escnonprint (type));
2116           else
2117             logputs (LOG_VERBOSE, "\n");
2118         }
2119     }
2120   xfree_null (type);
2121   type = NULL;                        /* We don't need it any more.  */
2122
2123   /* Return if we have no intention of further downloading.  */
2124   if (!(*dt & RETROKF) || head_only)
2125     {
2126       /* In case the caller cares to look...  */
2127       hs->len = 0;
2128       hs->res = 0;
2129       xfree_null (type);
2130       if (head_only)
2131         /* Pre-1.10 Wget used CLOSE_INVALIDATE here.  Now we trust the
2132            servers not to send body in response to a HEAD request, and
2133            those that do will likely be caught by test_socket_open.
2134            If not, they can be worked around using
2135            `--no-http-keep-alive'.  */
2136         CLOSE_FINISH (sock);
2137       else if (keep_alive && skip_short_body (sock, contlen))
2138         /* Successfully skipped the body; also keep using the socket. */
2139         CLOSE_FINISH (sock);
2140       else
2141         CLOSE_INVALIDATE (sock);
2142       return RETRFINISHED;
2143     }
2144
2145   /* Print fetch message, if opt.verbose.  */
2146   if (opt.verbose)
2147     {
2148       logprintf (LOG_NOTQUIET, _("Saving to: `%s'\n"), 
2149                  HYPHENP (hs->local_file) ? "STDOUT" : hs->local_file);
2150     }
2151     
2152   /* Open the local file.  */
2153   if (!output_stream)
2154     {
2155       mkalldirs (hs->local_file);
2156       if (opt.backups)
2157         rotate_backups (hs->local_file);
2158       if (hs->restval)
2159         fp = fopen (hs->local_file, "ab");
2160       else if (ALLOW_CLOBBER)
2161         fp = fopen (hs->local_file, "wb");
2162       else
2163         {
2164           fp = fopen_excl (hs->local_file, true);
2165           if (!fp && errno == EEXIST)
2166             {
2167               /* We cannot just invent a new name and use it (which is
2168                  what functions like unique_create typically do)
2169                  because we told the user we'd use this name.
2170                  Instead, return and retry the download.  */
2171               logprintf (LOG_NOTQUIET,
2172                          _("%s has sprung into existence.\n"),
2173                          hs->local_file);
2174               CLOSE_INVALIDATE (sock);
2175               return FOPEN_EXCL_ERR;
2176             }
2177         }
2178       if (!fp)
2179         {
2180           logprintf (LOG_NOTQUIET, "%s: %s\n", hs->local_file, strerror (errno));
2181           CLOSE_INVALIDATE (sock);
2182           return FOPENERR;
2183         }
2184     }
2185   else
2186     fp = output_stream;
2187
2188   /* This confuses the timestamping code that checks for file size.
2189      #### The timestamping code should be smarter about file size.  */
2190   if (opt.save_headers && hs->restval == 0)
2191     fwrite (head, 1, strlen (head), fp);
2192
2193   /* Now we no longer need to store the response header. */
2194   xfree (head);
2195
2196   /* Download the request body.  */
2197   flags = 0;
2198   if (contlen != -1)
2199     /* If content-length is present, read that much; otherwise, read
2200        until EOF.  The HTTP spec doesn't require the server to
2201        actually close the connection when it's done sending data. */
2202     flags |= rb_read_exactly;
2203   if (hs->restval > 0 && contrange == 0)
2204     /* If the server ignored our range request, instruct fd_read_body
2205        to skip the first RESTVAL bytes of body.  */
2206     flags |= rb_skip_startpos;
2207   hs->len = hs->restval;
2208   hs->rd_size = 0;
2209   hs->res = fd_read_body (sock, fp, contlen != -1 ? contlen : 0,
2210                           hs->restval, &hs->rd_size, &hs->len, &hs->dltime,
2211                           flags);
2212
2213   if (hs->res >= 0)
2214     CLOSE_FINISH (sock);
2215   else
2216     {
2217       if (hs->res < 0)
2218         hs->rderrmsg = xstrdup (fd_errstr (sock));
2219       CLOSE_INVALIDATE (sock);
2220     }
2221
2222   if (!output_stream)
2223     fclose (fp);
2224   if (hs->res == -2)
2225     return FWRITEERR;
2226   return RETRFINISHED;
2227 }
2228
2229 /* The genuine HTTP loop!  This is the part where the retrieval is
2230    retried, and retried, and retried, and...  */
2231 uerr_t
2232 http_loop (struct url *u, char **newloc, char **local_file, const char *referer,
2233            int *dt, struct url *proxy)
2234 {
2235   int count;
2236   bool got_head = false;         /* used for time-stamping */
2237   char *tms;
2238   const char *tmrate;
2239   uerr_t err;
2240   time_t tmr = -1;               /* remote time-stamp */
2241   wgint local_size = 0;          /* the size of the local file */
2242   struct http_stat hstat;        /* HTTP status */
2243   struct_stat st;
2244
2245   /* Assert that no value for *LOCAL_FILE was passed. */
2246   assert (local_file == NULL || *local_file == NULL);
2247   
2248   /* Set LOCAL_FILE parameter. */
2249   if (local_file && opt.output_document)
2250     *local_file = HYPHENP (opt.output_document) ? NULL : xstrdup (opt.output_document);
2251   
2252   /* Reset NEWLOC parameter. */
2253   *newloc = NULL;
2254
2255   /* This used to be done in main(), but it's a better idea to do it
2256      here so that we don't go through the hoops if we're just using
2257      FTP or whatever. */
2258   if (opt.cookies)
2259     load_cookies();
2260
2261   /* Warn on (likely bogus) wildcard usage in HTTP. */
2262   if (opt.ftp_glob && has_wildcards_p (u->path))
2263     logputs (LOG_VERBOSE, _("Warning: wildcards not supported in HTTP.\n"));
2264
2265   /* Setup hstat struct. */
2266   xzero (hstat);
2267   hstat.referer = referer;
2268
2269   if (opt.output_document)
2270     hstat.local_file = xstrdup (opt.output_document);
2271
2272   /* Reset the counter. */
2273   count = 0;
2274   
2275   /* Reset the document type. */
2276   *dt = 0;
2277   
2278   /* THE loop */
2279   do
2280     {
2281       /* Increment the pass counter.  */
2282       ++count;
2283       sleep_between_retrievals (count);
2284       
2285       /* Get the current time string.  */
2286       tms = time_str (NULL);
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         *dt |= HEAD_ONLY;
2317       else
2318         *dt &= ~HEAD_ONLY;
2319
2320       /* Decide whether or not to restart.  */
2321       if (opt.always_rest
2322           && stat (hstat.local_file, &st) == 0
2323           && S_ISREG (st.st_mode))
2324         /* When -c is used, continue from on-disk size.  (Can't use
2325            hstat.len even if count>1 because we don't want a failed
2326            first attempt to clobber existing data.)  */
2327         hstat.restval = st.st_size;
2328       else if (count > 1)
2329         /* otherwise, continue where the previous try left off */
2330         hstat.restval = hstat.len;
2331       else
2332         hstat.restval = 0;
2333
2334       /* Decide whether to send the no-cache directive.  We send it in
2335          two cases:
2336            a) we're using a proxy, and we're past our first retrieval.
2337               Some proxies are notorious for caching incomplete data, so
2338               we require a fresh get.
2339            b) caching is explicitly inhibited. */
2340       if ((proxy && count > 1)        /* a */
2341           || !opt.allow_cache         /* b */
2342           )
2343         *dt |= SEND_NOCACHE;
2344       else
2345         *dt &= ~SEND_NOCACHE;
2346
2347       /* Try fetching the document, or at least its head.  */
2348       err = gethttp (u, &hstat, dt, proxy);
2349
2350       /* Time?  */
2351       tms = time_str (NULL);
2352       
2353       /* Get the new location (with or without the redirection).  */
2354       if (hstat.newloc)
2355         *newloc = xstrdup (hstat.newloc);
2356       
2357       switch (err)
2358         {
2359         case HERR: case HEOF: case CONSOCKERR: case CONCLOSED:
2360         case CONERROR: case READERR: case WRITEFAILED:
2361         case RANGEERR: case FOPEN_EXCL_ERR:
2362           /* Non-fatal errors continue executing the loop, which will
2363              bring them to "while" statement at the end, to judge
2364              whether the number of tries was exceeded.  */
2365           /* free_hstat (&hstat); */
2366           printwhat (count, opt.ntry);
2367           continue;
2368         case HOSTERR: case CONIMPOSSIBLE: case PROXERR: case AUTHFAILED: 
2369         case SSLINITFAILED: case CONTNOTSUPPORTED:
2370           /* Fatal errors just return from the function.  */
2371           free_hstat (&hstat);
2372           return err;
2373         case FWRITEERR: case FOPENERR:
2374           /* Another fatal error.  */
2375           logputs (LOG_VERBOSE, "\n");
2376           logprintf (LOG_NOTQUIET, _("Cannot write to `%s' (%s).\n"),
2377                      hstat.local_file, strerror (errno));
2378           free_hstat (&hstat);
2379           return err;
2380         case CONSSLERR:
2381           /* Another fatal error.  */
2382           logprintf (LOG_NOTQUIET, _("Unable to establish SSL connection.\n"));
2383           free_hstat (&hstat);
2384           return err;
2385         case NEWLOCATION:
2386           /* Return the new location to the caller.  */
2387           if (!*newloc)
2388             {
2389               logprintf (LOG_NOTQUIET,
2390                          _("ERROR: Redirection (%d) without location.\n"),
2391                          hstat.statcode);
2392               free_hstat (&hstat);
2393               return WRONGCODE;
2394             }
2395           free_hstat (&hstat);
2396           return NEWLOCATION;
2397         case RETRUNNEEDED:
2398           /* The file was already fully retrieved. */
2399           free_hstat (&hstat);
2400           return RETROK;
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           if (!opt.verbose)
2412             {
2413               /* #### Ugly ugly ugly! */
2414               char *hurl = url_string (u, true);
2415               logprintf (LOG_NONVERBOSE, "%s:\n", hurl);
2416               xfree (hurl);
2417             }
2418           logprintf (LOG_NOTQUIET, _("%s ERROR %d: %s.\n"),
2419                      tms, hstat.statcode, escnonprint (hstat.error));
2420           logputs (LOG_VERBOSE, "\n");
2421           free_hstat (&hstat);
2422           return WRONGCODE;
2423         }
2424
2425       /* Did we get the time-stamp? */
2426       if (!got_head)
2427         {
2428           if (opt.timestamping && !hstat.remote_time)
2429             {
2430               logputs (LOG_NOTQUIET, _("\
2431 Last-modified header missing -- time-stamps turned off.\n"));
2432             }
2433           else if (hstat.remote_time)
2434             {
2435               /* Convert the date-string into struct tm.  */
2436               tmr = http_atotm (hstat.remote_time);
2437               if (tmr == (time_t) (-1))
2438                 logputs (LOG_VERBOSE, _("\
2439 Last-modified header invalid -- time-stamp ignored.\n"));
2440             }
2441         }
2442
2443       /* The time-stamping section.  */
2444       if (opt.timestamping && !got_head)
2445         {
2446           got_head = true;    /* no more time-stamping */
2447           *dt &= ~HEAD_ONLY;
2448           count = 0;          /* the retrieve count for HEAD is reset */
2449           
2450           if (hstat.remote_time && tmr != (time_t) (-1))
2451             {
2452               /* Now time-stamping can be used validly.  Time-stamping
2453                  means that if the sizes of the local and remote file
2454                  match, and local file is newer than the remote file,
2455                  it will not be retrieved.  Otherwise, the normal
2456                  download procedure is resumed.  */
2457               if (hstat.orig_file_tstamp >= tmr)
2458                 {
2459                   if (hstat.contlen == -1 || hstat.orig_file_size == hstat.contlen)
2460                     {
2461                       logprintf (LOG_VERBOSE, _("\
2462 Server file no newer than local file `%s' -- not retrieving.\n\n"),
2463                                  hstat.orig_file_name);
2464                       free_hstat (&hstat);
2465                       return RETROK;
2466                     }
2467                   else
2468                     {
2469                       logprintf (LOG_VERBOSE, _("\
2470 The sizes do not match (local %s) -- retrieving.\n"),
2471                                  number_to_static_string (local_size));
2472                     }
2473                 }
2474               else
2475                 logputs (LOG_VERBOSE,
2476                          _("Remote file is newer, retrieving.\n"));
2477
2478               logputs (LOG_VERBOSE, "\n");
2479             }
2480           
2481           /* free_hstat (&hstat); */
2482           hstat.timestamp_checked = true;
2483           continue;
2484         }
2485       
2486       if ((tmr != (time_t) (-1))
2487           && !opt.spider
2488           && ((hstat.len == hstat.contlen) ||
2489               ((hstat.res == 0) && (hstat.contlen == -1))))
2490         {
2491           /* #### This code repeats in http.c and ftp.c.  Move it to a
2492              function!  */
2493           const char *fl = NULL;
2494           if (opt.output_document)
2495             {
2496               if (output_stream_regular)
2497                 fl = opt.output_document;
2498             }
2499           else
2500             fl = hstat.local_file;
2501           if (fl)
2502             touch (fl, tmr);
2503         }
2504       /* End of time-stamping section. */
2505
2506       if (opt.spider)
2507         {
2508           logprintf (LOG_NOTQUIET, "%d %s\n\n", hstat.statcode,
2509                      escnonprint (hstat.error));
2510           return RETROK;
2511         }
2512
2513       tmrate = retr_rate (hstat.rd_size, hstat.dltime);
2514       total_download_time += hstat.dltime;
2515
2516       if (hstat.len == hstat.contlen)
2517         {
2518           if (*dt & RETROKF)
2519             {
2520               logprintf (LOG_VERBOSE,
2521                          _("%s (%s) - `%s' saved [%s/%s]\n\n"),
2522                          tms, tmrate, hstat.local_file,
2523                          number_to_static_string (hstat.len),
2524                          number_to_static_string (hstat.contlen));
2525               logprintf (LOG_NONVERBOSE,
2526                          "%s URL:%s [%s/%s] -> \"%s\" [%d]\n",
2527                          tms, u->url,
2528                          number_to_static_string (hstat.len),
2529                          number_to_static_string (hstat.contlen),
2530                          hstat.local_file, count);
2531             }
2532           ++opt.numurls;
2533           total_downloaded_bytes += hstat.len;
2534
2535           /* Remember that we downloaded the file for later ".orig" code. */
2536           if (*dt & ADDED_HTML_EXTENSION)
2537             downloaded_file(FILE_DOWNLOADED_AND_HTML_EXTENSION_ADDED, hstat.local_file);
2538           else
2539             downloaded_file(FILE_DOWNLOADED_NORMALLY, hstat.local_file);
2540
2541           free_hstat (&hstat);
2542           return RETROK;
2543         }
2544       else if (hstat.res == 0) /* No read error */
2545         {
2546           if (hstat.contlen == -1)  /* We don't know how much we were supposed
2547                                        to get, so assume we succeeded. */ 
2548             {
2549               if (*dt & RETROKF)
2550                 {
2551                   logprintf (LOG_VERBOSE,
2552                              _("%s (%s) - `%s' saved [%s]\n\n"),
2553                              tms, tmrate, hstat.local_file,
2554                              number_to_static_string (hstat.len));
2555                   logprintf (LOG_NONVERBOSE,
2556                              "%s URL:%s [%s] -> \"%s\" [%d]\n",
2557                              tms, u->url, number_to_static_string (hstat.len),
2558                              hstat.local_file, count);
2559                 }
2560               ++opt.numurls;
2561               total_downloaded_bytes += hstat.len;
2562
2563               /* Remember that we downloaded the file for later ".orig" code. */
2564               if (*dt & ADDED_HTML_EXTENSION)
2565                 downloaded_file(FILE_DOWNLOADED_AND_HTML_EXTENSION_ADDED, hstat.local_file);
2566               else
2567                 downloaded_file(FILE_DOWNLOADED_NORMALLY, hstat.local_file);
2568               
2569               free_hstat (&hstat);
2570               return RETROK;
2571             }
2572           else if (hstat.len < hstat.contlen) /* meaning we lost the
2573                                                  connection too soon */
2574             {
2575               logprintf (LOG_VERBOSE,
2576                          _("%s (%s) - Connection closed at byte %s. "),
2577                          tms, tmrate, number_to_static_string (hstat.len));
2578               printwhat (count, opt.ntry);
2579               /* free_hstat (&hstat); */
2580               continue;
2581             }
2582           else
2583             /* Getting here would mean reading more data than
2584                requested with content-length, which we never do.  */
2585             abort ();
2586         }
2587       else /* from now on hstat.res can only be -1 */
2588         {
2589           if (hstat.contlen == -1)
2590             {
2591               logprintf (LOG_VERBOSE,
2592                          _("%s (%s) - Read error at byte %s (%s)."),
2593                          tms, tmrate, number_to_static_string (hstat.len),
2594                          hstat.rderrmsg);
2595               printwhat (count, opt.ntry);
2596               /* free_hstat (&hstat); */
2597               continue;
2598             }
2599           else /* hstat.res == -1 and contlen is given */
2600             {
2601               logprintf (LOG_VERBOSE,
2602                          _("%s (%s) - Read error at byte %s/%s (%s). "),
2603                          tms, tmrate,
2604                          number_to_static_string (hstat.len),
2605                          number_to_static_string (hstat.contlen),
2606                          hstat.rderrmsg);
2607               printwhat (count, opt.ntry);
2608               /* free_hstat (&hstat); */
2609               continue;
2610             }
2611         }
2612       /* not reached */
2613     }
2614   while (!opt.ntry || (count < opt.ntry));
2615   
2616   return TRYLIMEXC;
2617 }
2618 \f
2619 /* Check whether the result of strptime() indicates success.
2620    strptime() returns the pointer to how far it got to in the string.
2621    The processing has been successful if the string is at `GMT' or
2622    `+X', or at the end of the string.
2623
2624    In extended regexp parlance, the function returns 1 if P matches
2625    "^ *(GMT|[+-][0-9]|$)", 0 otherwise.  P being NULL (which strptime
2626    can return) is considered a failure and 0 is returned.  */
2627 static bool
2628 check_end (const char *p)
2629 {
2630   if (!p)
2631     return false;
2632   while (ISSPACE (*p))
2633     ++p;
2634   if (!*p
2635       || (p[0] == 'G' && p[1] == 'M' && p[2] == 'T')
2636       || ((p[0] == '+' || p[0] == '-') && ISDIGIT (p[1])))
2637     return true;
2638   else
2639     return false;
2640 }
2641
2642 /* Convert the textual specification of time in TIME_STRING to the
2643    number of seconds since the Epoch.
2644
2645    TIME_STRING can be in any of the three formats RFC2616 allows the
2646    HTTP servers to emit -- RFC1123-date, RFC850-date or asctime-date,
2647    as well as the time format used in the Set-Cookie header.
2648    Timezones are ignored, and should be GMT.
2649
2650    Return the computed time_t representation, or -1 if the conversion
2651    fails.
2652
2653    This function uses strptime with various string formats for parsing
2654    TIME_STRING.  This results in a parser that is not as lenient in
2655    interpreting TIME_STRING as I would like it to be.  Being based on
2656    strptime, it always allows shortened months, one-digit days, etc.,
2657    but due to the multitude of formats in which time can be
2658    represented, an ideal HTTP time parser would be even more
2659    forgiving.  It should completely ignore things like week days and
2660    concentrate only on the various forms of representing years,
2661    months, days, hours, minutes, and seconds.  For example, it would
2662    be nice if it accepted ISO 8601 out of the box.
2663
2664    I've investigated free and PD code for this purpose, but none was
2665    usable.  getdate was big and unwieldy, and had potential copyright
2666    issues, or so I was informed.  Dr. Marcus Hennecke's atotm(),
2667    distributed with phttpd, is excellent, but we cannot use it because
2668    it is not assigned to the FSF.  So I stuck it with strptime.  */
2669
2670 time_t
2671 http_atotm (const char *time_string)
2672 {
2673   /* NOTE: Solaris strptime man page claims that %n and %t match white
2674      space, but that's not universally available.  Instead, we simply
2675      use ` ' to mean "skip all WS", which works under all strptime
2676      implementations I've tested.  */
2677
2678   static const char *time_formats[] = {
2679     "%a, %d %b %Y %T",          /* rfc1123: Thu, 29 Jan 1998 22:12:57 */
2680     "%A, %d-%b-%y %T",          /* rfc850:  Thursday, 29-Jan-98 22:12:57 */
2681     "%a %b %d %T %Y",           /* asctime: Thu Jan 29 22:12:57 1998 */
2682     "%a, %d-%b-%Y %T"           /* cookies: Thu, 29-Jan-1998 22:12:57
2683                                    (used in Set-Cookie, defined in the
2684                                    Netscape cookie specification.) */
2685   };
2686   const char *oldlocale;
2687   int i;
2688   time_t ret = (time_t) -1;
2689
2690   /* Solaris strptime fails to recognize English month names in
2691      non-English locales, which we work around by temporarily setting
2692      locale to C before invoking strptime.  */
2693   oldlocale = setlocale (LC_TIME, NULL);
2694   setlocale (LC_TIME, "C");
2695
2696   for (i = 0; i < countof (time_formats); i++)
2697     {
2698       struct tm t;
2699
2700       /* Some versions of strptime use the existing contents of struct
2701          tm to recalculate the date according to format.  Zero it out
2702          to prevent stack garbage from influencing strptime.  */
2703       xzero (t);
2704
2705       if (check_end (strptime (time_string, time_formats[i], &t)))
2706         {
2707           ret = timegm (&t);
2708           break;
2709         }
2710     }
2711
2712   /* Restore the previous locale. */
2713   setlocale (LC_TIME, oldlocale);
2714
2715   return ret;
2716 }
2717 \f
2718 /* Authorization support: We support three authorization schemes:
2719
2720    * `Basic' scheme, consisting of base64-ing USER:PASSWORD string;
2721
2722    * `Digest' scheme, added by Junio Hamano <junio@twinsun.com>,
2723    consisting of answering to the server's challenge with the proper
2724    MD5 digests.
2725
2726    * `NTLM' ("NT Lan Manager") scheme, based on code written by Daniel
2727    Stenberg for libcurl.  Like digest, NTLM is based on a
2728    challenge-response mechanism, but unlike digest, it is non-standard
2729    (authenticates TCP connections rather than requests), undocumented
2730    and Microsoft-specific.  */
2731
2732 /* Create the authentication header contents for the `Basic' scheme.
2733    This is done by encoding the string "USER:PASS" to base64 and
2734    prepending the string "Basic " in front of it.  */
2735
2736 static char *
2737 basic_authentication_encode (const char *user, const char *passwd)
2738 {
2739   char *t1, *t2;
2740   int len1 = strlen (user) + 1 + strlen (passwd);
2741
2742   t1 = (char *)alloca (len1 + 1);
2743   sprintf (t1, "%s:%s", user, passwd);
2744
2745   t2 = (char *)alloca (BASE64_LENGTH (len1) + 1);
2746   base64_encode (t1, len1, t2);
2747
2748   return concat_strings ("Basic ", t2, (char *) 0);
2749 }
2750
2751 #define SKIP_WS(x) do {                         \
2752   while (ISSPACE (*(x)))                        \
2753     ++(x);                                      \
2754 } while (0)
2755
2756 #ifdef ENABLE_DIGEST
2757 /* Parse HTTP `WWW-Authenticate:' header.  AU points to the beginning
2758    of a field in such a header.  If the field is the one specified by
2759    ATTR_NAME ("realm", "opaque", and "nonce" are used by the current
2760    digest authorization code), extract its value in the (char*)
2761    variable pointed by RET.  Returns negative on a malformed header,
2762    or number of bytes that have been parsed by this call.  */
2763 static int
2764 extract_header_attr (const char *au, const char *attr_name, char **ret)
2765 {
2766   const char *ep;
2767   const char *cp = au;
2768
2769   if (strncmp (cp, attr_name, strlen (attr_name)) == 0)
2770     {
2771       cp += strlen (attr_name);
2772       if (!*cp)
2773         return -1;
2774       SKIP_WS (cp);
2775       if (*cp != '=')
2776         return -1;
2777       if (!*++cp)
2778         return -1;
2779       SKIP_WS (cp);
2780       if (*cp != '\"')
2781         return -1;
2782       if (!*++cp)
2783         return -1;
2784       for (ep = cp; *ep && *ep != '\"'; ep++)
2785         ;
2786       if (!*ep)
2787         return -1;
2788       xfree_null (*ret);
2789       *ret = strdupdelim (cp, ep);
2790       return ep - au + 1;
2791     }
2792   else
2793     return 0;
2794 }
2795
2796 /* Dump the hexadecimal representation of HASH to BUF.  HASH should be
2797    an array of 16 bytes containing the hash keys, and BUF should be a
2798    buffer of 33 writable characters (32 for hex digits plus one for
2799    zero termination).  */
2800 static void
2801 dump_hash (char *buf, const unsigned char *hash)
2802 {
2803   int i;
2804
2805   for (i = 0; i < MD5_HASHLEN; i++, hash++)
2806     {
2807       *buf++ = XNUM_TO_digit (*hash >> 4);
2808       *buf++ = XNUM_TO_digit (*hash & 0xf);
2809     }
2810   *buf = '\0';
2811 }
2812
2813 /* Take the line apart to find the challenge, and compose a digest
2814    authorization header.  See RFC2069 section 2.1.2.  */
2815 static char *
2816 digest_authentication_encode (const char *au, const char *user,
2817                               const char *passwd, const char *method,
2818                               const char *path)
2819 {
2820   static char *realm, *opaque, *nonce;
2821   static struct {
2822     const char *name;
2823     char **variable;
2824   } options[] = {
2825     { "realm", &realm },
2826     { "opaque", &opaque },
2827     { "nonce", &nonce }
2828   };
2829   char *res;
2830
2831   realm = opaque = nonce = NULL;
2832
2833   au += 6;                      /* skip over `Digest' */
2834   while (*au)
2835     {
2836       int i;
2837
2838       SKIP_WS (au);
2839       for (i = 0; i < countof (options); i++)
2840         {
2841           int skip = extract_header_attr (au, options[i].name,
2842                                           options[i].variable);
2843           if (skip < 0)
2844             {
2845               xfree_null (realm);
2846               xfree_null (opaque);
2847               xfree_null (nonce);
2848               return NULL;
2849             }
2850           else if (skip)
2851             {
2852               au += skip;
2853               break;
2854             }
2855         }
2856       if (i == countof (options))
2857         {
2858           while (*au && *au != '=')
2859             au++;
2860           if (*au && *++au)
2861             {
2862               SKIP_WS (au);
2863               if (*au == '\"')
2864                 {
2865                   au++;
2866                   while (*au && *au != '\"')
2867                     au++;
2868                   if (*au)
2869                     au++;
2870                 }
2871             }
2872         }
2873       while (*au && *au != ',')
2874         au++;
2875       if (*au)
2876         au++;
2877     }
2878   if (!realm || !nonce || !user || !passwd || !path || !method)
2879     {
2880       xfree_null (realm);
2881       xfree_null (opaque);
2882       xfree_null (nonce);
2883       return NULL;
2884     }
2885
2886   /* Calculate the digest value.  */
2887   {
2888     ALLOCA_MD5_CONTEXT (ctx);
2889     unsigned char hash[MD5_HASHLEN];
2890     char a1buf[MD5_HASHLEN * 2 + 1], a2buf[MD5_HASHLEN * 2 + 1];
2891     char response_digest[MD5_HASHLEN * 2 + 1];
2892
2893     /* A1BUF = H(user ":" realm ":" password) */
2894     gen_md5_init (ctx);
2895     gen_md5_update ((unsigned char *)user, strlen (user), ctx);
2896     gen_md5_update ((unsigned char *)":", 1, ctx);
2897     gen_md5_update ((unsigned char *)realm, strlen (realm), ctx);
2898     gen_md5_update ((unsigned char *)":", 1, ctx);
2899     gen_md5_update ((unsigned char *)passwd, strlen (passwd), ctx);
2900     gen_md5_finish (ctx, hash);
2901     dump_hash (a1buf, hash);
2902
2903     /* A2BUF = H(method ":" path) */
2904     gen_md5_init (ctx);
2905     gen_md5_update ((unsigned char *)method, strlen (method), ctx);
2906     gen_md5_update ((unsigned char *)":", 1, ctx);
2907     gen_md5_update ((unsigned char *)path, strlen (path), ctx);
2908     gen_md5_finish (ctx, hash);
2909     dump_hash (a2buf, hash);
2910
2911     /* RESPONSE_DIGEST = H(A1BUF ":" nonce ":" A2BUF) */
2912     gen_md5_init (ctx);
2913     gen_md5_update ((unsigned char *)a1buf, MD5_HASHLEN * 2, ctx);
2914     gen_md5_update ((unsigned char *)":", 1, ctx);
2915     gen_md5_update ((unsigned char *)nonce, strlen (nonce), ctx);
2916     gen_md5_update ((unsigned char *)":", 1, ctx);
2917     gen_md5_update ((unsigned char *)a2buf, MD5_HASHLEN * 2, ctx);
2918     gen_md5_finish (ctx, hash);
2919     dump_hash (response_digest, hash);
2920
2921     res = xmalloc (strlen (user)
2922                    + strlen (user)
2923                    + strlen (realm)
2924                    + strlen (nonce)
2925                    + strlen (path)
2926                    + 2 * MD5_HASHLEN /*strlen (response_digest)*/
2927                    + (opaque ? strlen (opaque) : 0)
2928                    + 128);
2929     sprintf (res, "Digest \
2930 username=\"%s\", realm=\"%s\", nonce=\"%s\", uri=\"%s\", response=\"%s\"",
2931              user, realm, nonce, path, response_digest);
2932     if (opaque)
2933       {
2934         char *p = res + strlen (res);
2935         strcat (p, ", opaque=\"");
2936         strcat (p, opaque);
2937         strcat (p, "\"");
2938       }
2939   }
2940   return res;
2941 }
2942 #endif /* ENABLE_DIGEST */
2943
2944 /* Computing the size of a string literal must take into account that
2945    value returned by sizeof includes the terminating \0.  */
2946 #define STRSIZE(literal) (sizeof (literal) - 1)
2947
2948 /* Whether chars in [b, e) begin with the literal string provided as
2949    first argument and are followed by whitespace or terminating \0.
2950    The comparison is case-insensitive.  */
2951 #define STARTS(literal, b, e)                           \
2952   ((e) - (b) >= STRSIZE (literal)                       \
2953    && 0 == strncasecmp (b, literal, STRSIZE (literal))  \
2954    && ((e) - (b) == STRSIZE (literal)                   \
2955        || ISSPACE (b[STRSIZE (literal)])))
2956
2957 static bool
2958 known_authentication_scheme_p (const char *hdrbeg, const char *hdrend)
2959 {
2960   return STARTS ("Basic", hdrbeg, hdrend)
2961 #ifdef ENABLE_DIGEST
2962     || STARTS ("Digest", hdrbeg, hdrend)
2963 #endif
2964 #ifdef ENABLE_NTLM
2965     || STARTS ("NTLM", hdrbeg, hdrend)
2966 #endif
2967     ;
2968 }
2969
2970 #undef STARTS
2971
2972 /* Create the HTTP authorization request header.  When the
2973    `WWW-Authenticate' response header is seen, according to the
2974    authorization scheme specified in that header (`Basic' and `Digest'
2975    are supported by the current implementation), produce an
2976    appropriate HTTP authorization request header.  */
2977 static char *
2978 create_authorization_line (const char *au, const char *user,
2979                            const char *passwd, const char *method,
2980                            const char *path, bool *finished)
2981 {
2982   /* We are called only with known schemes, so we can dispatch on the
2983      first letter. */
2984   switch (TOUPPER (*au))
2985     {
2986     case 'B':                   /* Basic */
2987       *finished = true;
2988       return basic_authentication_encode (user, passwd);
2989 #ifdef ENABLE_DIGEST
2990     case 'D':                   /* Digest */
2991       *finished = true;
2992       return digest_authentication_encode (au, user, passwd, method, path);
2993 #endif
2994 #ifdef ENABLE_NTLM
2995     case 'N':                   /* NTLM */
2996       if (!ntlm_input (&pconn.ntlm, au))
2997         {
2998           *finished = true;
2999           return NULL;
3000         }
3001       return ntlm_output (&pconn.ntlm, user, passwd, finished);
3002 #endif
3003     default:
3004       /* We shouldn't get here -- this function should be only called
3005          with values approved by known_authentication_scheme_p.  */
3006       abort ();
3007     }
3008 }
3009 \f
3010 static void
3011 load_cookies (void)
3012 {
3013   if (!wget_cookie_jar)
3014     wget_cookie_jar = cookie_jar_new ();
3015   if (opt.cookies_input && !cookies_loaded_p)
3016     {
3017       cookie_jar_load (wget_cookie_jar, opt.cookies_input);
3018       cookies_loaded_p = true;
3019     }
3020 }
3021
3022 void
3023 save_cookies (void)
3024 {
3025   if (wget_cookie_jar)
3026     cookie_jar_save (wget_cookie_jar, opt.cookies_output);
3027 }
3028
3029 void
3030 http_cleanup (void)
3031 {
3032   xfree_null (pconn.host);
3033   if (wget_cookie_jar)
3034     cookie_jar_delete (wget_cookie_jar);
3035 }
3036
3037
3038 #ifdef TESTING
3039
3040 char *
3041 test_parse_content_disposition()
3042 {
3043   int i;
3044   struct {
3045     char *hdrval;    
3046     char *filename;
3047     bool result;
3048   } test_array[] = {
3049     { "filename=\"file.ext\"", "file.ext", true },
3050     { "attachment; filename=\"file.ext\"", "file.ext", true },
3051     { "attachment; filename=\"file.ext\"; dummy", "file.ext", true },
3052     { "attachment", NULL, false },    
3053   };
3054   
3055   for (i = 0; i < sizeof(test_array)/sizeof(test_array[0]); ++i) 
3056     {
3057       char *filename;
3058       bool res = parse_content_disposition (test_array[i].hdrval, &filename);
3059
3060       mu_assert ("test_parse_content_disposition: wrong result", 
3061                  res == test_array[i].result
3062                  && (res == false 
3063                      || 0 == strcmp (test_array[i].filename, filename)));
3064
3065       /* printf ("test %d: %s\n", i, res == false ? "false" : filename); */
3066     }
3067
3068   return NULL;
3069 }
3070
3071 #endif /* TESTING */
3072
3073 /*
3074  * vim: et ts=2 sw=2
3075  */
3076