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