]> sjero.net Git - wget/blob - src/http.c
93f072b53e3aaaf899104562d52551db4fbd4392
[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       fp = fopen (*hs->local_file, hs->restval ? "ab" : "wb");
1724       if (!fp)
1725         {
1726           logprintf (LOG_NOTQUIET, "%s: %s\n", *hs->local_file, strerror (errno));
1727           CLOSE_INVALIDATE (sock);
1728           return FOPENERR;
1729         }
1730     }
1731   else
1732     fp = output_stream;
1733
1734   /* #### This confuses the timestamping code that checks for file
1735      size.  Maybe we should save some additional information?  */
1736   if (opt.save_headers)
1737     fwrite (head, 1, strlen (head), fp);
1738
1739   /* Download the request body.  */
1740   flags = 0;
1741   if (keep_alive)
1742     flags |= rb_read_exactly;
1743   if (hs->restval > 0 && contrange == 0)
1744     /* If the server ignored our range request, instruct fd_read_body
1745        to skip the first RESTVAL bytes of body.  */
1746     flags |= rb_skip_startpos;
1747   hs->len = hs->restval;
1748   hs->rd_size = 0;
1749   hs->res = fd_read_body (sock, fp, contlen != -1 ? contlen : 0,
1750                           hs->restval, &hs->rd_size, &hs->len, &hs->dltime,
1751                           flags);
1752
1753   if (hs->res >= 0)
1754     CLOSE_FINISH (sock);
1755   else
1756     CLOSE_INVALIDATE (sock);
1757
1758   {
1759     /* Close or flush the file.  We have to be careful to check for
1760        error here.  Checking the result of fwrite() is not enough --
1761        errors could go unnoticed!  */
1762     int flush_res;
1763     if (!output_stream)
1764       flush_res = fclose (fp);
1765     else
1766       flush_res = fflush (fp);
1767     if (flush_res == EOF)
1768       hs->res = -2;
1769   }
1770   if (hs->res == -2)
1771     return FWRITEERR;
1772   return RETRFINISHED;
1773 }
1774
1775 /* The genuine HTTP loop!  This is the part where the retrieval is
1776    retried, and retried, and retried, and...  */
1777 uerr_t
1778 http_loop (struct url *u, char **newloc, char **local_file, const char *referer,
1779            int *dt, struct url *proxy)
1780 {
1781   int count;
1782   int use_ts, got_head = 0;     /* time-stamping info */
1783   char *filename_plus_orig_suffix;
1784   char *local_filename = NULL;
1785   char *tms, *locf, *tmrate;
1786   uerr_t err;
1787   time_t tml = -1, tmr = -1;    /* local and remote time-stamps */
1788   wgint local_size = 0;         /* the size of the local file */
1789   size_t filename_len;
1790   struct http_stat hstat;       /* HTTP status */
1791   struct_stat st;
1792   char *dummy = NULL;
1793
1794   /* This used to be done in main(), but it's a better idea to do it
1795      here so that we don't go through the hoops if we're just using
1796      FTP or whatever. */
1797   if (opt.cookies)
1798     {
1799       if (!wget_cookie_jar)
1800         wget_cookie_jar = cookie_jar_new ();
1801       if (opt.cookies_input && !cookies_loaded_p)
1802         {
1803           cookie_jar_load (wget_cookie_jar, opt.cookies_input);
1804           cookies_loaded_p = 1;
1805         }
1806     }
1807
1808   *newloc = NULL;
1809
1810   /* Warn on (likely bogus) wildcard usage in HTTP.  Don't use
1811      has_wildcards_p because it would also warn on `?', and we know that
1812      shows up in CGI paths a *lot*.  */
1813   if (strchr (u->url, '*'))
1814     logputs (LOG_VERBOSE, _("Warning: wildcards not supported in HTTP.\n"));
1815
1816   xzero (hstat);
1817
1818   /* Determine the local filename.  */
1819   if (local_file && *local_file)
1820     hstat.local_file = local_file;
1821   else if (local_file && !opt.output_document)
1822     {
1823       *local_file = url_file_name (u);
1824       hstat.local_file = local_file;
1825     }
1826   else
1827     {
1828       dummy = url_file_name (u);
1829       hstat.local_file = &dummy;
1830       /* be honest about where we will save the file */
1831       if (local_file && opt.output_document)
1832         *local_file = HYPHENP (opt.output_document) ? NULL : xstrdup (opt.output_document);
1833     }
1834
1835   if (!opt.output_document)
1836     locf = *hstat.local_file;
1837   else
1838     locf = opt.output_document;
1839
1840   hstat.referer = referer;
1841
1842   filename_len = strlen (*hstat.local_file);
1843   filename_plus_orig_suffix = alloca (filename_len + sizeof (".orig"));
1844
1845   if (opt.noclobber && file_exists_p (*hstat.local_file))
1846     {
1847       /* If opt.noclobber is turned on and file already exists, do not
1848          retrieve the file */
1849       logprintf (LOG_VERBOSE, _("\
1850 File `%s' already there, will not retrieve.\n"), *hstat.local_file);
1851       /* If the file is there, we suppose it's retrieved OK.  */
1852       *dt |= RETROKF;
1853
1854       /* #### Bogusness alert.  */
1855       /* If its suffix is "html" or "htm" or similar, assume text/html.  */
1856       if (has_html_suffix_p (*hstat.local_file))
1857         *dt |= TEXTHTML;
1858
1859       xfree_null (dummy);
1860       return RETROK;
1861     }
1862
1863   use_ts = 0;
1864   if (opt.timestamping)
1865     {
1866       int local_dot_orig_file_exists = 0;
1867
1868       if (opt.backup_converted)
1869         /* If -K is specified, we'll act on the assumption that it was specified
1870            last time these files were downloaded as well, and instead of just
1871            comparing local file X against server file X, we'll compare local
1872            file X.orig (if extant, else X) against server file X.  If -K
1873            _wasn't_ specified last time, or the server contains files called
1874            *.orig, -N will be back to not operating correctly with -k. */
1875         {
1876           /* Would a single s[n]printf() call be faster?  --dan
1877
1878              Definitely not.  sprintf() is horribly slow.  It's a
1879              different question whether the difference between the two
1880              affects a program.  Usually I'd say "no", but at one
1881              point I profiled Wget, and found that a measurable and
1882              non-negligible amount of time was lost calling sprintf()
1883              in url.c.  Replacing sprintf with inline calls to
1884              strcpy() and number_to_string() made a difference.
1885              --hniksic */
1886           memcpy (filename_plus_orig_suffix, *hstat.local_file, filename_len);
1887           memcpy (filename_plus_orig_suffix + filename_len,
1888                   ".orig", sizeof (".orig"));
1889
1890           /* Try to stat() the .orig file. */
1891           if (stat (filename_plus_orig_suffix, &st) == 0)
1892             {
1893               local_dot_orig_file_exists = 1;
1894               local_filename = filename_plus_orig_suffix;
1895             }
1896         }      
1897
1898       if (!local_dot_orig_file_exists)
1899         /* Couldn't stat() <file>.orig, so try to stat() <file>. */
1900         if (stat (*hstat.local_file, &st) == 0)
1901           local_filename = *hstat.local_file;
1902
1903       if (local_filename != NULL)
1904         /* There was a local file, so we'll check later to see if the version
1905            the server has is the same version we already have, allowing us to
1906            skip a download. */
1907         {
1908           use_ts = 1;
1909           tml = st.st_mtime;
1910 #ifdef WINDOWS
1911           /* Modification time granularity is 2 seconds for Windows, so
1912              increase local time by 1 second for later comparison. */
1913           tml++;
1914 #endif
1915           local_size = st.st_size;
1916           got_head = 0;
1917         }
1918     }
1919   /* Reset the counter.  */
1920   count = 0;
1921   *dt = 0;
1922   /* THE loop */
1923   do
1924     {
1925       /* Increment the pass counter.  */
1926       ++count;
1927       sleep_between_retrievals (count);
1928       /* Get the current time string.  */
1929       tms = time_str (NULL);
1930       /* Print fetch message, if opt.verbose.  */
1931       if (opt.verbose)
1932         {
1933           char *hurl = url_string (u, 1);
1934           char tmp[256];
1935           strcpy (tmp, "        ");
1936           if (count > 1)
1937             sprintf (tmp, _("(try:%2d)"), count);
1938           logprintf (LOG_VERBOSE, "--%s--  %s\n  %s => `%s'\n",
1939                      tms, hurl, tmp, locf);
1940 #ifdef WINDOWS
1941           ws_changetitle (hurl);
1942 #endif
1943           xfree (hurl);
1944         }
1945
1946       /* Default document type is empty.  However, if spider mode is
1947          on or time-stamping is employed, HEAD_ONLY commands is
1948          encoded within *dt.  */
1949       if (opt.spider || (use_ts && !got_head))
1950         *dt |= HEAD_ONLY;
1951       else
1952         *dt &= ~HEAD_ONLY;
1953
1954       /* Decide whether or not to restart.  */
1955       hstat.restval = 0;
1956       if (count > 1)
1957         hstat.restval = hstat.len; /* continue where we left off */
1958       else if (opt.always_rest
1959                && stat (locf, &st) == 0
1960                && S_ISREG (st.st_mode))
1961         hstat.restval = st.st_size;
1962
1963       /* Decide whether to send the no-cache directive.  We send it in
1964          two cases:
1965            a) we're using a proxy, and we're past our first retrieval.
1966               Some proxies are notorious for caching incomplete data, so
1967               we require a fresh get.
1968            b) caching is explicitly inhibited. */
1969       if ((proxy && count > 1)  /* a */
1970           || !opt.allow_cache   /* b */
1971           )
1972         *dt |= SEND_NOCACHE;
1973       else
1974         *dt &= ~SEND_NOCACHE;
1975
1976       /* Try fetching the document, or at least its head.  */
1977       err = gethttp (u, &hstat, dt, proxy);
1978
1979       /* It's unfortunate that wget determines the local filename before finding
1980          out the Content-Type of the file.  Barring a major restructuring of the
1981          code, we need to re-set locf here, since gethttp() may have xrealloc()d
1982          *hstat.local_file to tack on ".html". */
1983       if (!opt.output_document)
1984         locf = *hstat.local_file;
1985
1986       /* Time?  */
1987       tms = time_str (NULL);
1988       /* Get the new location (with or without the redirection).  */
1989       if (hstat.newloc)
1990         *newloc = xstrdup (hstat.newloc);
1991       switch (err)
1992         {
1993         case HERR: case HEOF: case CONSOCKERR: case CONCLOSED:
1994         case CONERROR: case READERR: case WRITEFAILED:
1995         case RANGEERR:
1996           /* Non-fatal errors continue executing the loop, which will
1997              bring them to "while" statement at the end, to judge
1998              whether the number of tries was exceeded.  */
1999           free_hstat (&hstat);
2000           printwhat (count, opt.ntry);
2001           continue;
2002           break;
2003         case HOSTERR: case CONIMPOSSIBLE: case PROXERR: case AUTHFAILED: 
2004         case SSLERRCTXCREATE: case CONTNOTSUPPORTED:
2005           /* Fatal errors just return from the function.  */
2006           free_hstat (&hstat);
2007           xfree_null (dummy);
2008           return err;
2009           break;
2010         case FWRITEERR: case FOPENERR:
2011           /* Another fatal error.  */
2012           logputs (LOG_VERBOSE, "\n");
2013           logprintf (LOG_NOTQUIET, _("Cannot write to `%s' (%s).\n"),
2014                      *hstat.local_file, strerror (errno));
2015           free_hstat (&hstat);
2016           xfree_null (dummy);
2017           return err;
2018           break;
2019         case CONSSLERR:
2020           /* Another fatal error.  */
2021           logputs (LOG_VERBOSE, "\n");
2022           logprintf (LOG_NOTQUIET, _("Unable to establish SSL connection.\n"));
2023           free_hstat (&hstat);
2024           xfree_null (dummy);
2025           return err;
2026           break;
2027         case NEWLOCATION:
2028           /* Return the new location to the caller.  */
2029           if (!hstat.newloc)
2030             {
2031               logprintf (LOG_NOTQUIET,
2032                          _("ERROR: Redirection (%d) without location.\n"),
2033                          hstat.statcode);
2034               free_hstat (&hstat);
2035               xfree_null (dummy);
2036               return WRONGCODE;
2037             }
2038           free_hstat (&hstat);
2039           xfree_null (dummy);
2040           return NEWLOCATION;
2041           break;
2042         case RETRUNNEEDED:
2043           /* The file was already fully retrieved. */
2044           free_hstat (&hstat);
2045           xfree_null (dummy);
2046           return RETROK;
2047           break;
2048         case RETRFINISHED:
2049           /* Deal with you later.  */
2050           break;
2051         default:
2052           /* All possibilities should have been exhausted.  */
2053           abort ();
2054         }
2055       if (!(*dt & RETROKF))
2056         {
2057           if (!opt.verbose)
2058             {
2059               /* #### Ugly ugly ugly! */
2060               char *hurl = url_string (u, 1);
2061               logprintf (LOG_NONVERBOSE, "%s:\n", hurl);
2062               xfree (hurl);
2063             }
2064           logprintf (LOG_NOTQUIET, _("%s ERROR %d: %s.\n"),
2065                      tms, hstat.statcode, hstat.error);
2066           logputs (LOG_VERBOSE, "\n");
2067           free_hstat (&hstat);
2068           xfree_null (dummy);
2069           return WRONGCODE;
2070         }
2071
2072       /* Did we get the time-stamp?  */
2073       if (!got_head)
2074         {
2075           if (opt.timestamping && !hstat.remote_time)
2076             {
2077               logputs (LOG_NOTQUIET, _("\
2078 Last-modified header missing -- time-stamps turned off.\n"));
2079             }
2080           else if (hstat.remote_time)
2081             {
2082               /* Convert the date-string into struct tm.  */
2083               tmr = http_atotm (hstat.remote_time);
2084               if (tmr == (time_t) (-1))
2085                 logputs (LOG_VERBOSE, _("\
2086 Last-modified header invalid -- time-stamp ignored.\n"));
2087             }
2088         }
2089
2090       /* The time-stamping section.  */
2091       if (use_ts)
2092         {
2093           got_head = 1;
2094           *dt &= ~HEAD_ONLY;
2095           use_ts = 0;           /* no more time-stamping */
2096           count = 0;            /* the retrieve count for HEAD is
2097                                    reset */
2098           if (hstat.remote_time && tmr != (time_t) (-1))
2099             {
2100               /* Now time-stamping can be used validly.  Time-stamping
2101                  means that if the sizes of the local and remote file
2102                  match, and local file is newer than the remote file,
2103                  it will not be retrieved.  Otherwise, the normal
2104                  download procedure is resumed.  */
2105               if (tml >= tmr &&
2106                   (hstat.contlen == -1 || local_size == hstat.contlen))
2107                 {
2108                   logprintf (LOG_VERBOSE, _("\
2109 Server file no newer than local file `%s' -- not retrieving.\n\n"),
2110                              local_filename);
2111                   free_hstat (&hstat);
2112                   xfree_null (dummy);
2113                   return RETROK;
2114                 }
2115               else if (tml >= tmr)
2116                 logprintf (LOG_VERBOSE, _("\
2117 The sizes do not match (local %s) -- retrieving.\n"),
2118                            number_to_static_string (local_size));
2119               else
2120                 logputs (LOG_VERBOSE,
2121                          _("Remote file is newer, retrieving.\n"));
2122             }
2123           free_hstat (&hstat);
2124           continue;
2125         }
2126       if ((tmr != (time_t) (-1))
2127           && !opt.spider
2128           && ((hstat.len == hstat.contlen) ||
2129               ((hstat.res == 0) &&
2130                ((hstat.contlen == -1) ||
2131                 (hstat.len >= hstat.contlen && !opt.kill_longer)))))
2132         {
2133           /* #### This code repeats in http.c and ftp.c.  Move it to a
2134              function!  */
2135           const char *fl = NULL;
2136           if (opt.output_document)
2137             {
2138               if (output_stream_regular)
2139                 fl = opt.output_document;
2140             }
2141           else
2142             fl = *hstat.local_file;
2143           if (fl)
2144             touch (fl, tmr);
2145         }
2146       /* End of time-stamping section.  */
2147
2148       if (opt.spider)
2149         {
2150           logprintf (LOG_NOTQUIET, "%d %s\n\n", hstat.statcode, hstat.error);
2151           xfree_null (dummy);
2152           return RETROK;
2153         }
2154
2155       tmrate = retr_rate (hstat.rd_size, hstat.dltime, 0);
2156
2157       if (hstat.len == hstat.contlen)
2158         {
2159           if (*dt & RETROKF)
2160             {
2161               logprintf (LOG_VERBOSE,
2162                          _("%s (%s) - `%s' saved [%s/%s]\n\n"),
2163                          tms, tmrate, locf,
2164                          number_to_static_string (hstat.len),
2165                          number_to_static_string (hstat.contlen));
2166               logprintf (LOG_NONVERBOSE,
2167                          "%s URL:%s [%s/%s] -> \"%s\" [%d]\n",
2168                          tms, u->url,
2169                          number_to_static_string (hstat.len),
2170                          number_to_static_string (hstat.contlen),
2171                          locf, count);
2172             }
2173           ++opt.numurls;
2174           total_downloaded_bytes += hstat.len;
2175
2176           /* Remember that we downloaded the file for later ".orig" code. */
2177           if (*dt & ADDED_HTML_EXTENSION)
2178             downloaded_file(FILE_DOWNLOADED_AND_HTML_EXTENSION_ADDED, locf);
2179           else
2180             downloaded_file(FILE_DOWNLOADED_NORMALLY, locf);
2181
2182           free_hstat (&hstat);
2183           xfree_null (dummy);
2184           return RETROK;
2185         }
2186       else if (hstat.res == 0) /* No read error */
2187         {
2188           if (hstat.contlen == -1)  /* We don't know how much we were supposed
2189                                        to get, so assume we succeeded. */ 
2190             {
2191               if (*dt & RETROKF)
2192                 {
2193                   logprintf (LOG_VERBOSE,
2194                              _("%s (%s) - `%s' saved [%s]\n\n"),
2195                              tms, tmrate, locf,
2196                              number_to_static_string (hstat.len));
2197                   logprintf (LOG_NONVERBOSE,
2198                              "%s URL:%s [%s] -> \"%s\" [%d]\n",
2199                              tms, u->url, number_to_static_string (hstat.len),
2200                              locf, count);
2201                 }
2202               ++opt.numurls;
2203               total_downloaded_bytes += hstat.len;
2204
2205               /* Remember that we downloaded the file for later ".orig" code. */
2206               if (*dt & ADDED_HTML_EXTENSION)
2207                 downloaded_file(FILE_DOWNLOADED_AND_HTML_EXTENSION_ADDED, locf);
2208               else
2209                 downloaded_file(FILE_DOWNLOADED_NORMALLY, locf);
2210               
2211               free_hstat (&hstat);
2212               xfree_null (dummy);
2213               return RETROK;
2214             }
2215           else if (hstat.len < hstat.contlen) /* meaning we lost the
2216                                                  connection too soon */
2217             {
2218               logprintf (LOG_VERBOSE,
2219                          _("%s (%s) - Connection closed at byte %s. "),
2220                          tms, tmrate, number_to_static_string (hstat.len));
2221               printwhat (count, opt.ntry);
2222               free_hstat (&hstat);
2223               continue;
2224             }
2225           else if (!opt.kill_longer) /* meaning we got more than expected */
2226             {
2227               logprintf (LOG_VERBOSE,
2228                          _("%s (%s) - `%s' saved [%s/%s])\n\n"),
2229                          tms, tmrate, locf,
2230                          number_to_static_string (hstat.len),
2231                          number_to_static_string (hstat.contlen));
2232               logprintf (LOG_NONVERBOSE,
2233                          "%s URL:%s [%s/%s] -> \"%s\" [%d]\n",
2234                          tms, u->url,
2235                          number_to_static_string (hstat.len),
2236                          number_to_static_string (hstat.contlen),
2237                          locf, count);
2238               ++opt.numurls;
2239               total_downloaded_bytes += hstat.len;
2240
2241               /* Remember that we downloaded the file for later ".orig" code. */
2242               if (*dt & ADDED_HTML_EXTENSION)
2243                 downloaded_file(FILE_DOWNLOADED_AND_HTML_EXTENSION_ADDED, locf);
2244               else
2245                 downloaded_file(FILE_DOWNLOADED_NORMALLY, locf);
2246               
2247               free_hstat (&hstat);
2248               xfree_null (dummy);
2249               return RETROK;
2250             }
2251           else                  /* the same, but not accepted */
2252             {
2253               logprintf (LOG_VERBOSE,
2254                          _("%s (%s) - Connection closed at byte %s/%s. "),
2255                          tms, tmrate,
2256                          number_to_static_string (hstat.len),
2257                          number_to_static_string (hstat.contlen));
2258               printwhat (count, opt.ntry);
2259               free_hstat (&hstat);
2260               continue;
2261             }
2262         }
2263       else                      /* now hstat.res can only be -1 */
2264         {
2265           if (hstat.contlen == -1)
2266             {
2267               logprintf (LOG_VERBOSE,
2268                          _("%s (%s) - Read error at byte %s (%s)."),
2269                          tms, tmrate, number_to_static_string (hstat.len),
2270                          strerror (errno));
2271               printwhat (count, opt.ntry);
2272               free_hstat (&hstat);
2273               continue;
2274             }
2275           else                  /* hstat.res == -1 and contlen is given */
2276             {
2277               logprintf (LOG_VERBOSE,
2278                          _("%s (%s) - Read error at byte %s/%s (%s). "),
2279                          tms, tmrate,
2280                          number_to_static_string (hstat.len),
2281                          number_to_static_string (hstat.contlen),
2282                          strerror (errno));
2283               printwhat (count, opt.ntry);
2284               free_hstat (&hstat);
2285               continue;
2286             }
2287         }
2288       /* not reached */
2289       break;
2290     }
2291   while (!opt.ntry || (count < opt.ntry));
2292   return TRYLIMEXC;
2293 }
2294 \f
2295 /* Converts struct tm to time_t, assuming the data in tm is UTC rather
2296    than local timezone.
2297
2298    mktime is similar but assumes struct tm, also known as the
2299    "broken-down" form of time, is in local time zone.  mktime_from_utc
2300    uses mktime to make the conversion understanding that an offset
2301    will be introduced by the local time assumption.
2302
2303    mktime_from_utc then measures the introduced offset by applying
2304    gmtime to the initial result and applying mktime to the resulting
2305    "broken-down" form.  The difference between the two mktime results
2306    is the measured offset which is then subtracted from the initial
2307    mktime result to yield a calendar time which is the value returned.
2308
2309    tm_isdst in struct tm is set to 0 to force mktime to introduce a
2310    consistent offset (the non DST offset) since tm and tm+o might be
2311    on opposite sides of a DST change.
2312
2313    Some implementations of mktime return -1 for the nonexistent
2314    localtime hour at the beginning of DST.  In this event, use
2315    mktime(tm - 1hr) + 3600.
2316
2317    Schematically
2318      mktime(tm)   --> t+o
2319      gmtime(t+o)  --> tm+o
2320      mktime(tm+o) --> t+2o
2321      t+o - (t+2o - t+o) = t
2322
2323    Note that glibc contains a function of the same purpose named
2324    `timegm' (reverse of gmtime).  But obviously, it is not universally
2325    available, and unfortunately it is not straightforwardly
2326    extractable for use here.  Perhaps configure should detect timegm
2327    and use it where available.
2328
2329    Contributed by Roger Beeman <beeman@cisco.com>, with the help of
2330    Mark Baushke <mdb@cisco.com> and the rest of the Gurus at CISCO.
2331    Further improved by Roger with assistance from Edward J. Sabol
2332    based on input by Jamie Zawinski.  */
2333
2334 static time_t
2335 mktime_from_utc (struct tm *t)
2336 {
2337   time_t tl, tb;
2338   struct tm *tg;
2339
2340   tl = mktime (t);
2341   if (tl == -1)
2342     {
2343       t->tm_hour--;
2344       tl = mktime (t);
2345       if (tl == -1)
2346         return -1; /* can't deal with output from strptime */
2347       tl += 3600;
2348     }
2349   tg = gmtime (&tl);
2350   tg->tm_isdst = 0;
2351   tb = mktime (tg);
2352   if (tb == -1)
2353     {
2354       tg->tm_hour--;
2355       tb = mktime (tg);
2356       if (tb == -1)
2357         return -1; /* can't deal with output from gmtime */
2358       tb += 3600;
2359     }
2360   return (tl - (tb - tl));
2361 }
2362
2363 /* Check whether the result of strptime() indicates success.
2364    strptime() returns the pointer to how far it got to in the string.
2365    The processing has been successful if the string is at `GMT' or
2366    `+X', or at the end of the string.
2367
2368    In extended regexp parlance, the function returns 1 if P matches
2369    "^ *(GMT|[+-][0-9]|$)", 0 otherwise.  P being NULL (which strptime
2370    can return) is considered a failure and 0 is returned.  */
2371 static int
2372 check_end (const char *p)
2373 {
2374   if (!p)
2375     return 0;
2376   while (ISSPACE (*p))
2377     ++p;
2378   if (!*p
2379       || (p[0] == 'G' && p[1] == 'M' && p[2] == 'T')
2380       || ((p[0] == '+' || p[0] == '-') && ISDIGIT (p[1])))
2381     return 1;
2382   else
2383     return 0;
2384 }
2385
2386 /* Convert the textual specification of time in TIME_STRING to the
2387    number of seconds since the Epoch.
2388
2389    TIME_STRING can be in any of the three formats RFC2068 allows the
2390    HTTP servers to emit -- RFC1123-date, RFC850-date or asctime-date.
2391    Timezones are ignored, and should be GMT.
2392
2393    Return the computed time_t representation, or -1 if the conversion
2394    fails.
2395
2396    This function uses strptime with various string formats for parsing
2397    TIME_STRING.  This results in a parser that is not as lenient in
2398    interpreting TIME_STRING as I would like it to be.  Being based on
2399    strptime, it always allows shortened months, one-digit days, etc.,
2400    but due to the multitude of formats in which time can be
2401    represented, an ideal HTTP time parser would be even more
2402    forgiving.  It should completely ignore things like week days and
2403    concentrate only on the various forms of representing years,
2404    months, days, hours, minutes, and seconds.  For example, it would
2405    be nice if it accepted ISO 8601 out of the box.
2406
2407    I've investigated free and PD code for this purpose, but none was
2408    usable.  getdate was big and unwieldy, and had potential copyright
2409    issues, or so I was informed.  Dr. Marcus Hennecke's atotm(),
2410    distributed with phttpd, is excellent, but we cannot use it because
2411    it is not assigned to the FSF.  So I stuck it with strptime.  */
2412
2413 time_t
2414 http_atotm (const char *time_string)
2415 {
2416   /* NOTE: Solaris strptime man page claims that %n and %t match white
2417      space, but that's not universally available.  Instead, we simply
2418      use ` ' to mean "skip all WS", which works under all strptime
2419      implementations I've tested.  */
2420
2421   static const char *time_formats[] = {
2422     "%a, %d %b %Y %T",          /* RFC1123: Thu, 29 Jan 1998 22:12:57 */
2423     "%A, %d-%b-%y %T",          /* RFC850:  Thursday, 29-Jan-98 22:12:57 */
2424     "%a, %d-%b-%Y %T",          /* pseudo-RFC850:  Thu, 29-Jan-1998 22:12:57
2425                                    (google.com uses this for their cookies.) */
2426     "%a %b %d %T %Y"            /* asctime: Thu Jan 29 22:12:57 1998 */
2427   };
2428
2429   int i;
2430   struct tm t;
2431
2432   /* According to Roger Beeman, we need to initialize tm_isdst, since
2433      strptime won't do it.  */
2434   t.tm_isdst = 0;
2435
2436   /* Note that under foreign locales Solaris strptime() fails to
2437      recognize English dates, which renders this function useless.  We
2438      solve this by being careful not to affect LC_TIME when
2439      initializing locale.
2440
2441      Another solution would be to temporarily set locale to C, invoke
2442      strptime(), and restore it back.  This is slow and dirty,
2443      however, and locale support other than LC_MESSAGES can mess other
2444      things, so I rather chose to stick with just setting LC_MESSAGES.
2445
2446      GNU strptime does not have this problem because it recognizes
2447      both international and local dates.  */
2448
2449   for (i = 0; i < countof (time_formats); i++)
2450     if (check_end (strptime (time_string, time_formats[i], &t)))
2451       return mktime_from_utc (&t);
2452
2453   /* All formats have failed.  */
2454   return -1;
2455 }
2456 \f
2457 /* Authorization support: We support two authorization schemes:
2458
2459    * `Basic' scheme, consisting of base64-ing USER:PASSWORD string;
2460
2461    * `Digest' scheme, added by Junio Hamano <junio@twinsun.com>,
2462    consisting of answering to the server's challenge with the proper
2463    MD5 digests.  */
2464
2465 /* How many bytes it will take to store LEN bytes in base64.  */
2466 #define BASE64_LENGTH(len) (4 * (((len) + 2) / 3))
2467
2468 /* Encode the string S of length LENGTH to base64 format and place it
2469    to STORE.  STORE will be 0-terminated, and must point to a writable
2470    buffer of at least 1+BASE64_LENGTH(length) bytes.  */
2471 static void
2472 base64_encode (const char *s, char *store, int length)
2473 {
2474   /* Conversion table.  */
2475   static char tbl[64] = {
2476     'A','B','C','D','E','F','G','H',
2477     'I','J','K','L','M','N','O','P',
2478     'Q','R','S','T','U','V','W','X',
2479     'Y','Z','a','b','c','d','e','f',
2480     'g','h','i','j','k','l','m','n',
2481     'o','p','q','r','s','t','u','v',
2482     'w','x','y','z','0','1','2','3',
2483     '4','5','6','7','8','9','+','/'
2484   };
2485   int i;
2486   unsigned char *p = (unsigned char *)store;
2487
2488   /* Transform the 3x8 bits to 4x6 bits, as required by base64.  */
2489   for (i = 0; i < length; i += 3)
2490     {
2491       *p++ = tbl[s[0] >> 2];
2492       *p++ = tbl[((s[0] & 3) << 4) + (s[1] >> 4)];
2493       *p++ = tbl[((s[1] & 0xf) << 2) + (s[2] >> 6)];
2494       *p++ = tbl[s[2] & 0x3f];
2495       s += 3;
2496     }
2497   /* Pad the result if necessary...  */
2498   if (i == length + 1)
2499     *(p - 1) = '=';
2500   else if (i == length + 2)
2501     *(p - 1) = *(p - 2) = '=';
2502   /* ...and zero-terminate it.  */
2503   *p = '\0';
2504 }
2505
2506 /* Create the authentication header contents for the `Basic' scheme.
2507    This is done by encoding the string `USER:PASS' in base64 and
2508    prepending `HEADER: Basic ' to it.  */
2509 static char *
2510 basic_authentication_encode (const char *user, const char *passwd)
2511 {
2512   char *t1, *t2, *res;
2513   int len1 = strlen (user) + 1 + strlen (passwd);
2514   int len2 = BASE64_LENGTH (len1);
2515
2516   t1 = (char *)alloca (len1 + 1);
2517   sprintf (t1, "%s:%s", user, passwd);
2518
2519   t2 = (char *)alloca (len2 + 1);
2520   base64_encode (t1, t2, len1);
2521
2522   res = (char *)xmalloc (6 + len2 + 1);
2523   sprintf (res, "Basic %s", t2);
2524
2525   return res;
2526 }
2527
2528 #define SKIP_WS(x) do {                         \
2529   while (ISSPACE (*(x)))                        \
2530     ++(x);                                      \
2531 } while (0)
2532
2533 #ifdef USE_DIGEST
2534 /* Parse HTTP `WWW-Authenticate:' header.  AU points to the beginning
2535    of a field in such a header.  If the field is the one specified by
2536    ATTR_NAME ("realm", "opaque", and "nonce" are used by the current
2537    digest authorization code), extract its value in the (char*)
2538    variable pointed by RET.  Returns negative on a malformed header,
2539    or number of bytes that have been parsed by this call.  */
2540 static int
2541 extract_header_attr (const char *au, const char *attr_name, char **ret)
2542 {
2543   const char *cp, *ep;
2544
2545   ep = cp = au;
2546
2547   if (strncmp (cp, attr_name, strlen (attr_name)) == 0)
2548     {
2549       cp += strlen (attr_name);
2550       if (!*cp)
2551         return -1;
2552       SKIP_WS (cp);
2553       if (*cp != '=')
2554         return -1;
2555       if (!*++cp)
2556         return -1;
2557       SKIP_WS (cp);
2558       if (*cp != '\"')
2559         return -1;
2560       if (!*++cp)
2561         return -1;
2562       for (ep = cp; *ep && *ep != '\"'; ep++)
2563         ;
2564       if (!*ep)
2565         return -1;
2566       xfree_null (*ret);
2567       *ret = strdupdelim (cp, ep);
2568       return ep - au + 1;
2569     }
2570   else
2571     return 0;
2572 }
2573
2574 /* Dump the hexadecimal representation of HASH to BUF.  HASH should be
2575    an array of 16 bytes containing the hash keys, and BUF should be a
2576    buffer of 33 writable characters (32 for hex digits plus one for
2577    zero termination).  */
2578 static void
2579 dump_hash (unsigned char *buf, const unsigned char *hash)
2580 {
2581   int i;
2582
2583   for (i = 0; i < MD5_HASHLEN; i++, hash++)
2584     {
2585       *buf++ = XNUM_TO_digit (*hash >> 4);
2586       *buf++ = XNUM_TO_digit (*hash & 0xf);
2587     }
2588   *buf = '\0';
2589 }
2590
2591 /* Take the line apart to find the challenge, and compose a digest
2592    authorization header.  See RFC2069 section 2.1.2.  */
2593 static char *
2594 digest_authentication_encode (const char *au, const char *user,
2595                               const char *passwd, const char *method,
2596                               const char *path)
2597 {
2598   static char *realm, *opaque, *nonce;
2599   static struct {
2600     const char *name;
2601     char **variable;
2602   } options[] = {
2603     { "realm", &realm },
2604     { "opaque", &opaque },
2605     { "nonce", &nonce }
2606   };
2607   char *res;
2608
2609   realm = opaque = nonce = NULL;
2610
2611   au += 6;                      /* skip over `Digest' */
2612   while (*au)
2613     {
2614       int i;
2615
2616       SKIP_WS (au);
2617       for (i = 0; i < countof (options); i++)
2618         {
2619           int skip = extract_header_attr (au, options[i].name,
2620                                           options[i].variable);
2621           if (skip < 0)
2622             {
2623               xfree_null (realm);
2624               xfree_null (opaque);
2625               xfree_null (nonce);
2626               return NULL;
2627             }
2628           else if (skip)
2629             {
2630               au += skip;
2631               break;
2632             }
2633         }
2634       if (i == countof (options))
2635         {
2636           while (*au && *au != '=')
2637             au++;
2638           if (*au && *++au)
2639             {
2640               SKIP_WS (au);
2641               if (*au == '\"')
2642                 {
2643                   au++;
2644                   while (*au && *au != '\"')
2645                     au++;
2646                   if (*au)
2647                     au++;
2648                 }
2649             }
2650         }
2651       while (*au && *au != ',')
2652         au++;
2653       if (*au)
2654         au++;
2655     }
2656   if (!realm || !nonce || !user || !passwd || !path || !method)
2657     {
2658       xfree_null (realm);
2659       xfree_null (opaque);
2660       xfree_null (nonce);
2661       return NULL;
2662     }
2663
2664   /* Calculate the digest value.  */
2665   {
2666     ALLOCA_MD5_CONTEXT (ctx);
2667     unsigned char hash[MD5_HASHLEN];
2668     unsigned char a1buf[MD5_HASHLEN * 2 + 1], a2buf[MD5_HASHLEN * 2 + 1];
2669     unsigned char response_digest[MD5_HASHLEN * 2 + 1];
2670
2671     /* A1BUF = H(user ":" realm ":" password) */
2672     gen_md5_init (ctx);
2673     gen_md5_update ((unsigned char *)user, strlen (user), ctx);
2674     gen_md5_update ((unsigned char *)":", 1, ctx);
2675     gen_md5_update ((unsigned char *)realm, strlen (realm), ctx);
2676     gen_md5_update ((unsigned char *)":", 1, ctx);
2677     gen_md5_update ((unsigned char *)passwd, strlen (passwd), ctx);
2678     gen_md5_finish (ctx, hash);
2679     dump_hash (a1buf, hash);
2680
2681     /* A2BUF = H(method ":" path) */
2682     gen_md5_init (ctx);
2683     gen_md5_update ((unsigned char *)method, strlen (method), ctx);
2684     gen_md5_update ((unsigned char *)":", 1, ctx);
2685     gen_md5_update ((unsigned char *)path, strlen (path), ctx);
2686     gen_md5_finish (ctx, hash);
2687     dump_hash (a2buf, hash);
2688
2689     /* RESPONSE_DIGEST = H(A1BUF ":" nonce ":" A2BUF) */
2690     gen_md5_init (ctx);
2691     gen_md5_update (a1buf, MD5_HASHLEN * 2, ctx);
2692     gen_md5_update ((unsigned char *)":", 1, ctx);
2693     gen_md5_update ((unsigned char *)nonce, strlen (nonce), ctx);
2694     gen_md5_update ((unsigned char *)":", 1, ctx);
2695     gen_md5_update (a2buf, MD5_HASHLEN * 2, ctx);
2696     gen_md5_finish (ctx, hash);
2697     dump_hash (response_digest, hash);
2698
2699     res = (char*) xmalloc (strlen (user)
2700                            + strlen (user)
2701                            + strlen (realm)
2702                            + strlen (nonce)
2703                            + strlen (path)
2704                            + 2 * MD5_HASHLEN /*strlen (response_digest)*/
2705                            + (opaque ? strlen (opaque) : 0)
2706                            + 128);
2707     sprintf (res, "Digest \
2708 username=\"%s\", realm=\"%s\", nonce=\"%s\", uri=\"%s\", response=\"%s\"",
2709              user, realm, nonce, path, response_digest);
2710     if (opaque)
2711       {
2712         char *p = res + strlen (res);
2713         strcat (p, ", opaque=\"");
2714         strcat (p, opaque);
2715         strcat (p, "\"");
2716       }
2717   }
2718   return res;
2719 }
2720 #endif /* USE_DIGEST */
2721
2722
2723 #define BEGINS_WITH(line, string_constant)                              \
2724   (!strncasecmp (line, string_constant, sizeof (string_constant) - 1)   \
2725    && (ISSPACE (line[sizeof (string_constant) - 1])                     \
2726        || !line[sizeof (string_constant) - 1]))
2727
2728 static int
2729 known_authentication_scheme_p (const char *au)
2730 {
2731   return BEGINS_WITH (au, "Basic")
2732     || BEGINS_WITH (au, "Digest")
2733     || BEGINS_WITH (au, "NTLM");
2734 }
2735
2736 #undef BEGINS_WITH
2737
2738 /* Create the HTTP authorization request header.  When the
2739    `WWW-Authenticate' response header is seen, according to the
2740    authorization scheme specified in that header (`Basic' and `Digest'
2741    are supported by the current implementation), produce an
2742    appropriate HTTP authorization request header.  */
2743 static char *
2744 create_authorization_line (const char *au, const char *user,
2745                            const char *passwd, const char *method,
2746                            const char *path)
2747 {
2748   if (0 == strncasecmp (au, "Basic", 5))
2749     return basic_authentication_encode (user, passwd);
2750 #ifdef USE_DIGEST
2751   if (0 == strncasecmp (au, "Digest", 6))
2752     return digest_authentication_encode (au, user, passwd, method, path);
2753 #endif /* USE_DIGEST */
2754   return NULL;
2755 }
2756 \f
2757 void
2758 http_cleanup (void)
2759 {
2760 }