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