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