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