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