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