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