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