]> sjero.net Git - wget/blob - src/http.c
[svn] Fixes by Christian Biere:
[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;
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   proxyauth = NULL;
1117   if (proxy)
1118     {
1119       char *proxy_user, *proxy_passwd;
1120       /* For normal username and password, URL components override
1121          command-line/wgetrc parameters.  With proxy
1122          authentication, it's the reverse, because proxy URLs are
1123          normally the "permanent" ones, so command-line args
1124          should take precedence.  */
1125       if (opt.proxy_user && opt.proxy_passwd)
1126         {
1127           proxy_user = opt.proxy_user;
1128           proxy_passwd = opt.proxy_passwd;
1129         }
1130       else
1131         {
1132           proxy_user = proxy->user;
1133           proxy_passwd = proxy->passwd;
1134         }
1135       /* #### This does not appear right.  Can't the proxy request,
1136          say, `Digest' authentication?  */
1137       if (proxy_user && proxy_passwd)
1138         proxyauth = basic_authentication_encode (proxy_user, proxy_passwd);
1139
1140       /* If we're using a proxy, we will be connecting to the proxy
1141          server.  */
1142       conn = proxy;
1143     }
1144
1145   /* Prepare the request to send. */
1146
1147   req = request_new ();
1148   {
1149     const char *meth = "GET";
1150     if (*dt & HEAD_ONLY)
1151       meth = "HEAD";
1152     else if (opt.post_file_name || opt.post_data)
1153       meth = "POST";
1154     /* Use the full path, i.e. one that includes the leading slash and
1155        the query string.  E.g. if u->path is "foo/bar" and u->query is
1156        "param=value", full_path will be "/foo/bar?param=value".  */
1157     request_set_method (req, meth,
1158                         proxy ? xstrdup (u->url) : url_full_path (u));
1159   }
1160
1161   request_set_header (req, "Referer", (char *) hs->referer, rel_none);
1162   if (*dt & SEND_NOCACHE)
1163     request_set_header (req, "Pragma", "no-cache", rel_none);
1164   if (hs->restval)
1165     request_set_header (req, "Range",
1166                         aprintf ("bytes=%ld-", hs->restval), rel_value);
1167   if (opt.useragent)
1168     request_set_header (req, "User-Agent", opt.useragent, rel_none);
1169   else
1170     request_set_header (req, "User-Agent",
1171                         aprintf ("Wget/%s", version_string), rel_value);
1172   request_set_header (req, "Accept", "*/*", rel_none);
1173
1174   /* Find the username and password for authentication. */
1175   user = u->user;
1176   passwd = u->passwd;
1177   search_netrc (u->host, (const char **)&user, (const char **)&passwd, 0);
1178   user = user ? user : opt.http_user;
1179   passwd = passwd ? passwd : opt.http_passwd;
1180
1181   if (user && passwd)
1182     {
1183       /* We have the username and the password, but haven't tried
1184          any authorization yet.  Let's see if the "Basic" method
1185          works.  If not, we'll come back here and construct a
1186          proper authorization method with the right challenges.
1187
1188          If we didn't employ this kind of logic, every URL that
1189          requires authorization would have to be processed twice,
1190          which is very suboptimal and generates a bunch of false
1191          "unauthorized" errors in the server log.
1192
1193          #### But this logic also has a serious problem when used
1194          with stronger authentications: we *first* transmit the
1195          username and the password in clear text, and *then* attempt a
1196          stronger authentication scheme.  That cannot be right!  We
1197          are only fortunate that almost everyone still uses the
1198          `Basic' scheme anyway.
1199
1200          There should be an option to prevent this from happening, for
1201          those who use strong authentication schemes and value their
1202          passwords.  */
1203       request_set_header (req, "Authorization",
1204                           basic_authentication_encode (user, passwd),
1205                           rel_value);
1206     }
1207
1208   {
1209     /* Whether we need to print the host header with braces around
1210        host, e.g. "Host: [3ffe:8100:200:2::2]:1234" instead of the
1211        usual "Host: symbolic-name:1234". */
1212     int squares = strchr (u->host, ':') != NULL;
1213     if (u->port == scheme_default_port (u->scheme))
1214       request_set_header (req, "Host",
1215                           aprintf (squares ? "[%s]" : "%s", u->host),
1216                           rel_value);
1217     else
1218       request_set_header (req, "Host",
1219                           aprintf (squares ? "[%s]:%d" : "%s:%d",
1220                                    u->host, u->port),
1221                           rel_value);
1222   }
1223
1224   if (!inhibit_keep_alive)
1225     request_set_header (req, "Connection", "Keep-Alive", rel_none);
1226
1227   if (opt.cookies)
1228     request_set_header (req, "Cookie",
1229                         cookie_header (wget_cookie_jar,
1230                                        u->host, u->port, u->path,
1231 #ifdef HAVE_SSL
1232                                        u->scheme == SCHEME_HTTPS
1233 #else
1234                                        0
1235 #endif
1236                                        ),
1237                         rel_value);
1238
1239   if (opt.post_data || opt.post_file_name)
1240     {
1241       request_set_header (req, "Content-Type",
1242                           "application/x-www-form-urlencoded", rel_none);
1243       if (opt.post_data)
1244         post_data_size = strlen (opt.post_data);
1245       else
1246         {
1247           post_data_size = file_size (opt.post_file_name);
1248           if (post_data_size == -1)
1249             {
1250               logprintf (LOG_NOTQUIET, "POST data file missing: %s\n",
1251                          opt.post_file_name);
1252               post_data_size = 0;
1253             }
1254         }
1255       request_set_header (req, "Content-Length",
1256                           aprintf ("%ld", post_data_size), rel_value);
1257     }
1258
1259   /* Add the user headers. */
1260   if (opt.user_headers)
1261     {
1262       int i;
1263       for (i = 0; opt.user_headers[i]; i++)
1264         request_set_user_header (req, opt.user_headers[i]);
1265     }
1266
1267  retry_with_auth:
1268   /* We need to come back here when the initial attempt to retrieve
1269      without authorization header fails.  (Expected to happen at least
1270      for the Digest authorization scheme.)  */
1271
1272   keep_alive = 0;
1273
1274   /* Establish the connection.  */
1275
1276   if (!inhibit_keep_alive)
1277     {
1278       /* Look for a persistent connection to target host, unless a
1279          proxy is used.  The exception is when SSL is in use, in which
1280          case the proxy is nothing but a passthrough to the target
1281          host, registered as a connection to the latter.  */
1282       struct url *relevant = conn;
1283 #ifdef HAVE_SSL
1284       if (u->scheme == SCHEME_HTTPS)
1285         relevant = u;
1286 #endif
1287
1288       if (persistent_available_p (relevant->host, relevant->port,
1289 #ifdef HAVE_SSL
1290                                   relevant->scheme == SCHEME_HTTPS,
1291 #else
1292                                   0,
1293 #endif
1294                                   &host_lookup_failed))
1295         {
1296           sock = pconn.socket;
1297           using_ssl = pconn.ssl;
1298           logprintf (LOG_VERBOSE, _("Reusing existing connection to %s:%d.\n"),
1299                      pconn.host, pconn.port);
1300           DEBUGP (("Reusing fd %d.\n", sock));
1301         }
1302     }
1303
1304   if (sock < 0)
1305     {
1306       /* In its current implementation, persistent_available_p will
1307          look up conn->host in some cases.  If that lookup failed, we
1308          don't need to bother with connect_to_host.  */
1309       if (host_lookup_failed)
1310         return HOSTERR;
1311
1312       sock = connect_to_host (conn->host, conn->port);
1313       if (sock == E_HOST)
1314         return HOSTERR;
1315       else if (sock < 0)
1316         return (retryable_socket_connect_error (errno)
1317                 ? CONERROR : CONIMPOSSIBLE);
1318
1319 #ifdef HAVE_SSL
1320       if (proxy && u->scheme == SCHEME_HTTPS)
1321         {
1322           /* When requesting SSL URLs through proxies, use the
1323              CONNECT method to request passthrough.  */
1324           struct request *connreq = request_new ();
1325           request_set_method (connreq, "CONNECT",
1326                               aprintf ("%s:%d", u->host, u->port));
1327           if (proxyauth)
1328             {
1329               request_set_header (connreq, "Proxy-Authorization",
1330                                   proxyauth, rel_value);
1331               /* Now that PROXYAUTH is part of the CONNECT request,
1332                  zero it out so we don't send proxy authorization with
1333                  the regular request below.  */
1334               proxyauth = NULL;
1335             }
1336
1337           write_error = request_send (connreq, sock);
1338           request_free (connreq);
1339           if (write_error < 0)
1340             {
1341               logprintf (LOG_VERBOSE, _("Failed writing to proxy: %s.\n"),
1342                          strerror (errno));
1343               CLOSE_INVALIDATE (sock);
1344               return WRITEFAILED;
1345             }
1346
1347           head = fd_read_http_head (sock);
1348           if (!head)
1349             {
1350               logprintf (LOG_VERBOSE, _("Failed reading proxy response: %s\n"),
1351                          strerror (errno));
1352               CLOSE_INVALIDATE (sock);
1353               return HERR;
1354             }
1355           message = NULL;
1356           if (!*head)
1357             {
1358               xfree (head);
1359               goto failed_tunnel;
1360             }
1361           DEBUGP (("proxy responded with: [%s]\n", head));
1362
1363           resp = response_new (head);
1364           statcode = response_status (resp, &message);
1365           response_free (resp);
1366           if (statcode != 200)
1367             {
1368             failed_tunnel:
1369               logprintf (LOG_NOTQUIET, _("Proxy tunneling failed: %s"),
1370                          message ? message : "?");
1371               xfree_null (message);
1372               return CONSSLERR;
1373             }
1374           xfree (message);
1375
1376           /* SOCK is now *really* connected to u->host, so update CONN
1377              to reflect this.  That way register_persistent will
1378              register SOCK as being connected to u->host:u->port.  */
1379           conn = u;
1380         }
1381
1382       if (conn->scheme == SCHEME_HTTPS)
1383         {
1384           if (!ssl_connect (sock))
1385             {
1386               fd_close (sock);
1387               return CONSSLERR;
1388             }
1389           using_ssl = 1;
1390         }
1391 #endif /* HAVE_SSL */
1392     }
1393
1394   /* Send the request to server.  */
1395   write_error = request_send (req, sock);
1396
1397   if (write_error >= 0)
1398     {
1399       if (opt.post_data)
1400         {
1401           DEBUGP (("[POST data: %s]\n", opt.post_data));
1402           write_error = fd_write (sock, opt.post_data, post_data_size, -1);
1403         }
1404       else if (opt.post_file_name && post_data_size != 0)
1405         write_error = post_file (sock, opt.post_file_name, post_data_size);
1406     }
1407
1408   if (write_error < 0)
1409     {
1410       logprintf (LOG_VERBOSE, _("Failed writing HTTP request: %s.\n"),
1411                  strerror (errno));
1412       CLOSE_INVALIDATE (sock);
1413       request_free (req);
1414       return WRITEFAILED;
1415     }
1416   logprintf (LOG_VERBOSE, _("%s request sent, awaiting response... "),
1417              proxy ? "Proxy" : "HTTP");
1418   contlen = -1;
1419   contrange = 0;
1420   type = NULL;
1421   statcode = -1;
1422   *dt &= ~RETROKF;
1423
1424   head = fd_read_http_head (sock);
1425   if (!head)
1426     {
1427       if (errno == 0)
1428         {
1429           logputs (LOG_NOTQUIET, _("No data received.\n"));
1430           CLOSE_INVALIDATE (sock);
1431           request_free (req);
1432           return HEOF;
1433         }
1434       else
1435         {
1436           logprintf (LOG_NOTQUIET, _("Read error (%s) in headers.\n"),
1437                      strerror (errno));
1438           CLOSE_INVALIDATE (sock);
1439           request_free (req);
1440           return HERR;
1441         }
1442     }
1443   DEBUGP (("\n---response begin---\n%s---response end---\n", head));
1444
1445   resp = response_new (head);
1446
1447   /* Check for status line.  */
1448   message = NULL;
1449   statcode = response_status (resp, &message);
1450   if (!opt.server_response)
1451     logprintf (LOG_VERBOSE, "%2d %s\n", statcode, message ? message : "");
1452   else
1453     {
1454       logprintf (LOG_VERBOSE, "\n");
1455       print_server_response (resp, "  ");
1456     }
1457
1458   if (response_header_copy (resp, "Content-Length", hdrval, sizeof (hdrval)))
1459     contlen = strtol (hdrval, NULL, 10);
1460
1461   /* Check for keep-alive related responses. */
1462   if (!inhibit_keep_alive && contlen != -1)
1463     {
1464       if (response_header_copy (resp, "Keep-Alive", NULL, 0))
1465         keep_alive = 1;
1466       else if (response_header_copy (resp, "Connection", hdrval,
1467                                      sizeof (hdrval)))
1468         {
1469           if (0 == strcasecmp (hdrval, "Keep-Alive"))
1470             keep_alive = 1;
1471         }
1472     }
1473   if (keep_alive)
1474     /* The server has promised that it will not close the connection
1475        when we're done.  This means that we can register it.  */
1476     register_persistent (conn->host, conn->port, sock, using_ssl);
1477
1478   if (statcode == HTTP_STATUS_UNAUTHORIZED)
1479     {
1480       /* Authorization is required.  */
1481       skip_short_body (sock, contlen);
1482       CLOSE_FINISH (sock);
1483       if (auth_tried_already || !(user && passwd))
1484         {
1485           /* If we have tried it already, then there is not point
1486              retrying it.  */
1487           logputs (LOG_NOTQUIET, _("Authorization failed.\n"));
1488         }
1489       else
1490         {
1491           char *www_authenticate = response_header_strdup (resp,
1492                                                            "WWW-Authenticate");
1493           /* If the authentication scheme is unknown or if it's the
1494              "Basic" authentication (which we try by default), there's
1495              no sense in retrying.  */
1496           if (!www_authenticate
1497               || !known_authentication_scheme_p (www_authenticate)
1498               || BEGINS_WITH (www_authenticate, "Basic"))
1499             {
1500               xfree_null (www_authenticate);
1501               logputs (LOG_NOTQUIET, _("Unknown authentication scheme.\n"));
1502             }
1503           else
1504             {
1505               char *pth;
1506               auth_tried_already = 1;
1507               pth = url_full_path (u);
1508               request_set_header (req, "Authorization",
1509                                   create_authorization_line (www_authenticate,
1510                                                              user, passwd,
1511                                                              request_method (req),
1512                                                              pth),
1513                                   rel_value);
1514               xfree (pth);
1515               xfree (www_authenticate);
1516               goto retry_with_auth;
1517             }
1518         }
1519       request_free (req);
1520       return AUTHFAILED;
1521     }
1522   request_free (req);
1523
1524   hs->statcode = statcode;
1525   if (statcode == -1)
1526     hs->error = xstrdup (_("Malformed status line"));
1527   else if (!*message)
1528     hs->error = xstrdup (_("(no description)"));
1529   else
1530     hs->error = xstrdup (message);
1531
1532   type = response_header_strdup (resp, "Content-Type");
1533   if (type)
1534     {
1535       char *tmp = strchr (type, ';');
1536       if (tmp)
1537         {
1538           while (tmp > type && ISSPACE (tmp[-1]))
1539             --tmp;
1540           *tmp = '\0';
1541         }
1542     }
1543   hs->newloc = response_header_strdup (resp, "Location");
1544   hs->remote_time = response_header_strdup (resp, "Last-Modified");
1545   {
1546     char *set_cookie = response_header_strdup (resp, "Set-Cookie");
1547     if (set_cookie)
1548       {
1549         /* The jar should have been created by now. */
1550         assert (wget_cookie_jar != NULL);
1551         cookie_handle_set_cookie (wget_cookie_jar, u->host, u->port, u->path,
1552                                   set_cookie);
1553         xfree (set_cookie);
1554       }
1555   }
1556   if (response_header_copy (resp, "Content-Range", hdrval, sizeof (hdrval)))
1557     {
1558       long first_byte_pos, last_byte_pos, entity_length;
1559       if (parse_content_range (hdrval, &first_byte_pos, &last_byte_pos,
1560                                &entity_length))
1561         contrange = first_byte_pos;
1562     }
1563   response_free (resp);
1564
1565   /* 20x responses are counted among successful by default.  */
1566   if (H_20X (statcode))
1567     *dt |= RETROKF;
1568
1569   /* Return if redirected.  */
1570   if (H_REDIRECTED (statcode) || statcode == HTTP_STATUS_MULTIPLE_CHOICES)
1571     {
1572       /* RFC2068 says that in case of the 300 (multiple choices)
1573          response, the server can output a preferred URL through
1574          `Location' header; otherwise, the request should be treated
1575          like GET.  So, if the location is set, it will be a
1576          redirection; otherwise, just proceed normally.  */
1577       if (statcode == HTTP_STATUS_MULTIPLE_CHOICES && !hs->newloc)
1578         *dt |= RETROKF;
1579       else
1580         {
1581           logprintf (LOG_VERBOSE,
1582                      _("Location: %s%s\n"),
1583                      hs->newloc ? hs->newloc : _("unspecified"),
1584                      hs->newloc ? _(" [following]") : "");
1585           if (keep_alive)
1586             skip_short_body (sock, contlen);
1587           CLOSE_FINISH (sock);
1588           xfree_null (type);
1589           return NEWLOCATION;
1590         }
1591     }
1592
1593   /* If content-type is not given, assume text/html.  This is because
1594      of the multitude of broken CGI's that "forget" to generate the
1595      content-type.  */
1596   if (!type ||
1597         0 == strncasecmp (type, TEXTHTML_S, strlen (TEXTHTML_S)) ||
1598         0 == strncasecmp (type, TEXTXHTML_S, strlen (TEXTXHTML_S)))
1599     *dt |= TEXTHTML;
1600   else
1601     *dt &= ~TEXTHTML;
1602
1603   if (opt.html_extension && (*dt & TEXTHTML))
1604     /* -E / --html-extension / html_extension = on was specified, and this is a
1605        text/html file.  If some case-insensitive variation on ".htm[l]" isn't
1606        already the file's suffix, tack on ".html". */
1607     {
1608       char*  last_period_in_local_filename = strrchr(*hs->local_file, '.');
1609
1610       if (last_period_in_local_filename == NULL
1611           || !(0 == strcasecmp (last_period_in_local_filename, ".htm")
1612                || 0 == strcasecmp (last_period_in_local_filename, ".html")))
1613         {
1614           size_t  local_filename_len = strlen(*hs->local_file);
1615           
1616           *hs->local_file = xrealloc(*hs->local_file,
1617                                      local_filename_len + sizeof(".html"));
1618           strcpy(*hs->local_file + local_filename_len, ".html");
1619
1620           *dt |= ADDED_HTML_EXTENSION;
1621         }
1622     }
1623
1624   if (statcode == HTTP_STATUS_RANGE_NOT_SATISFIABLE)
1625     {
1626       /* If `-c' is in use and the file has been fully downloaded (or
1627          the remote file has shrunk), Wget effectively requests bytes
1628          after the end of file and the server response with 416.  */
1629       logputs (LOG_VERBOSE, _("\
1630 \n    The file is already fully retrieved; nothing to do.\n\n"));
1631       /* In case the caller inspects. */
1632       hs->len = contlen;
1633       hs->res = 0;
1634       /* Mark as successfully retrieved. */
1635       *dt |= RETROKF;
1636       xfree_null (type);
1637       CLOSE_INVALIDATE (sock);  /* would be CLOSE_FINISH, but there
1638                                    might be more bytes in the body. */
1639       return RETRUNNEEDED;
1640     }
1641   if ((contrange != 0 && contrange != hs->restval)
1642       || (H_PARTIAL (statcode) && !contrange))
1643     {
1644       /* The Range request was somehow misunderstood by the server.
1645          Bail out.  */
1646       xfree_null (type);
1647       CLOSE_INVALIDATE (sock);
1648       return RANGEERR;
1649     }
1650   hs->contlen = contlen + contrange;
1651
1652   if (opt.verbose)
1653     {
1654       if (*dt & RETROKF)
1655         {
1656           /* No need to print this output if the body won't be
1657              downloaded at all, or if the original server response is
1658              printed.  */
1659           logputs (LOG_VERBOSE, _("Length: "));
1660           if (contlen != -1)
1661             {
1662               logputs (LOG_VERBOSE, legible (contlen + contrange));
1663               if (contrange)
1664                 logprintf (LOG_VERBOSE, _(" (%s to go)"), legible (contlen));
1665             }
1666           else
1667             logputs (LOG_VERBOSE,
1668                      opt.ignore_length ? _("ignored") : _("unspecified"));
1669           if (type)
1670             logprintf (LOG_VERBOSE, " [%s]\n", type);
1671           else
1672             logputs (LOG_VERBOSE, "\n");
1673         }
1674     }
1675   xfree_null (type);
1676   type = NULL;                  /* We don't need it any more.  */
1677
1678   /* Return if we have no intention of further downloading.  */
1679   if (!(*dt & RETROKF) || (*dt & HEAD_ONLY))
1680     {
1681       /* In case the caller cares to look...  */
1682       hs->len = 0L;
1683       hs->res = 0;
1684       xfree_null (type);
1685       /* Pre-1.10 Wget used CLOSE_INVALIDATE here.  Now we trust the
1686          servers not to send body in response to a HEAD request.  If
1687          you encounter such a server (more likely a broken CGI), use
1688          `--no-http-keep-alive'.  */
1689       CLOSE_FINISH (sock);
1690       return RETRFINISHED;
1691     }
1692
1693   /* Open the local file.  */
1694   if (!output_stream)
1695     {
1696       mkalldirs (*hs->local_file);
1697       if (opt.backups)
1698         rotate_backups (*hs->local_file);
1699       fp = fopen (*hs->local_file, hs->restval ? "ab" : "wb");
1700       if (!fp)
1701         {
1702           logprintf (LOG_NOTQUIET, "%s: %s\n", *hs->local_file, strerror (errno));
1703           CLOSE_INVALIDATE (sock);
1704           return FOPENERR;
1705         }
1706     }
1707   else
1708     fp = output_stream;
1709
1710   /* #### This confuses the timestamping code that checks for file
1711      size.  Maybe we should save some additional information?  */
1712   if (opt.save_headers)
1713     fwrite (head, 1, strlen (head), fp);
1714
1715   /* Download the request body.  */
1716   flags = 0;
1717   if (keep_alive)
1718     flags |= rb_read_exactly;
1719   if (hs->restval > 0 && contrange == 0)
1720     /* If the server ignored our range request, instruct fd_read_body
1721        to skip the first RESTVAL bytes of body.  */
1722     flags |= rb_skip_startpos;
1723   hs->len = hs->restval;
1724   hs->rd_size = 0;
1725   hs->res = fd_read_body (sock, fp, contlen != -1 ? contlen : 0,
1726                           hs->restval, &hs->rd_size, &hs->len, &hs->dltime,
1727                           flags);
1728
1729   if (hs->res >= 0)
1730     CLOSE_FINISH (sock);
1731   else
1732     CLOSE_INVALIDATE (sock);
1733
1734   {
1735     /* Close or flush the file.  We have to be careful to check for
1736        error here.  Checking the result of fwrite() is not enough --
1737        errors could go unnoticed!  */
1738     int flush_res;
1739     if (!output_stream)
1740       flush_res = fclose (fp);
1741     else
1742       flush_res = fflush (fp);
1743     if (flush_res == EOF)
1744       hs->res = -2;
1745   }
1746   if (hs->res == -2)
1747     return FWRITEERR;
1748   return RETRFINISHED;
1749 }
1750
1751 /* The genuine HTTP loop!  This is the part where the retrieval is
1752    retried, and retried, and retried, and...  */
1753 uerr_t
1754 http_loop (struct url *u, char **newloc, char **local_file, const char *referer,
1755            int *dt, struct url *proxy)
1756 {
1757   int count;
1758   int use_ts, got_head = 0;     /* time-stamping info */
1759   char *filename_plus_orig_suffix;
1760   char *local_filename = NULL;
1761   char *tms, *locf, *tmrate;
1762   uerr_t err;
1763   time_t tml = -1, tmr = -1;    /* local and remote time-stamps */
1764   long local_size = 0;          /* the size of the local file */
1765   size_t filename_len;
1766   struct http_stat hstat;       /* HTTP status */
1767   struct stat st;
1768   char *dummy = NULL;
1769
1770   /* This used to be done in main(), but it's a better idea to do it
1771      here so that we don't go through the hoops if we're just using
1772      FTP or whatever. */
1773   if (opt.cookies)
1774     {
1775       if (!wget_cookie_jar)
1776         wget_cookie_jar = cookie_jar_new ();
1777       if (opt.cookies_input && !cookies_loaded_p)
1778         {
1779           cookie_jar_load (wget_cookie_jar, opt.cookies_input);
1780           cookies_loaded_p = 1;
1781         }
1782     }
1783
1784   *newloc = NULL;
1785
1786   /* Warn on (likely bogus) wildcard usage in HTTP.  Don't use
1787      has_wildcards_p because it would also warn on `?', and we know that
1788      shows up in CGI paths a *lot*.  */
1789   if (strchr (u->url, '*'))
1790     logputs (LOG_VERBOSE, _("Warning: wildcards not supported in HTTP.\n"));
1791
1792   xzero (hstat);
1793
1794   /* Determine the local filename.  */
1795   if (local_file && *local_file)
1796     hstat.local_file = local_file;
1797   else if (local_file)
1798     {
1799       *local_file = url_file_name (u);
1800       hstat.local_file = local_file;
1801     }
1802   else
1803     {
1804       dummy = url_file_name (u);
1805       hstat.local_file = &dummy;
1806     }
1807
1808   if (!opt.output_document)
1809     locf = *hstat.local_file;
1810   else
1811     locf = opt.output_document;
1812
1813   hstat.referer = referer;
1814
1815   filename_len = strlen (*hstat.local_file);
1816   filename_plus_orig_suffix = alloca (filename_len + sizeof (".orig"));
1817
1818   if (opt.noclobber && file_exists_p (*hstat.local_file))
1819     {
1820       /* If opt.noclobber is turned on and file already exists, do not
1821          retrieve the file */
1822       logprintf (LOG_VERBOSE, _("\
1823 File `%s' already there, will not retrieve.\n"), *hstat.local_file);
1824       /* If the file is there, we suppose it's retrieved OK.  */
1825       *dt |= RETROKF;
1826
1827       /* #### Bogusness alert.  */
1828       /* If its suffix is "html" or "htm" or similar, assume text/html.  */
1829       if (has_html_suffix_p (*hstat.local_file))
1830         *dt |= TEXTHTML;
1831
1832       xfree_null (dummy);
1833       return RETROK;
1834     }
1835
1836   use_ts = 0;
1837   if (opt.timestamping)
1838     {
1839       int local_dot_orig_file_exists = 0;
1840
1841       if (opt.backup_converted)
1842         /* If -K is specified, we'll act on the assumption that it was specified
1843            last time these files were downloaded as well, and instead of just
1844            comparing local file X against server file X, we'll compare local
1845            file X.orig (if extant, else X) against server file X.  If -K
1846            _wasn't_ specified last time, or the server contains files called
1847            *.orig, -N will be back to not operating correctly with -k. */
1848         {
1849           /* Would a single s[n]printf() call be faster?  --dan
1850
1851              Definitely not.  sprintf() is horribly slow.  It's a
1852              different question whether the difference between the two
1853              affects a program.  Usually I'd say "no", but at one
1854              point I profiled Wget, and found that a measurable and
1855              non-negligible amount of time was lost calling sprintf()
1856              in url.c.  Replacing sprintf with inline calls to
1857              strcpy() and long_to_string() made a difference.
1858              --hniksic */
1859           memcpy (filename_plus_orig_suffix, *hstat.local_file, filename_len);
1860           memcpy (filename_plus_orig_suffix + filename_len,
1861                   ".orig", sizeof (".orig"));
1862
1863           /* Try to stat() the .orig file. */
1864           if (stat (filename_plus_orig_suffix, &st) == 0)
1865             {
1866               local_dot_orig_file_exists = 1;
1867               local_filename = filename_plus_orig_suffix;
1868             }
1869         }      
1870
1871       if (!local_dot_orig_file_exists)
1872         /* Couldn't stat() <file>.orig, so try to stat() <file>. */
1873         if (stat (*hstat.local_file, &st) == 0)
1874           local_filename = *hstat.local_file;
1875
1876       if (local_filename != NULL)
1877         /* There was a local file, so we'll check later to see if the version
1878            the server has is the same version we already have, allowing us to
1879            skip a download. */
1880         {
1881           use_ts = 1;
1882           tml = st.st_mtime;
1883 #ifdef WINDOWS
1884           /* Modification time granularity is 2 seconds for Windows, so
1885              increase local time by 1 second for later comparison. */
1886           tml++;
1887 #endif
1888           local_size = st.st_size;
1889           got_head = 0;
1890         }
1891     }
1892   /* Reset the counter.  */
1893   count = 0;
1894   *dt = 0;
1895   /* THE loop */
1896   do
1897     {
1898       /* Increment the pass counter.  */
1899       ++count;
1900       sleep_between_retrievals (count);
1901       /* Get the current time string.  */
1902       tms = time_str (NULL);
1903       /* Print fetch message, if opt.verbose.  */
1904       if (opt.verbose)
1905         {
1906           char *hurl = url_string (u, 1);
1907           char tmp[256];
1908           strcpy (tmp, "        ");
1909           if (count > 1)
1910             sprintf (tmp, _("(try:%2d)"), count);
1911           logprintf (LOG_VERBOSE, "--%s--  %s\n  %s => `%s'\n",
1912                      tms, hurl, tmp, locf);
1913 #ifdef WINDOWS
1914           ws_changetitle (hurl, 1);
1915 #endif
1916           xfree (hurl);
1917         }
1918
1919       /* Default document type is empty.  However, if spider mode is
1920          on or time-stamping is employed, HEAD_ONLY commands is
1921          encoded within *dt.  */
1922       if (opt.spider || (use_ts && !got_head))
1923         *dt |= HEAD_ONLY;
1924       else
1925         *dt &= ~HEAD_ONLY;
1926
1927       /* Decide whether or not to restart.  */
1928       hstat.restval = 0;
1929       if (count > 1)
1930         hstat.restval = hstat.len; /* continue where we left off */
1931       else if (opt.always_rest
1932                && stat (locf, &st) == 0
1933                && S_ISREG (st.st_mode))
1934         hstat.restval = st.st_size;
1935
1936       /* Decide whether to send the no-cache directive.  We send it in
1937          two cases:
1938            a) we're using a proxy, and we're past our first retrieval.
1939               Some proxies are notorious for caching incomplete data, so
1940               we require a fresh get.
1941            b) caching is explicitly inhibited. */
1942       if ((proxy && count > 1)  /* a */
1943           || !opt.allow_cache   /* b */
1944           )
1945         *dt |= SEND_NOCACHE;
1946       else
1947         *dt &= ~SEND_NOCACHE;
1948
1949       /* Try fetching the document, or at least its head.  */
1950       err = gethttp (u, &hstat, dt, proxy);
1951
1952       /* It's unfortunate that wget determines the local filename before finding
1953          out the Content-Type of the file.  Barring a major restructuring of the
1954          code, we need to re-set locf here, since gethttp() may have xrealloc()d
1955          *hstat.local_file to tack on ".html". */
1956       if (!opt.output_document)
1957         locf = *hstat.local_file;
1958       else
1959         locf = opt.output_document;
1960
1961       /* Time?  */
1962       tms = time_str (NULL);
1963       /* Get the new location (with or without the redirection).  */
1964       if (hstat.newloc)
1965         *newloc = xstrdup (hstat.newloc);
1966       switch (err)
1967         {
1968         case HERR: case HEOF: case CONSOCKERR: case CONCLOSED:
1969         case CONERROR: case READERR: case WRITEFAILED:
1970         case RANGEERR:
1971           /* Non-fatal errors continue executing the loop, which will
1972              bring them to "while" statement at the end, to judge
1973              whether the number of tries was exceeded.  */
1974           free_hstat (&hstat);
1975           printwhat (count, opt.ntry);
1976           continue;
1977           break;
1978         case HOSTERR: case CONIMPOSSIBLE: case PROXERR: case AUTHFAILED: 
1979         case SSLERRCTXCREATE: case CONTNOTSUPPORTED:
1980           /* Fatal errors just return from the function.  */
1981           free_hstat (&hstat);
1982           xfree_null (dummy);
1983           return err;
1984           break;
1985         case FWRITEERR: case FOPENERR:
1986           /* Another fatal error.  */
1987           logputs (LOG_VERBOSE, "\n");
1988           logprintf (LOG_NOTQUIET, _("Cannot write to `%s' (%s).\n"),
1989                      *hstat.local_file, strerror (errno));
1990           free_hstat (&hstat);
1991           xfree_null (dummy);
1992           return err;
1993           break;
1994         case CONSSLERR:
1995           /* Another fatal error.  */
1996           logputs (LOG_VERBOSE, "\n");
1997           logprintf (LOG_NOTQUIET, _("Unable to establish SSL connection.\n"));
1998           free_hstat (&hstat);
1999           xfree_null (dummy);
2000           return err;
2001           break;
2002         case NEWLOCATION:
2003           /* Return the new location to the caller.  */
2004           if (!hstat.newloc)
2005             {
2006               logprintf (LOG_NOTQUIET,
2007                          _("ERROR: Redirection (%d) without location.\n"),
2008                          hstat.statcode);
2009               free_hstat (&hstat);
2010               xfree_null (dummy);
2011               return WRONGCODE;
2012             }
2013           free_hstat (&hstat);
2014           xfree_null (dummy);
2015           return NEWLOCATION;
2016           break;
2017         case RETRUNNEEDED:
2018           /* The file was already fully retrieved. */
2019           free_hstat (&hstat);
2020           xfree_null (dummy);
2021           return RETROK;
2022           break;
2023         case RETRFINISHED:
2024           /* Deal with you later.  */
2025           break;
2026         default:
2027           /* All possibilities should have been exhausted.  */
2028           abort ();
2029         }
2030       if (!(*dt & RETROKF))
2031         {
2032           if (!opt.verbose)
2033             {
2034               /* #### Ugly ugly ugly! */
2035               char *hurl = url_string (u, 1);
2036               logprintf (LOG_NONVERBOSE, "%s:\n", hurl);
2037               xfree (hurl);
2038             }
2039           logprintf (LOG_NOTQUIET, _("%s ERROR %d: %s.\n"),
2040                      tms, hstat.statcode, hstat.error);
2041           logputs (LOG_VERBOSE, "\n");
2042           free_hstat (&hstat);
2043           xfree_null (dummy);
2044           return WRONGCODE;
2045         }
2046
2047       /* Did we get the time-stamp?  */
2048       if (!got_head)
2049         {
2050           if (opt.timestamping && !hstat.remote_time)
2051             {
2052               logputs (LOG_NOTQUIET, _("\
2053 Last-modified header missing -- time-stamps turned off.\n"));
2054             }
2055           else if (hstat.remote_time)
2056             {
2057               /* Convert the date-string into struct tm.  */
2058               tmr = http_atotm (hstat.remote_time);
2059               if (tmr == (time_t) (-1))
2060                 logputs (LOG_VERBOSE, _("\
2061 Last-modified header invalid -- time-stamp ignored.\n"));
2062             }
2063         }
2064
2065       /* The time-stamping section.  */
2066       if (use_ts)
2067         {
2068           got_head = 1;
2069           *dt &= ~HEAD_ONLY;
2070           use_ts = 0;           /* no more time-stamping */
2071           count = 0;            /* the retrieve count for HEAD is
2072                                    reset */
2073           if (hstat.remote_time && tmr != (time_t) (-1))
2074             {
2075               /* Now time-stamping can be used validly.  Time-stamping
2076                  means that if the sizes of the local and remote file
2077                  match, and local file is newer than the remote file,
2078                  it will not be retrieved.  Otherwise, the normal
2079                  download procedure is resumed.  */
2080               if (tml >= tmr &&
2081                   (hstat.contlen == -1 || local_size == hstat.contlen))
2082                 {
2083                   logprintf (LOG_VERBOSE, _("\
2084 Server file no newer than local file `%s' -- not retrieving.\n\n"),
2085                              local_filename);
2086                   free_hstat (&hstat);
2087                   xfree_null (dummy);
2088                   return RETROK;
2089                 }
2090               else if (tml >= tmr)
2091                 logprintf (LOG_VERBOSE, _("\
2092 The sizes do not match (local %ld) -- retrieving.\n"), local_size);
2093               else
2094                 logputs (LOG_VERBOSE,
2095                          _("Remote file is newer, retrieving.\n"));
2096             }
2097           free_hstat (&hstat);
2098           continue;
2099         }
2100       if ((tmr != (time_t) (-1))
2101           && !opt.spider
2102           && ((hstat.len == hstat.contlen) ||
2103               ((hstat.res == 0) &&
2104                ((hstat.contlen == -1) ||
2105                 (hstat.len >= hstat.contlen && !opt.kill_longer)))))
2106         {
2107           /* #### This code repeats in http.c and ftp.c.  Move it to a
2108              function!  */
2109           const char *fl = NULL;
2110           if (opt.output_document)
2111             {
2112               if (output_stream_regular)
2113                 fl = opt.output_document;
2114             }
2115           else
2116             fl = *hstat.local_file;
2117           if (fl)
2118             touch (fl, tmr);
2119         }
2120       /* End of time-stamping section.  */
2121
2122       if (opt.spider)
2123         {
2124           logprintf (LOG_NOTQUIET, "%d %s\n\n", hstat.statcode, hstat.error);
2125           xfree_null (dummy);
2126           return RETROK;
2127         }
2128
2129       tmrate = retr_rate (hstat.rd_size, hstat.dltime, 0);
2130
2131       if (hstat.len == hstat.contlen)
2132         {
2133           if (*dt & RETROKF)
2134             {
2135               logprintf (LOG_VERBOSE,
2136                          _("%s (%s) - `%s' saved [%ld/%ld]\n\n"),
2137                          tms, tmrate, locf, hstat.len, hstat.contlen);
2138               logprintf (LOG_NONVERBOSE,
2139                          "%s URL:%s [%ld/%ld] -> \"%s\" [%d]\n",
2140                          tms, u->url, hstat.len, hstat.contlen, locf, count);
2141             }
2142           ++opt.numurls;
2143           total_downloaded_bytes += hstat.len;
2144
2145           /* Remember that we downloaded the file for later ".orig" code. */
2146           if (*dt & ADDED_HTML_EXTENSION)
2147             downloaded_file(FILE_DOWNLOADED_AND_HTML_EXTENSION_ADDED, locf);
2148           else
2149             downloaded_file(FILE_DOWNLOADED_NORMALLY, locf);
2150
2151           free_hstat (&hstat);
2152           xfree_null (dummy);
2153           return RETROK;
2154         }
2155       else if (hstat.res == 0) /* No read error */
2156         {
2157           if (hstat.contlen == -1)  /* We don't know how much we were supposed
2158                                        to get, so assume we succeeded. */ 
2159             {
2160               if (*dt & RETROKF)
2161                 {
2162                   logprintf (LOG_VERBOSE,
2163                              _("%s (%s) - `%s' saved [%ld]\n\n"),
2164                              tms, tmrate, locf, hstat.len);
2165                   logprintf (LOG_NONVERBOSE,
2166                              "%s URL:%s [%ld] -> \"%s\" [%d]\n",
2167                              tms, u->url, hstat.len, locf, count);
2168                 }
2169               ++opt.numurls;
2170               total_downloaded_bytes += hstat.len;
2171
2172               /* Remember that we downloaded the file for later ".orig" code. */
2173               if (*dt & ADDED_HTML_EXTENSION)
2174                 downloaded_file(FILE_DOWNLOADED_AND_HTML_EXTENSION_ADDED, locf);
2175               else
2176                 downloaded_file(FILE_DOWNLOADED_NORMALLY, locf);
2177               
2178               free_hstat (&hstat);
2179               xfree_null (dummy);
2180               return RETROK;
2181             }
2182           else if (hstat.len < hstat.contlen) /* meaning we lost the
2183                                                  connection too soon */
2184             {
2185               logprintf (LOG_VERBOSE,
2186                          _("%s (%s) - Connection closed at byte %ld. "),
2187                          tms, tmrate, hstat.len);
2188               printwhat (count, opt.ntry);
2189               free_hstat (&hstat);
2190               continue;
2191             }
2192           else if (!opt.kill_longer) /* meaning we got more than expected */
2193             {
2194               logprintf (LOG_VERBOSE,
2195                          _("%s (%s) - `%s' saved [%ld/%ld])\n\n"),
2196                          tms, tmrate, locf, hstat.len, hstat.contlen);
2197               logprintf (LOG_NONVERBOSE,
2198                          "%s URL:%s [%ld/%ld] -> \"%s\" [%d]\n",
2199                          tms, u->url, hstat.len, hstat.contlen, locf, count);
2200               ++opt.numurls;
2201               total_downloaded_bytes += hstat.len;
2202
2203               /* Remember that we downloaded the file for later ".orig" code. */
2204               if (*dt & ADDED_HTML_EXTENSION)
2205                 downloaded_file(FILE_DOWNLOADED_AND_HTML_EXTENSION_ADDED, locf);
2206               else
2207                 downloaded_file(FILE_DOWNLOADED_NORMALLY, locf);
2208               
2209               free_hstat (&hstat);
2210               xfree_null (dummy);
2211               return RETROK;
2212             }
2213           else                  /* the same, but not accepted */
2214             {
2215               logprintf (LOG_VERBOSE,
2216                          _("%s (%s) - Connection closed at byte %ld/%ld. "),
2217                          tms, tmrate, hstat.len, hstat.contlen);
2218               printwhat (count, opt.ntry);
2219               free_hstat (&hstat);
2220               continue;
2221             }
2222         }
2223       else                      /* now hstat.res can only be -1 */
2224         {
2225           if (hstat.contlen == -1)
2226             {
2227               logprintf (LOG_VERBOSE,
2228                          _("%s (%s) - Read error at byte %ld (%s)."),
2229                          tms, tmrate, hstat.len, strerror (errno));
2230               printwhat (count, opt.ntry);
2231               free_hstat (&hstat);
2232               continue;
2233             }
2234           else                  /* hstat.res == -1 and contlen is given */
2235             {
2236               logprintf (LOG_VERBOSE,
2237                          _("%s (%s) - Read error at byte %ld/%ld (%s). "),
2238                          tms, tmrate, hstat.len, hstat.contlen,
2239                          strerror (errno));
2240               printwhat (count, opt.ntry);
2241               free_hstat (&hstat);
2242               continue;
2243             }
2244         }
2245       /* not reached */
2246       break;
2247     }
2248   while (!opt.ntry || (count < opt.ntry));
2249   return TRYLIMEXC;
2250 }
2251 \f
2252 /* Converts struct tm to time_t, assuming the data in tm is UTC rather
2253    than local timezone.
2254
2255    mktime is similar but assumes struct tm, also known as the
2256    "broken-down" form of time, is in local time zone.  mktime_from_utc
2257    uses mktime to make the conversion understanding that an offset
2258    will be introduced by the local time assumption.
2259
2260    mktime_from_utc then measures the introduced offset by applying
2261    gmtime to the initial result and applying mktime to the resulting
2262    "broken-down" form.  The difference between the two mktime results
2263    is the measured offset which is then subtracted from the initial
2264    mktime result to yield a calendar time which is the value returned.
2265
2266    tm_isdst in struct tm is set to 0 to force mktime to introduce a
2267    consistent offset (the non DST offset) since tm and tm+o might be
2268    on opposite sides of a DST change.
2269
2270    Some implementations of mktime return -1 for the nonexistent
2271    localtime hour at the beginning of DST.  In this event, use
2272    mktime(tm - 1hr) + 3600.
2273
2274    Schematically
2275      mktime(tm)   --> t+o
2276      gmtime(t+o)  --> tm+o
2277      mktime(tm+o) --> t+2o
2278      t+o - (t+2o - t+o) = t
2279
2280    Note that glibc contains a function of the same purpose named
2281    `timegm' (reverse of gmtime).  But obviously, it is not universally
2282    available, and unfortunately it is not straightforwardly
2283    extractable for use here.  Perhaps configure should detect timegm
2284    and use it where available.
2285
2286    Contributed by Roger Beeman <beeman@cisco.com>, with the help of
2287    Mark Baushke <mdb@cisco.com> and the rest of the Gurus at CISCO.
2288    Further improved by Roger with assistance from Edward J. Sabol
2289    based on input by Jamie Zawinski.  */
2290
2291 static time_t
2292 mktime_from_utc (struct tm *t)
2293 {
2294   time_t tl, tb;
2295   struct tm *tg;
2296
2297   tl = mktime (t);
2298   if (tl == -1)
2299     {
2300       t->tm_hour--;
2301       tl = mktime (t);
2302       if (tl == -1)
2303         return -1; /* can't deal with output from strptime */
2304       tl += 3600;
2305     }
2306   tg = gmtime (&tl);
2307   tg->tm_isdst = 0;
2308   tb = mktime (tg);
2309   if (tb == -1)
2310     {
2311       tg->tm_hour--;
2312       tb = mktime (tg);
2313       if (tb == -1)
2314         return -1; /* can't deal with output from gmtime */
2315       tb += 3600;
2316     }
2317   return (tl - (tb - tl));
2318 }
2319
2320 /* Check whether the result of strptime() indicates success.
2321    strptime() returns the pointer to how far it got to in the string.
2322    The processing has been successful if the string is at `GMT' or
2323    `+X', or at the end of the string.
2324
2325    In extended regexp parlance, the function returns 1 if P matches
2326    "^ *(GMT|[+-][0-9]|$)", 0 otherwise.  P being NULL (which strptime
2327    can return) is considered a failure and 0 is returned.  */
2328 static int
2329 check_end (const char *p)
2330 {
2331   if (!p)
2332     return 0;
2333   while (ISSPACE (*p))
2334     ++p;
2335   if (!*p
2336       || (p[0] == 'G' && p[1] == 'M' && p[2] == 'T')
2337       || ((p[0] == '+' || p[0] == '-') && ISDIGIT (p[1])))
2338     return 1;
2339   else
2340     return 0;
2341 }
2342
2343 /* Convert the textual specification of time in TIME_STRING to the
2344    number of seconds since the Epoch.
2345
2346    TIME_STRING can be in any of the three formats RFC2068 allows the
2347    HTTP servers to emit -- RFC1123-date, RFC850-date or asctime-date.
2348    Timezones are ignored, and should be GMT.
2349
2350    Return the computed time_t representation, or -1 if the conversion
2351    fails.
2352
2353    This function uses strptime with various string formats for parsing
2354    TIME_STRING.  This results in a parser that is not as lenient in
2355    interpreting TIME_STRING as I would like it to be.  Being based on
2356    strptime, it always allows shortened months, one-digit days, etc.,
2357    but due to the multitude of formats in which time can be
2358    represented, an ideal HTTP time parser would be even more
2359    forgiving.  It should completely ignore things like week days and
2360    concentrate only on the various forms of representing years,
2361    months, days, hours, minutes, and seconds.  For example, it would
2362    be nice if it accepted ISO 8601 out of the box.
2363
2364    I've investigated free and PD code for this purpose, but none was
2365    usable.  getdate was big and unwieldy, and had potential copyright
2366    issues, or so I was informed.  Dr. Marcus Hennecke's atotm(),
2367    distributed with phttpd, is excellent, but we cannot use it because
2368    it is not assigned to the FSF.  So I stuck it with strptime.  */
2369
2370 time_t
2371 http_atotm (const char *time_string)
2372 {
2373   /* NOTE: Solaris strptime man page claims that %n and %t match white
2374      space, but that's not universally available.  Instead, we simply
2375      use ` ' to mean "skip all WS", which works under all strptime
2376      implementations I've tested.  */
2377
2378   static const char *time_formats[] = {
2379     "%a, %d %b %Y %T",          /* RFC1123: Thu, 29 Jan 1998 22:12:57 */
2380     "%A, %d-%b-%y %T",          /* RFC850:  Thursday, 29-Jan-98 22:12:57 */
2381     "%a, %d-%b-%Y %T",          /* pseudo-RFC850:  Thu, 29-Jan-1998 22:12:57
2382                                    (google.com uses this for their cookies.) */
2383     "%a %b %d %T %Y"            /* asctime: Thu Jan 29 22:12:57 1998 */
2384   };
2385
2386   int i;
2387   struct tm t;
2388
2389   /* According to Roger Beeman, we need to initialize tm_isdst, since
2390      strptime won't do it.  */
2391   t.tm_isdst = 0;
2392
2393   /* Note that under foreign locales Solaris strptime() fails to
2394      recognize English dates, which renders this function useless.  We
2395      solve this by being careful not to affect LC_TIME when
2396      initializing locale.
2397
2398      Another solution would be to temporarily set locale to C, invoke
2399      strptime(), and restore it back.  This is slow and dirty,
2400      however, and locale support other than LC_MESSAGES can mess other
2401      things, so I rather chose to stick with just setting LC_MESSAGES.
2402
2403      GNU strptime does not have this problem because it recognizes
2404      both international and local dates.  */
2405
2406   for (i = 0; i < countof (time_formats); i++)
2407     if (check_end (strptime (time_string, time_formats[i], &t)))
2408       return mktime_from_utc (&t);
2409
2410   /* All formats have failed.  */
2411   return -1;
2412 }
2413 \f
2414 /* Authorization support: We support two authorization schemes:
2415
2416    * `Basic' scheme, consisting of base64-ing USER:PASSWORD string;
2417
2418    * `Digest' scheme, added by Junio Hamano <junio@twinsun.com>,
2419    consisting of answering to the server's challenge with the proper
2420    MD5 digests.  */
2421
2422 /* How many bytes it will take to store LEN bytes in base64.  */
2423 #define BASE64_LENGTH(len) (4 * (((len) + 2) / 3))
2424
2425 /* Encode the string S of length LENGTH to base64 format and place it
2426    to STORE.  STORE will be 0-terminated, and must point to a writable
2427    buffer of at least 1+BASE64_LENGTH(length) bytes.  */
2428 static void
2429 base64_encode (const char *s, char *store, int length)
2430 {
2431   /* Conversion table.  */
2432   static char tbl[64] = {
2433     'A','B','C','D','E','F','G','H',
2434     'I','J','K','L','M','N','O','P',
2435     'Q','R','S','T','U','V','W','X',
2436     'Y','Z','a','b','c','d','e','f',
2437     'g','h','i','j','k','l','m','n',
2438     'o','p','q','r','s','t','u','v',
2439     'w','x','y','z','0','1','2','3',
2440     '4','5','6','7','8','9','+','/'
2441   };
2442   int i;
2443   unsigned char *p = (unsigned char *)store;
2444
2445   /* Transform the 3x8 bits to 4x6 bits, as required by base64.  */
2446   for (i = 0; i < length; i += 3)
2447     {
2448       *p++ = tbl[s[0] >> 2];
2449       *p++ = tbl[((s[0] & 3) << 4) + (s[1] >> 4)];
2450       *p++ = tbl[((s[1] & 0xf) << 2) + (s[2] >> 6)];
2451       *p++ = tbl[s[2] & 0x3f];
2452       s += 3;
2453     }
2454   /* Pad the result if necessary...  */
2455   if (i == length + 1)
2456     *(p - 1) = '=';
2457   else if (i == length + 2)
2458     *(p - 1) = *(p - 2) = '=';
2459   /* ...and zero-terminate it.  */
2460   *p = '\0';
2461 }
2462
2463 /* Create the authentication header contents for the `Basic' scheme.
2464    This is done by encoding the string `USER:PASS' in base64 and
2465    prepending `HEADER: Basic ' to it.  */
2466 static char *
2467 basic_authentication_encode (const char *user, const char *passwd)
2468 {
2469   char *t1, *t2, *res;
2470   int len1 = strlen (user) + 1 + strlen (passwd);
2471   int len2 = BASE64_LENGTH (len1);
2472
2473   t1 = (char *)alloca (len1 + 1);
2474   sprintf (t1, "%s:%s", user, passwd);
2475
2476   t2 = (char *)alloca (len2 + 1);
2477   base64_encode (t1, t2, len1);
2478
2479   res = (char *)xmalloc (6 + len2 + 1);
2480   sprintf (res, "Basic %s", t2);
2481
2482   return res;
2483 }
2484
2485 #define SKIP_WS(x) do {                         \
2486   while (ISSPACE (*(x)))                        \
2487     ++(x);                                      \
2488 } while (0)
2489
2490 #ifdef USE_DIGEST
2491 /* Parse HTTP `WWW-Authenticate:' header.  AU points to the beginning
2492    of a field in such a header.  If the field is the one specified by
2493    ATTR_NAME ("realm", "opaque", and "nonce" are used by the current
2494    digest authorization code), extract its value in the (char*)
2495    variable pointed by RET.  Returns negative on a malformed header,
2496    or number of bytes that have been parsed by this call.  */
2497 static int
2498 extract_header_attr (const char *au, const char *attr_name, char **ret)
2499 {
2500   const char *cp, *ep;
2501
2502   ep = cp = au;
2503
2504   if (strncmp (cp, attr_name, strlen (attr_name)) == 0)
2505     {
2506       cp += strlen (attr_name);
2507       if (!*cp)
2508         return -1;
2509       SKIP_WS (cp);
2510       if (*cp != '=')
2511         return -1;
2512       if (!*++cp)
2513         return -1;
2514       SKIP_WS (cp);
2515       if (*cp != '\"')
2516         return -1;
2517       if (!*++cp)
2518         return -1;
2519       for (ep = cp; *ep && *ep != '\"'; ep++)
2520         ;
2521       if (!*ep)
2522         return -1;
2523       xfree_null (*ret);
2524       *ret = strdupdelim (cp, ep);
2525       return ep - au + 1;
2526     }
2527   else
2528     return 0;
2529 }
2530
2531 /* Dump the hexadecimal representation of HASH to BUF.  HASH should be
2532    an array of 16 bytes containing the hash keys, and BUF should be a
2533    buffer of 33 writable characters (32 for hex digits plus one for
2534    zero termination).  */
2535 static void
2536 dump_hash (unsigned char *buf, const unsigned char *hash)
2537 {
2538   int i;
2539
2540   for (i = 0; i < MD5_HASHLEN; i++, hash++)
2541     {
2542       *buf++ = XNUM_TO_digit (*hash >> 4);
2543       *buf++ = XNUM_TO_digit (*hash & 0xf);
2544     }
2545   *buf = '\0';
2546 }
2547
2548 /* Take the line apart to find the challenge, and compose a digest
2549    authorization header.  See RFC2069 section 2.1.2.  */
2550 static char *
2551 digest_authentication_encode (const char *au, const char *user,
2552                               const char *passwd, const char *method,
2553                               const char *path)
2554 {
2555   static char *realm, *opaque, *nonce;
2556   static struct {
2557     const char *name;
2558     char **variable;
2559   } options[] = {
2560     { "realm", &realm },
2561     { "opaque", &opaque },
2562     { "nonce", &nonce }
2563   };
2564   char *res;
2565
2566   realm = opaque = nonce = NULL;
2567
2568   au += 6;                      /* skip over `Digest' */
2569   while (*au)
2570     {
2571       int i;
2572
2573       SKIP_WS (au);
2574       for (i = 0; i < countof (options); i++)
2575         {
2576           int skip = extract_header_attr (au, options[i].name,
2577                                           options[i].variable);
2578           if (skip < 0)
2579             {
2580               xfree_null (realm);
2581               xfree_null (opaque);
2582               xfree_null (nonce);
2583               return NULL;
2584             }
2585           else if (skip)
2586             {
2587               au += skip;
2588               break;
2589             }
2590         }
2591       if (i == countof (options))
2592         {
2593           while (*au && *au != '=')
2594             au++;
2595           if (*au && *++au)
2596             {
2597               SKIP_WS (au);
2598               if (*au == '\"')
2599                 {
2600                   au++;
2601                   while (*au && *au != '\"')
2602                     au++;
2603                   if (*au)
2604                     au++;
2605                 }
2606             }
2607         }
2608       while (*au && *au != ',')
2609         au++;
2610       if (*au)
2611         au++;
2612     }
2613   if (!realm || !nonce || !user || !passwd || !path || !method)
2614     {
2615       xfree_null (realm);
2616       xfree_null (opaque);
2617       xfree_null (nonce);
2618       return NULL;
2619     }
2620
2621   /* Calculate the digest value.  */
2622   {
2623     ALLOCA_MD5_CONTEXT (ctx);
2624     unsigned char hash[MD5_HASHLEN];
2625     unsigned char a1buf[MD5_HASHLEN * 2 + 1], a2buf[MD5_HASHLEN * 2 + 1];
2626     unsigned char response_digest[MD5_HASHLEN * 2 + 1];
2627
2628     /* A1BUF = H(user ":" realm ":" password) */
2629     gen_md5_init (ctx);
2630     gen_md5_update ((unsigned char *)user, strlen (user), ctx);
2631     gen_md5_update ((unsigned char *)":", 1, ctx);
2632     gen_md5_update ((unsigned char *)realm, strlen (realm), ctx);
2633     gen_md5_update ((unsigned char *)":", 1, ctx);
2634     gen_md5_update ((unsigned char *)passwd, strlen (passwd), ctx);
2635     gen_md5_finish (ctx, hash);
2636     dump_hash (a1buf, hash);
2637
2638     /* A2BUF = H(method ":" path) */
2639     gen_md5_init (ctx);
2640     gen_md5_update ((unsigned char *)method, strlen (method), ctx);
2641     gen_md5_update ((unsigned char *)":", 1, ctx);
2642     gen_md5_update ((unsigned char *)path, strlen (path), ctx);
2643     gen_md5_finish (ctx, hash);
2644     dump_hash (a2buf, hash);
2645
2646     /* RESPONSE_DIGEST = H(A1BUF ":" nonce ":" A2BUF) */
2647     gen_md5_init (ctx);
2648     gen_md5_update (a1buf, MD5_HASHLEN * 2, ctx);
2649     gen_md5_update ((unsigned char *)":", 1, ctx);
2650     gen_md5_update ((unsigned char *)nonce, strlen (nonce), ctx);
2651     gen_md5_update ((unsigned char *)":", 1, ctx);
2652     gen_md5_update (a2buf, MD5_HASHLEN * 2, ctx);
2653     gen_md5_finish (ctx, hash);
2654     dump_hash (response_digest, hash);
2655
2656     res = (char*) xmalloc (strlen (user)
2657                            + strlen (user)
2658                            + strlen (realm)
2659                            + strlen (nonce)
2660                            + strlen (path)
2661                            + 2 * MD5_HASHLEN /*strlen (response_digest)*/
2662                            + (opaque ? strlen (opaque) : 0)
2663                            + 128);
2664     sprintf (res, "Digest \
2665 username=\"%s\", realm=\"%s\", nonce=\"%s\", uri=\"%s\", response=\"%s\"",
2666              user, realm, nonce, path, response_digest);
2667     if (opaque)
2668       {
2669         char *p = res + strlen (res);
2670         strcat (p, ", opaque=\"");
2671         strcat (p, opaque);
2672         strcat (p, "\"");
2673       }
2674   }
2675   return res;
2676 }
2677 #endif /* USE_DIGEST */
2678
2679
2680 #define BEGINS_WITH(line, string_constant)                              \
2681   (!strncasecmp (line, string_constant, sizeof (string_constant) - 1)   \
2682    && (ISSPACE (line[sizeof (string_constant) - 1])                     \
2683        || !line[sizeof (string_constant) - 1]))
2684
2685 static int
2686 known_authentication_scheme_p (const char *au)
2687 {
2688   return BEGINS_WITH (au, "Basic")
2689     || BEGINS_WITH (au, "Digest")
2690     || BEGINS_WITH (au, "NTLM");
2691 }
2692
2693 #undef BEGINS_WITH
2694
2695 /* Create the HTTP authorization request header.  When the
2696    `WWW-Authenticate' response header is seen, according to the
2697    authorization scheme specified in that header (`Basic' and `Digest'
2698    are supported by the current implementation), produce an
2699    appropriate HTTP authorization request header.  */
2700 static char *
2701 create_authorization_line (const char *au, const char *user,
2702                            const char *passwd, const char *method,
2703                            const char *path)
2704 {
2705   if (0 == strncasecmp (au, "Basic", 5))
2706     return basic_authentication_encode (user, passwd);
2707 #ifdef USE_DIGEST
2708   if (0 == strncasecmp (au, "Digest", 6))
2709     return digest_authentication_encode (au, user, passwd, method, path);
2710 #endif /* USE_DIGEST */
2711   return NULL;
2712 }
2713 \f
2714 void
2715 http_cleanup (void)
2716 {
2717 }