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