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