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