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