]> sjero.net Git - wget/blob - src/http.c
[svn] Retired the `boolean' type. Renamed FREE_MAYBE to xfree_null and moved the
[wget] / src / http.c
1 /* HTTP support.
2    Copyright (C) 1995, 1996, 1997, 1998, 2000, 2001, 2002
3    Free Software Foundation, Inc.
4
5 This file is part of GNU Wget.
6
7 GNU Wget is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10  (at your option) any later version.
11
12 GNU Wget is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with Wget; if not, write to the Free Software
19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20
21 In addition, as a special exception, the Free Software Foundation
22 gives permission to link the code of its release of Wget with the
23 OpenSSL project's "OpenSSL" library (or with modified versions of it
24 that use the same license as the "OpenSSL" library), and distribute
25 the linked executables.  You must obey the GNU General Public License
26 in all respects for all of the code used other than "OpenSSL".  If you
27 modify this file, you may extend this exception to your version of the
28 file, but you are not obligated to do so.  If you do not wish to do
29 so, delete this exception statement from your version.  */
30
31 #include <config.h>
32
33 #include <stdio.h>
34 #include <stdlib.h>
35 #include <sys/types.h>
36 #ifdef HAVE_STRING_H
37 # include <string.h>
38 #else
39 # include <strings.h>
40 #endif
41 #ifdef HAVE_UNISTD_H
42 # include <unistd.h>
43 #endif
44 #include <assert.h>
45 #include <errno.h>
46 #if TIME_WITH_SYS_TIME
47 # include <sys/time.h>
48 # include <time.h>
49 #else
50 # if HAVE_SYS_TIME_H
51 #  include <sys/time.h>
52 # else
53 #  include <time.h>
54 # endif
55 #endif
56 #ifndef errno
57 extern int errno;
58 #endif
59
60 #include "wget.h"
61 #include "utils.h"
62 #include "url.h"
63 #include "host.h"
64 #include "rbuf.h"
65 #include "retr.h"
66 #include "headers.h"
67 #include "connect.h"
68 #include "netrc.h"
69 #ifdef HAVE_SSL
70 # include "gen_sslfunc.h"
71 #endif /* HAVE_SSL */
72 #include "cookies.h"
73 #ifdef USE_DIGEST
74 # include "gen-md5.h"
75 #endif
76 #include "convert.h"
77
78 extern char *version_string;
79 extern LARGE_INT total_downloaded_bytes;
80
81 \f
82 static int cookies_loaded_p;
83 struct cookie_jar *wget_cookie_jar;
84
85 #define TEXTHTML_S "text/html"
86 #define TEXTXHTML_S "application/xhtml+xml"
87 #define HTTP_ACCEPT "*/*"
88
89 /* Some status code validation macros: */
90 #define H_20X(x)        (((x) >= 200) && ((x) < 300))
91 #define H_PARTIAL(x)    ((x) == HTTP_STATUS_PARTIAL_CONTENTS)
92 #define H_REDIRECTED(x) ((x) == HTTP_STATUS_MOVED_PERMANENTLY   \
93                          || (x) == HTTP_STATUS_MOVED_TEMPORARILY \
94                          || (x) == HTTP_STATUS_TEMPORARY_REDIRECT)
95
96 /* HTTP/1.0 status codes from RFC1945, provided for reference.  */
97 /* Successful 2xx.  */
98 #define HTTP_STATUS_OK                  200
99 #define HTTP_STATUS_CREATED             201
100 #define HTTP_STATUS_ACCEPTED            202
101 #define HTTP_STATUS_NO_CONTENT          204
102 #define HTTP_STATUS_PARTIAL_CONTENTS    206
103
104 /* Redirection 3xx.  */
105 #define HTTP_STATUS_MULTIPLE_CHOICES    300
106 #define HTTP_STATUS_MOVED_PERMANENTLY   301
107 #define HTTP_STATUS_MOVED_TEMPORARILY   302
108 #define HTTP_STATUS_NOT_MODIFIED        304
109 #define HTTP_STATUS_TEMPORARY_REDIRECT  307
110
111 /* Client error 4xx.  */
112 #define HTTP_STATUS_BAD_REQUEST         400
113 #define HTTP_STATUS_UNAUTHORIZED        401
114 #define HTTP_STATUS_FORBIDDEN           403
115 #define HTTP_STATUS_NOT_FOUND           404
116
117 /* Server errors 5xx.  */
118 #define HTTP_STATUS_INTERNAL            500
119 #define HTTP_STATUS_NOT_IMPLEMENTED     501
120 #define HTTP_STATUS_BAD_GATEWAY         502
121 #define HTTP_STATUS_UNAVAILABLE         503
122
123 \f
124 /* Parse the HTTP status line, which is of format:
125
126    HTTP-Version SP Status-Code SP Reason-Phrase
127
128    The function returns the status-code, or -1 if the status line is
129    malformed.  The pointer to reason-phrase is returned in RP.  */
130 static int
131 parse_http_status_line (const char *line, const char **reason_phrase_ptr)
132 {
133   /* (the variables must not be named `major' and `minor', because
134      that breaks compilation with SunOS4 cc.)  */
135   int mjr, mnr, statcode;
136   const char *p;
137
138   *reason_phrase_ptr = NULL;
139
140   /* The standard format of HTTP-Version is: `HTTP/X.Y', where X is
141      major version, and Y is minor version.  */
142   if (strncmp (line, "HTTP/", 5) != 0)
143     return -1;
144   line += 5;
145
146   /* Calculate major HTTP version.  */
147   p = line;
148   for (mjr = 0; ISDIGIT (*line); line++)
149     mjr = 10 * mjr + (*line - '0');
150   if (*line != '.' || p == line)
151     return -1;
152   ++line;
153
154   /* Calculate minor HTTP version.  */
155   p = line;
156   for (mnr = 0; ISDIGIT (*line); line++)
157     mnr = 10 * mnr + (*line - '0');
158   if (*line != ' ' || p == line)
159     return -1;
160   /* Wget will accept only 1.0 and higher HTTP-versions.  The value of
161      minor version can be safely ignored.  */
162   if (mjr < 1)
163     return -1;
164   ++line;
165
166   /* Calculate status code.  */
167   if (!(ISDIGIT (*line) && ISDIGIT (line[1]) && ISDIGIT (line[2])))
168     return -1;
169   statcode = 100 * (*line - '0') + 10 * (line[1] - '0') + (line[2] - '0');
170
171   /* Set up the reason phrase pointer.  */
172   line += 3;
173   /* RFC2068 requires SPC here, but we allow the string to finish
174      here, in case no reason-phrase is present.  */
175   if (*line != ' ')
176     {
177       if (!*line)
178         *reason_phrase_ptr = line;
179       else
180         return -1;
181     }
182   else
183     *reason_phrase_ptr = line + 1;
184
185   return statcode;
186 }
187 \f
188 #define WMIN(x, y) ((x) > (y) ? (y) : (x))
189
190 /* Send the contents of FILE_NAME to SOCK/SSL.  Make sure that exactly
191    PROMISED_SIZE bytes are sent over the wire -- if the file is
192    longer, read only that much; if the file is shorter, report an error.  */
193
194 static int
195 post_file (int sock, void *ssl, const char *file_name, long promised_size)
196 {
197   static char chunk[8192];
198   long written = 0;
199   int write_error;
200   FILE *fp;
201
202   /* Only one of SOCK and SSL may be active at the same time. */
203   assert (sock > -1 || ssl != NULL);
204   assert (sock == -1 || ssl == NULL);
205
206   DEBUGP (("[writing POST file %s ... ", file_name));
207
208   fp = fopen (file_name, "rb");
209   if (!fp)
210     return -1;
211   while (!feof (fp) && written < promised_size)
212     {
213       int towrite;
214       int length = fread (chunk, 1, sizeof (chunk), fp);
215       if (length == 0)
216         break;
217       towrite = WMIN (promised_size - written, length);
218 #ifdef HAVE_SSL
219       if (ssl)
220         write_error = ssl_iwrite (ssl, chunk, towrite);
221       else
222 #endif
223         write_error = iwrite (sock, chunk, towrite);
224       if (write_error < 0)
225         {
226           fclose (fp);
227           return -1;
228         }
229       written += towrite;
230     }
231   fclose (fp);
232
233   /* If we've written less than was promised, report a (probably
234      nonsensical) error rather than break the promise.  */
235   if (written < promised_size)
236     {
237       errno = EINVAL;
238       return -1;
239     }
240
241   assert (written == promised_size);
242   DEBUGP (("done]\n"));
243   return 0;
244 }
245 \f
246 /* Functions to be used as arguments to header_process(): */
247
248 struct http_process_range_closure {
249   long first_byte_pos;
250   long last_byte_pos;
251   long entity_length;
252 };
253
254 /* Parse the `Content-Range' header and extract the information it
255    contains.  Returns 1 if successful, -1 otherwise.  */
256 static int
257 http_process_range (const char *hdr, void *arg)
258 {
259   struct http_process_range_closure *closure
260     = (struct http_process_range_closure *)arg;
261   long num;
262
263   /* Certain versions of Nutscape proxy server send out
264      `Content-Length' without "bytes" specifier, which is a breach of
265      RFC2068 (as well as the HTTP/1.1 draft which was current at the
266      time).  But hell, I must support it...  */
267   if (!strncasecmp (hdr, "bytes", 5))
268     {
269       hdr += 5;
270       /* "JavaWebServer/1.1.1" sends "bytes: x-y/z", contrary to the
271          HTTP spec. */
272       if (*hdr == ':')
273         ++hdr;
274       hdr += skip_lws (hdr);
275       if (!*hdr)
276         return 0;
277     }
278   if (!ISDIGIT (*hdr))
279     return 0;
280   for (num = 0; ISDIGIT (*hdr); hdr++)
281     num = 10 * num + (*hdr - '0');
282   if (*hdr != '-' || !ISDIGIT (*(hdr + 1)))
283     return 0;
284   closure->first_byte_pos = num;
285   ++hdr;
286   for (num = 0; ISDIGIT (*hdr); hdr++)
287     num = 10 * num + (*hdr - '0');
288   if (*hdr != '/' || !ISDIGIT (*(hdr + 1)))
289     return 0;
290   closure->last_byte_pos = num;
291   ++hdr;
292   for (num = 0; ISDIGIT (*hdr); hdr++)
293     num = 10 * num + (*hdr - '0');
294   closure->entity_length = num;
295   return 1;
296 }
297
298 /* Place 1 to ARG if the HDR contains the word "none", 0 otherwise.
299    Used for `Accept-Ranges'.  */
300 static int
301 http_process_none (const char *hdr, void *arg)
302 {
303   int *where = (int *)arg;
304
305   if (strstr (hdr, "none"))
306     *where = 1;
307   else
308     *where = 0;
309   return 1;
310 }
311
312 /* Place the malloc-ed copy of HDR hdr, to the first `;' to ARG.  */
313 static int
314 http_process_type (const char *hdr, void *arg)
315 {
316   char **result = (char **)arg;
317   /* Locate P on `;' or the terminating zero, whichever comes first. */
318   const char *p = strchr (hdr, ';');
319   if (!p)
320     p = hdr + strlen (hdr);
321   while (p > hdr && ISSPACE (*(p - 1)))
322     --p;
323   *result = strdupdelim (hdr, p);
324   return 1;
325 }
326
327 /* Check whether the `Connection' header is set to "keep-alive". */
328 static int
329 http_process_connection (const char *hdr, void *arg)
330 {
331   int *flag = (int *)arg;
332   if (!strcasecmp (hdr, "Keep-Alive"))
333     *flag = 1;
334   return 1;
335 }
336
337 /* Commit the cookie to the cookie jar. */
338
339 int
340 http_process_set_cookie (const char *hdr, void *arg)
341 {
342   struct url *u = (struct url *)arg;
343
344   /* The jar should have been created by now. */
345   assert (wget_cookie_jar != NULL);
346
347   cookie_jar_process_set_cookie (wget_cookie_jar, u->host, u->port, u->path,
348                                  hdr);
349   return 1;
350 }
351
352 \f
353 /* Persistent connections.  Currently, we cache the most recently used
354    connection as persistent, provided that the HTTP server agrees to
355    make it such.  The persistence data is stored in the variables
356    below.  Ideally, it would be in a structure, and it should be
357    possible to cache an arbitrary fixed number of these connections.
358
359    I think the code is quite easy to extend in that direction.  */
360
361 /* Whether a persistent connection is active. */
362 static int pc_active_p;
363 /* Host and port of currently active persistent connection. */
364 static struct address_list *pc_last_host_ip;
365 static unsigned short pc_last_port;
366
367 /* File descriptor of the currently active persistent connection. */
368 static int pc_last_fd;
369
370 #ifdef HAVE_SSL
371 /* Whether a ssl handshake has occoured on this connection */
372 static int pc_active_ssl;
373 /* SSL connection of the currently active persistent connection. */
374 static SSL *pc_last_ssl;
375 #endif /* HAVE_SSL */
376
377 /* Mark the persistent connection as invalid.  This is used by the
378    CLOSE_* macros after they forcefully close a registered persistent
379    connection.  This does not close the file descriptor -- it is left
380    to the caller to do that.  (Maybe it should, though.)  */
381
382 static void
383 invalidate_persistent (void)
384 {
385   pc_active_p = 0;
386 #ifdef HAVE_SSL
387   pc_active_ssl = 0;
388 #endif /* HAVE_SSL */
389   if (pc_last_host_ip != NULL)
390     {
391       address_list_release (pc_last_host_ip);
392       pc_last_host_ip = NULL;
393     }
394   DEBUGP (("Invalidating fd %d from further reuse.\n", pc_last_fd));
395 }
396
397 /* Register FD, which should be a TCP/IP connection to HOST:PORT, as
398    persistent.  This will enable someone to use the same connection
399    later.  In the context of HTTP, this must be called only AFTER the
400    response has been received and the server has promised that the
401    connection will remain alive.
402
403    If a previous connection was persistent, it is closed. */
404
405 #ifdef HAVE_SSL
406 static void
407 register_persistent (const char *host, unsigned short port, int fd, SSL *ssl)
408 {
409 #else
410 static void
411 register_persistent (const char *host, unsigned short port, int fd)
412 {
413 #endif
414   if (pc_active_p)
415     {
416       if (pc_last_fd == fd)
417         {
418           /* The connection FD is already registered.  Nothing to
419              do. */
420           return;
421         }
422       else
423         {
424           /* The old persistent connection is still active; let's
425              close it first.  This situation arises whenever a
426              persistent connection exists, but we then connect to a
427              different host, and try to register a persistent
428              connection to that one.  */
429 #ifdef HAVE_SSL
430           /* The ssl disconnect has to take place before the closing
431              of pc_last_fd.  */
432           if (pc_last_ssl)
433             shutdown_ssl(pc_last_ssl);
434 #endif
435           CLOSE (pc_last_fd);
436           invalidate_persistent ();
437         }
438     }
439
440   assert (pc_last_host_ip == NULL);
441
442   /* This lookup_host cannot fail, because it has the results in the
443      cache.  */
444   pc_last_host_ip = lookup_host (host, LH_SILENT);
445   assert (pc_last_host_ip != NULL);
446
447   pc_last_port = port;
448   pc_last_fd = fd;
449   pc_active_p = 1;
450 #ifdef HAVE_SSL
451   pc_last_ssl = ssl;
452   pc_active_ssl = ssl ? 1 : 0;
453 #endif
454   DEBUGP (("Registered fd %d for persistent reuse.\n", fd));
455 }
456
457 #ifdef HAVE_SSL
458 # define SHUTDOWN_SSL(ssl) do {         \
459   if (ssl)                              \
460     shutdown_ssl (ssl);                 \
461 } while (0)
462 #else
463 # define SHUTDOWN_SSL(ssl) 
464 #endif
465
466 /* Return non-zero if a persistent connection is available for
467    connecting to HOST:PORT.  */
468
469 #ifdef HAVE_SSL
470 static int
471 persistent_available_p (const char *host, unsigned short port, int ssl)
472 {
473 #else
474 static int
475 persistent_available_p (const char *host, unsigned short port)
476 {
477 #endif
478   int success;
479   struct address_list *this_host_ip;
480
481   /* First, check whether a persistent connection is active at all.  */
482   if (!pc_active_p)
483     return 0;
484   /* Second, check if the active connection pertains to the correct
485      (HOST, PORT) ordered pair.  */
486   if (port != pc_last_port)
487     return 0;
488
489 #ifdef HAVE_SSL
490   /* Second, a): check if current connection is (not) ssl, too.  This
491      test is unlikely to fail because HTTP and HTTPS typicaly use
492      different ports.  Yet it is possible, or so I [Christian
493      Fraenkel] have been told, to run HTTPS and HTTP simultaneus on
494      the same port.  */
495   if (ssl != pc_active_ssl)
496     return 0;
497 #endif /* HAVE_SSL */
498
499   this_host_ip = lookup_host (host, LH_SILENT);
500   if (!this_host_ip)
501     return 0;
502
503   /* To equate the two host names for the purposes of persistent
504      connections, they need to share all the IP addresses in the
505      list.  */
506   success = address_list_match_all (pc_last_host_ip, this_host_ip);
507   address_list_release (this_host_ip);
508   if (!success)
509     return 0;
510
511   /* Third: check whether the connection is still open.  This is
512      important because most server implement a liberal (short) timeout
513      on persistent connections.  Wget can of course always reconnect
514      if the connection doesn't work out, but it's nicer to know in
515      advance.  This test is a logical followup of the first test, but
516      is "expensive" and therefore placed at the end of the list.  */
517   if (!test_socket_open (pc_last_fd))
518     {
519       /* Oops, the socket is no longer open.  Now that we know that,
520          let's invalidate the persistent connection before returning
521          0.  */
522       CLOSE (pc_last_fd);
523 #ifdef HAVE_SSL
524       SHUTDOWN_SSL (pc_last_ssl);
525       pc_last_ssl = NULL;
526 #endif
527       invalidate_persistent ();
528       return 0;
529     }
530   return 1;
531 }
532
533 /* The idea behind these two CLOSE macros is to distinguish between
534    two cases: one when the job we've been doing is finished, and we
535    want to close the connection and leave, and two when something is
536    seriously wrong and we're closing the connection as part of
537    cleanup.
538
539    In case of keep_alive, CLOSE_FINISH should leave the connection
540    open, while CLOSE_INVALIDATE should still close it.
541
542    Note that the semantics of the flag `keep_alive' is "this
543    connection *will* be reused (the server has promised not to close
544    the connection once we're done)", while the semantics of
545    `pc_active_p && (fd) == pc_last_fd' is "we're *now* using an
546    active, registered connection".  */
547
548 #define CLOSE_FINISH(fd) do {                   \
549   if (!keep_alive)                              \
550     {                                           \
551       SHUTDOWN_SSL (ssl);                       \
552       CLOSE (fd);                               \
553       if (pc_active_p && (fd) == pc_last_fd)    \
554         invalidate_persistent ();               \
555     }                                           \
556 } while (0)
557
558 #define CLOSE_INVALIDATE(fd) do {               \
559   SHUTDOWN_SSL (ssl);                           \
560   CLOSE (fd);                                   \
561   if (pc_active_p && (fd) == pc_last_fd)        \
562     invalidate_persistent ();                   \
563 } while (0)
564 \f
565 struct http_stat
566 {
567   long len;                     /* received length */
568   long contlen;                 /* expected length */
569   long restval;                 /* the restart value */
570   int res;                      /* the result of last read */
571   char *newloc;                 /* new location (redirection) */
572   char *remote_time;            /* remote time-stamp string */
573   char *error;                  /* textual HTTP error */
574   int statcode;                 /* status code */
575   double dltime;                /* time of the download in msecs */
576   int no_truncate;              /* whether truncating the file is
577                                    forbidden. */
578   const char *referer;          /* value of the referer header. */
579   char **local_file;            /* local file. */
580 };
581
582 static void
583 free_hstat (struct http_stat *hs)
584 {
585   xfree_null (hs->newloc);
586   xfree_null (hs->remote_time);
587   xfree_null (hs->error);
588
589   /* Guard against being called twice. */
590   hs->newloc = NULL;
591   hs->remote_time = NULL;
592   hs->error = NULL;
593 }
594
595 static char *create_authorization_line PARAMS ((const char *, const char *,
596                                                 const char *, const char *,
597                                                 const char *));
598 static char *basic_authentication_encode PARAMS ((const char *, const char *,
599                                                   const char *));
600 static int known_authentication_scheme_p PARAMS ((const char *));
601
602 time_t http_atotm PARAMS ((const char *));
603
604 #define BEGINS_WITH(line, string_constant)                              \
605   (!strncasecmp (line, string_constant, sizeof (string_constant) - 1)   \
606    && (ISSPACE (line[sizeof (string_constant) - 1])                     \
607        || !line[sizeof (string_constant) - 1]))
608
609 /* Retrieve a document through HTTP protocol.  It recognizes status
610    code, and correctly handles redirections.  It closes the network
611    socket.  If it receives an error from the functions below it, it
612    will print it if there is enough information to do so (almost
613    always), returning the error to the caller (i.e. http_loop).
614
615    Various HTTP parameters are stored to hs.  Although it parses the
616    response code correctly, it is not used in a sane way.  The caller
617    can do that, though.
618
619    If PROXY is non-NULL, the connection will be made to the proxy
620    server, and u->url will be requested.  */
621 static uerr_t
622 gethttp (struct url *u, struct http_stat *hs, int *dt, struct url *proxy)
623 {
624   char *request, *type, *command, *full_path;
625   char *user, *passwd;
626   char *pragma_h, *referer, *useragent, *range, *wwwauth;
627   char *authenticate_h;
628   char *proxyauth;
629   char *all_headers;
630   char *port_maybe;
631   char *request_keep_alive;
632   int sock, hcount, all_length, statcode;
633   int write_error;
634   long contlen, contrange;
635   struct url *conn;
636   FILE *fp;
637   int auth_tried_already;
638   struct rbuf rbuf;
639 #ifdef HAVE_SSL
640   static SSL_CTX *ssl_ctx = NULL;
641   SSL *ssl = NULL;
642 #endif
643   char *cookies = NULL;
644
645   /* Whether this connection will be kept alive after the HTTP request
646      is done. */
647   int keep_alive;
648
649   /* Flags that detect the two ways of specifying HTTP keep-alive
650      response.  */
651   int http_keep_alive_1, http_keep_alive_2;
652
653   /* Whether keep-alive should be inhibited. */
654   int inhibit_keep_alive;
655
656   /* Whether we need to print the host header with braces around host,
657      e.g. "Host: [3ffe:8100:200:2::2]:1234" instead of the usual
658      "Host: symbolic-name:1234". */
659   int squares_around_host = 0;
660
661   /* Headers sent when using POST. */
662   char *post_content_type, *post_content_length;
663   long post_data_size = 0;
664
665 #ifdef HAVE_SSL
666   /* initialize ssl_ctx on first run */
667   if (!ssl_ctx)
668     {
669       uerr_t err = init_ssl (&ssl_ctx);
670       if (err != 0)
671         {
672           switch (err)
673             {
674             case SSLERRCTXCREATE:
675               /* this is fatal */
676               logprintf (LOG_NOTQUIET, _("Failed to set up an SSL context\n"));
677               ssl_printerrors ();
678               return err;
679             case SSLERRCERTFILE:
680               /* try without certfile */
681               logprintf (LOG_NOTQUIET,
682                          _("Failed to load certificates from %s\n"),
683                          opt.sslcertfile);
684               ssl_printerrors ();
685               logprintf (LOG_NOTQUIET,
686                          _("Trying without the specified certificate\n"));
687               break;
688             case SSLERRCERTKEY:
689               logprintf (LOG_NOTQUIET,
690                          _("Failed to get certificate key from %s\n"),
691                          opt.sslcertkey);
692               ssl_printerrors ();
693               logprintf (LOG_NOTQUIET,
694                          _("Trying without the specified certificate\n"));
695               break;
696             default:
697               break;
698             }
699         }
700     }
701 #endif /* HAVE_SSL */
702
703   if (!(*dt & HEAD_ONLY))
704     /* If we're doing a GET on the URL, as opposed to just a HEAD, we need to
705        know the local filename so we can save to it. */
706     assert (*hs->local_file != NULL);
707
708   authenticate_h = 0;
709   auth_tried_already = 0;
710
711   inhibit_keep_alive = !opt.http_keep_alive || proxy != NULL;
712
713  again:
714   /* We need to come back here when the initial attempt to retrieve
715      without authorization header fails.  (Expected to happen at least
716      for the Digest authorization scheme.)  */
717
718   keep_alive = 0;
719   http_keep_alive_1 = http_keep_alive_2 = 0;
720
721   post_content_type = NULL;
722   post_content_length = NULL;
723
724   /* Initialize certain elements of struct http_stat.  */
725   hs->len = 0L;
726   hs->contlen = -1;
727   hs->res = -1;
728   hs->newloc = NULL;
729   hs->remote_time = NULL;
730   hs->error = NULL;
731
732   /* If we're using a proxy, we will be connecting to the proxy
733      server. */
734   conn = proxy ? proxy : u;
735
736   /* First: establish the connection.  */
737   if (inhibit_keep_alive
738       ||
739 #ifndef HAVE_SSL
740       !persistent_available_p (conn->host, conn->port)
741 #else
742       !persistent_available_p (conn->host, conn->port,
743                                u->scheme == SCHEME_HTTPS)
744 #endif /* HAVE_SSL */
745       )
746     {
747       sock = connect_to_host (conn->host, conn->port);
748       if (sock == E_HOST)
749         return HOSTERR;
750       else if (sock < 0)
751         return CONNECT_ERROR (errno);
752
753 #ifdef HAVE_SSL
754      if (conn->scheme == SCHEME_HTTPS)
755        if (connect_ssl (&ssl, ssl_ctx,sock) != 0)
756          {
757            logputs (LOG_VERBOSE, "\n");
758            logprintf (LOG_NOTQUIET, _("Unable to establish SSL connection.\n"));
759            ssl_printerrors ();
760            CLOSE (sock);
761            return CONSSLERR;
762          }
763 #endif /* HAVE_SSL */
764     }
765   else
766     {
767       logprintf (LOG_VERBOSE, _("Reusing connection to %s:%hu.\n"),
768                  conn->host, conn->port);
769       /* #### pc_last_fd should be accessed through an accessor
770          function.  */
771       sock = pc_last_fd;
772 #ifdef HAVE_SSL
773       ssl = pc_last_ssl;
774 #endif /* HAVE_SSL */
775       DEBUGP (("Reusing fd %d.\n", sock));
776     }
777
778   if (*dt & HEAD_ONLY)
779     command = "HEAD";
780   else if (opt.post_file_name || opt.post_data)
781     command = "POST";
782   else
783     command = "GET";
784
785   referer = NULL;
786   if (hs->referer)
787     {
788       referer = (char *)alloca (9 + strlen (hs->referer) + 3);
789       sprintf (referer, "Referer: %s\r\n", hs->referer);
790     }
791
792   if (*dt & SEND_NOCACHE)
793     pragma_h = "Pragma: no-cache\r\n";
794   else
795     pragma_h = "";
796
797   if (hs->restval)
798     {
799       range = (char *)alloca (13 + numdigit (hs->restval) + 4);
800       /* Gag me!  Some servers (e.g. WebSitePro) have been known to
801          respond to the following `Range' format by generating a
802          multipart/x-byte-ranges MIME document!  This MIME type was
803          present in an old draft of the byteranges specification.
804          HTTP/1.1 specifies a multipart/byte-ranges MIME type, but
805          only if multiple non-overlapping ranges are requested --
806          which Wget never does.  */
807       sprintf (range, "Range: bytes=%ld-\r\n", hs->restval);
808     }
809   else
810     range = NULL;
811   if (opt.useragent)
812     STRDUP_ALLOCA (useragent, opt.useragent);
813   else
814     {
815       useragent = (char *)alloca (10 + strlen (version_string));
816       sprintf (useragent, "Wget/%s", version_string);
817     }
818   /* Construct the authentication, if userid is present.  */
819   user = u->user;
820   passwd = u->passwd;
821   search_netrc (u->host, (const char **)&user, (const char **)&passwd, 0);
822   user = user ? user : opt.http_user;
823   passwd = passwd ? passwd : opt.http_passwd;
824
825   wwwauth = NULL;
826   if (user && passwd)
827     {
828       if (!authenticate_h)
829         {
830           /* We have the username and the password, but haven't tried
831              any authorization yet.  Let's see if the "Basic" method
832              works.  If not, we'll come back here and construct a
833              proper authorization method with the right challenges.
834
835              If we didn't employ this kind of logic, every URL that
836              requires authorization would have to be processed twice,
837              which is very suboptimal and generates a bunch of false
838              "unauthorized" errors in the server log.
839
840              #### But this logic also has a serious problem when used
841              with stronger authentications: we *first* transmit the
842              username and the password in clear text, and *then*
843              attempt a stronger authentication scheme.  That cannot be
844              right!  We are only fortunate that almost everyone still
845              uses the `Basic' scheme anyway.
846
847              There should be an option to prevent this from happening,
848              for those who use strong authentication schemes and value
849              their passwords.  */
850           wwwauth = basic_authentication_encode (user, passwd, "Authorization");
851         }
852       else
853         {
854           /* Use the full path, i.e. one that includes the leading
855              slash and the query string, but is independent of proxy
856              setting.  */
857           char *pth = url_full_path (u);
858           wwwauth = create_authorization_line (authenticate_h, user, passwd,
859                                                command, pth);
860           xfree (pth);
861         }
862     }
863
864   proxyauth = NULL;
865   if (proxy)
866     {
867       char *proxy_user, *proxy_passwd;
868       /* For normal username and password, URL components override
869          command-line/wgetrc parameters.  With proxy authentication,
870          it's the reverse, because proxy URLs are normally the
871          "permanent" ones, so command-line args should take
872          precedence.  */
873       if (opt.proxy_user && opt.proxy_passwd)
874         {
875           proxy_user = opt.proxy_user;
876           proxy_passwd = opt.proxy_passwd;
877         }
878       else
879         {
880           proxy_user = proxy->user;
881           proxy_passwd = proxy->passwd;
882         }
883       /* #### This does not appear right.  Can't the proxy request,
884          say, `Digest' authentication?  */
885       if (proxy_user && proxy_passwd)
886         proxyauth = basic_authentication_encode (proxy_user, proxy_passwd,
887                                                  "Proxy-Authorization");
888     }
889
890   /* String of the form :PORT.  Used only for non-standard ports. */
891   port_maybe = NULL;
892   if (u->port != scheme_default_port (u->scheme))
893     {
894       port_maybe = (char *)alloca (numdigit (u->port) + 2);
895       sprintf (port_maybe, ":%d", u->port);
896     }
897
898   if (!inhibit_keep_alive)
899     request_keep_alive = "Connection: Keep-Alive\r\n";
900   else
901     request_keep_alive = NULL;
902
903   if (opt.cookies)
904     cookies = cookie_jar_generate_cookie_header (wget_cookie_jar, u->host,
905                                                  u->port, u->path,
906 #ifdef HAVE_SSL
907                                                  u->scheme == SCHEME_HTTPS
908 #else
909                                                  0
910 #endif
911                                  );
912
913   if (opt.post_data || opt.post_file_name)
914     {
915       post_content_type = "Content-Type: application/x-www-form-urlencoded\r\n";
916       if (opt.post_data)
917         post_data_size = strlen (opt.post_data);
918       else
919         {
920           post_data_size = file_size (opt.post_file_name);
921           if (post_data_size == -1)
922             {
923               logprintf (LOG_NOTQUIET, "POST data file missing: %s\n",
924                          opt.post_file_name);
925               post_data_size = 0;
926             }
927         }
928       post_content_length = xmalloc (16 + numdigit (post_data_size) + 2 + 1);
929       sprintf (post_content_length,
930                "Content-Length: %ld\r\n", post_data_size);
931     }
932
933   if (proxy)
934     full_path = xstrdup (u->url);
935   else
936     /* Use the full path, i.e. one that includes the leading slash and
937        the query string.  E.g. if u->path is "foo/bar" and u->query is
938        "param=value", full_path will be "/foo/bar?param=value".  */
939     full_path = url_full_path (u);
940
941   if (strchr (u->host, ':'))
942     squares_around_host = 1;
943
944   /* Allocate the memory for the request.  */
945   request = (char *)alloca (strlen (command)
946                             + strlen (full_path)
947                             + strlen (useragent)
948                             + strlen (u->host)
949                             + (port_maybe ? strlen (port_maybe) : 0)
950                             + strlen (HTTP_ACCEPT)
951                             + (request_keep_alive
952                                ? strlen (request_keep_alive) : 0)
953                             + (referer ? strlen (referer) : 0)
954                             + (cookies ? strlen (cookies) : 0)
955                             + (wwwauth ? strlen (wwwauth) : 0)
956                             + (proxyauth ? strlen (proxyauth) : 0)
957                             + (range ? strlen (range) : 0)
958                             + strlen (pragma_h)
959                             + (post_content_type
960                                ? strlen (post_content_type) : 0)
961                             + (post_content_length
962                                ? strlen (post_content_length) : 0)
963                             + (opt.user_header ? strlen (opt.user_header) : 0)
964                             + 64);
965   /* Construct the request.  */
966   sprintf (request, "\
967 %s %s HTTP/1.0\r\n\
968 User-Agent: %s\r\n\
969 Host: %s%s%s%s\r\n\
970 Accept: %s\r\n\
971 %s%s%s%s%s%s%s%s%s%s\r\n",
972            command, full_path,
973            useragent,
974            squares_around_host ? "[" : "", u->host, squares_around_host ? "]" : "",
975            port_maybe ? port_maybe : "",
976            HTTP_ACCEPT,
977            request_keep_alive ? request_keep_alive : "",
978            referer ? referer : "",
979            cookies ? cookies : "", 
980            wwwauth ? wwwauth : "", 
981            proxyauth ? proxyauth : "", 
982            range ? range : "",
983            pragma_h,
984            post_content_type ? post_content_type : "",
985            post_content_length ? post_content_length : "",
986            opt.user_header ? opt.user_header : "");
987   DEBUGP (("---request begin---\n%s", request));
988
989   /* Free the temporary memory.  */
990   xfree_null (wwwauth);
991   xfree_null (proxyauth);
992   xfree_null (cookies);
993   xfree (full_path);
994
995   /* Send the request to server.  */
996 #ifdef HAVE_SSL
997   if (conn->scheme == SCHEME_HTTPS)
998     write_error = ssl_iwrite (ssl, request, strlen (request));
999   else
1000 #endif
1001     write_error = iwrite (sock, request, strlen (request));
1002
1003   if (write_error >= 0)
1004     {
1005       if (opt.post_data)
1006         {
1007           DEBUGP (("[POST data: %s]\n", opt.post_data));
1008 #ifdef HAVE_SSL
1009           if (conn->scheme == SCHEME_HTTPS)
1010             write_error = ssl_iwrite (ssl, opt.post_data, post_data_size);
1011           else
1012 #endif
1013             write_error = iwrite (sock, opt.post_data, post_data_size);
1014         }
1015       else if (opt.post_file_name && post_data_size != 0)
1016         {
1017 #ifdef HAVE_SSL
1018           if (conn->scheme == SCHEME_HTTPS)
1019             write_error = post_file (-1, ssl, opt.post_file_name,
1020                                      post_data_size);
1021           else
1022 #endif
1023             write_error = post_file (sock, NULL, opt.post_file_name,
1024                                      post_data_size);
1025         }
1026     }
1027   DEBUGP (("---request end---\n"));
1028
1029   if (write_error < 0)
1030     {
1031       logprintf (LOG_VERBOSE, _("Failed writing HTTP request: %s.\n"),
1032                  strerror (errno));
1033       CLOSE_INVALIDATE (sock);
1034       return WRITEFAILED;
1035     }
1036   logprintf (LOG_VERBOSE, _("%s request sent, awaiting response... "),
1037              proxy ? "Proxy" : "HTTP");
1038   contlen = contrange = -1;
1039   type = NULL;
1040   statcode = -1;
1041   *dt &= ~RETROKF;
1042
1043   /* Before reading anything, initialize the rbuf.  */
1044   rbuf_initialize (&rbuf, sock);
1045 #ifdef HAVE_SSL
1046   if (conn->scheme == SCHEME_HTTPS)
1047     rbuf.ssl = ssl;
1048   else
1049     rbuf.ssl = NULL;
1050 #endif /* HAVE_SSL */
1051   all_headers = NULL;
1052   all_length = 0;
1053   /* Header-fetching loop.  */
1054   hcount = 0;
1055   while (1)
1056     {
1057       char *hdr;
1058       int status;
1059
1060       ++hcount;
1061       /* Get the header.  */
1062       status = header_get (&rbuf, &hdr,
1063                            /* Disallow continuations for status line.  */
1064                            (hcount == 1 ? HG_NO_CONTINUATIONS : HG_NONE));
1065
1066       /* Check for errors.  */
1067       if (status == HG_EOF && *hdr)
1068         {
1069           /* This used to be an unconditional error, but that was
1070              somewhat controversial, because of a large number of
1071              broken CGI's that happily "forget" to send the second EOL
1072              before closing the connection of a HEAD request.
1073
1074              So, the deal is to check whether the header is empty
1075              (*hdr is zero if it is); if yes, it means that the
1076              previous header was fully retrieved, and that -- most
1077              probably -- the request is complete.  "...be liberal in
1078              what you accept."  Oh boy.  */
1079           logputs (LOG_VERBOSE, "\n");
1080           logputs (LOG_NOTQUIET, _("End of file while parsing headers.\n"));
1081           xfree (hdr);
1082           xfree_null (type);
1083           xfree_null (all_headers);
1084           CLOSE_INVALIDATE (sock);
1085           return HEOF;
1086         }
1087       else if (status == HG_ERROR)
1088         {
1089           logputs (LOG_VERBOSE, "\n");
1090           logprintf (LOG_NOTQUIET, _("Read error (%s) in headers.\n"),
1091                      strerror (errno));
1092           xfree (hdr);
1093           xfree_null (type);
1094           xfree_null (all_headers);
1095           CLOSE_INVALIDATE (sock);
1096           return HERR;
1097         }
1098
1099       /* If the headers are to be saved to a file later, save them to
1100          memory now.  */
1101       if (opt.save_headers)
1102         {
1103           int lh = strlen (hdr);
1104           all_headers = (char *)xrealloc (all_headers, all_length + lh + 2);
1105           memcpy (all_headers + all_length, hdr, lh);
1106           all_length += lh;
1107           all_headers[all_length++] = '\n';
1108           all_headers[all_length] = '\0';
1109         }
1110
1111       /* Check for status line.  */
1112       if (hcount == 1)
1113         {
1114           const char *error;
1115           /* Parse the first line of server response.  */
1116           statcode = parse_http_status_line (hdr, &error);
1117           hs->statcode = statcode;
1118           /* Store the descriptive response.  */
1119           if (statcode == -1) /* malformed response */
1120             {
1121               /* A common reason for "malformed response" error is the
1122                  case when no data was actually received.  Handle this
1123                  special case.  */
1124               if (!*hdr)
1125                 hs->error = xstrdup (_("No data received"));
1126               else
1127                 hs->error = xstrdup (_("Malformed status line"));
1128               xfree (hdr);
1129               break;
1130             }
1131           else if (!*error)
1132             hs->error = xstrdup (_("(no description)"));
1133           else
1134             hs->error = xstrdup (error);
1135
1136           if ((statcode != -1)
1137 #ifdef ENABLE_DEBUG
1138               && !opt.debug
1139 #endif
1140               )
1141             {
1142              if (opt.server_response)
1143                logprintf (LOG_VERBOSE, "\n%2d %s", hcount, hdr);
1144              else
1145                logprintf (LOG_VERBOSE, "%2d %s", statcode, error);
1146             }
1147
1148           goto done_header;
1149         }
1150
1151       /* Exit on empty header.  */
1152       if (!*hdr)
1153         {
1154           xfree (hdr);
1155           break;
1156         }
1157
1158       /* Print the header if requested.  */
1159       if (opt.server_response && hcount != 1)
1160         logprintf (LOG_VERBOSE, "\n%2d %s", hcount, hdr);
1161
1162       /* Try getting content-length.  */
1163       if (contlen == -1 && !opt.ignore_length)
1164         if (header_process (hdr, "Content-Length", header_extract_number,
1165                             &contlen))
1166           goto done_header;
1167       /* Try getting content-type.  */
1168       if (!type)
1169         if (header_process (hdr, "Content-Type", http_process_type, &type))
1170           goto done_header;
1171       /* Try getting location.  */
1172       if (!hs->newloc)
1173         if (header_process (hdr, "Location", header_strdup, &hs->newloc))
1174           goto done_header;
1175       /* Try getting last-modified.  */
1176       if (!hs->remote_time)
1177         if (header_process (hdr, "Last-Modified", header_strdup,
1178                             &hs->remote_time))
1179           goto done_header;
1180       /* Try getting cookies. */
1181       if (opt.cookies)
1182         if (header_process (hdr, "Set-Cookie", http_process_set_cookie, u))
1183           goto done_header;
1184       /* Try getting www-authentication.  */
1185       if (!authenticate_h)
1186         if (header_process (hdr, "WWW-Authenticate", header_strdup,
1187                             &authenticate_h))
1188           goto done_header;
1189       /* Check for accept-ranges header.  If it contains the word
1190          `none', disable the ranges.  */
1191       if (*dt & ACCEPTRANGES)
1192         {
1193           int nonep;
1194           if (header_process (hdr, "Accept-Ranges", http_process_none, &nonep))
1195             {
1196               if (nonep)
1197                 *dt &= ~ACCEPTRANGES;
1198               goto done_header;
1199             }
1200         }
1201       /* Try getting content-range.  */
1202       if (contrange == -1)
1203         {
1204           struct http_process_range_closure closure;
1205           if (header_process (hdr, "Content-Range", http_process_range, &closure))
1206             {
1207               contrange = closure.first_byte_pos;
1208               goto done_header;
1209             }
1210         }
1211       /* Check for keep-alive related responses. */
1212       if (!inhibit_keep_alive)
1213         {
1214           /* Check for the `Keep-Alive' header. */
1215           if (!http_keep_alive_1)
1216             {
1217               if (header_process (hdr, "Keep-Alive", header_exists,
1218                                   &http_keep_alive_1))
1219                 goto done_header;
1220             }
1221           /* Check for `Connection: Keep-Alive'. */
1222           if (!http_keep_alive_2)
1223             {
1224               if (header_process (hdr, "Connection", http_process_connection,
1225                                   &http_keep_alive_2))
1226                 goto done_header;
1227             }
1228         }
1229     done_header:
1230       xfree (hdr);
1231     }
1232
1233   logputs (LOG_VERBOSE, "\n");
1234
1235   if (contlen != -1
1236       && (http_keep_alive_1 || http_keep_alive_2))
1237     {
1238       assert (inhibit_keep_alive == 0);
1239       keep_alive = 1;
1240     }
1241   if (keep_alive)
1242     /* The server has promised that it will not close the connection
1243        when we're done.  This means that we can register it.  */
1244 #ifndef HAVE_SSL
1245     register_persistent (conn->host, conn->port, sock);
1246 #else
1247     register_persistent (conn->host, conn->port, sock, ssl);
1248 #endif /* HAVE_SSL */
1249
1250   if ((statcode == HTTP_STATUS_UNAUTHORIZED)
1251       && authenticate_h)
1252     {
1253       /* Authorization is required.  */
1254       xfree_null (type);
1255       type = NULL;
1256       free_hstat (hs);
1257       CLOSE_INVALIDATE (sock);  /* would be CLOSE_FINISH, but there
1258                                    might be more bytes in the body. */
1259       if (auth_tried_already)
1260         {
1261           /* If we have tried it already, then there is not point
1262              retrying it.  */
1263         failed:
1264           logputs (LOG_NOTQUIET, _("Authorization failed.\n"));
1265           xfree (authenticate_h);
1266           return AUTHFAILED;
1267         }
1268       else if (!known_authentication_scheme_p (authenticate_h))
1269         {
1270           xfree (authenticate_h);
1271           logputs (LOG_NOTQUIET, _("Unknown authentication scheme.\n"));
1272           return AUTHFAILED;
1273         }
1274       else if (BEGINS_WITH (authenticate_h, "Basic"))
1275         {
1276           /* The authentication scheme is basic, the one we try by
1277              default, and it failed.  There's no sense in trying
1278              again.  */
1279           goto failed;
1280         }
1281       else
1282         {
1283           auth_tried_already = 1;
1284           goto again;
1285         }
1286     }
1287   /* We do not need this anymore.  */
1288   if (authenticate_h)
1289     {
1290       xfree (authenticate_h);
1291       authenticate_h = NULL;
1292     }
1293
1294   /* 20x responses are counted among successful by default.  */
1295   if (H_20X (statcode))
1296     *dt |= RETROKF;
1297
1298   /* Return if redirected.  */
1299   if (H_REDIRECTED (statcode) || statcode == HTTP_STATUS_MULTIPLE_CHOICES)
1300     {
1301       /* RFC2068 says that in case of the 300 (multiple choices)
1302          response, the server can output a preferred URL through
1303          `Location' header; otherwise, the request should be treated
1304          like GET.  So, if the location is set, it will be a
1305          redirection; otherwise, just proceed normally.  */
1306       if (statcode == HTTP_STATUS_MULTIPLE_CHOICES && !hs->newloc)
1307         *dt |= RETROKF;
1308       else
1309         {
1310           logprintf (LOG_VERBOSE,
1311                      _("Location: %s%s\n"),
1312                      hs->newloc ? hs->newloc : _("unspecified"),
1313                      hs->newloc ? _(" [following]") : "");
1314           CLOSE_INVALIDATE (sock);      /* would be CLOSE_FINISH, but there
1315                                            might be more bytes in the body. */
1316           xfree_null (type);
1317           xfree_null (all_headers);
1318           return NEWLOCATION;
1319         }
1320     }
1321
1322   /* If content-type is not given, assume text/html.  This is because
1323      of the multitude of broken CGI's that "forget" to generate the
1324      content-type.  */
1325   if (!type ||
1326         0 == strncasecmp (type, TEXTHTML_S, strlen (TEXTHTML_S)) ||
1327         0 == strncasecmp (type, TEXTXHTML_S, strlen (TEXTXHTML_S)))
1328     *dt |= TEXTHTML;
1329   else
1330     *dt &= ~TEXTHTML;
1331
1332   if (opt.html_extension && (*dt & TEXTHTML))
1333     /* -E / --html-extension / html_extension = on was specified, and this is a
1334        text/html file.  If some case-insensitive variation on ".htm[l]" isn't
1335        already the file's suffix, tack on ".html". */
1336     {
1337       char*  last_period_in_local_filename = strrchr(*hs->local_file, '.');
1338
1339       if (last_period_in_local_filename == NULL
1340           || !(0 == strcasecmp (last_period_in_local_filename, ".htm")
1341                || 0 == strcasecmp (last_period_in_local_filename, ".html")))
1342         {
1343           size_t  local_filename_len = strlen(*hs->local_file);
1344           
1345           *hs->local_file = xrealloc(*hs->local_file,
1346                                      local_filename_len + sizeof(".html"));
1347           strcpy(*hs->local_file + local_filename_len, ".html");
1348
1349           *dt |= ADDED_HTML_EXTENSION;
1350         }
1351     }
1352
1353   if (contrange == -1)
1354     {
1355       /* We did not get a content-range header.  This means that the
1356          server did not honor our `Range' request.  Normally, this
1357          means we should reset hs->restval and continue normally.  */
1358
1359       /* However, if `-c' is used, we need to be a bit more careful:
1360
1361          1. If `-c' is specified and the file already existed when
1362          Wget was started, it would be a bad idea for us to start
1363          downloading it from scratch, effectively truncating it.  I
1364          believe this cannot happen unless `-c' was specified.
1365
1366          2. If `-c' is used on a file that is already fully
1367          downloaded, we're requesting bytes after the end of file,
1368          which can result in server not honoring `Range'.  If this is
1369          the case, `Content-Length' will be equal to the length of the
1370          file.  */
1371       if (opt.always_rest)
1372         {
1373           /* Check for condition #2. */
1374           if (hs->restval > 0               /* restart was requested. */
1375               && contlen != -1              /* we got content-length. */
1376               && hs->restval >= contlen     /* file fully downloaded
1377                                                or has shrunk.  */
1378               )
1379             {
1380               logputs (LOG_VERBOSE, _("\
1381 \n    The file is already fully retrieved; nothing to do.\n\n"));
1382               /* In case the caller inspects. */
1383               hs->len = contlen;
1384               hs->res = 0;
1385               /* Mark as successfully retrieved. */
1386               *dt |= RETROKF;
1387               xfree_null (type);
1388               xfree_null (all_headers);
1389               CLOSE_INVALIDATE (sock);  /* would be CLOSE_FINISH, but there
1390                                            might be more bytes in the body. */
1391               return RETRUNNEEDED;
1392             }
1393
1394           /* Check for condition #1. */
1395           if (hs->no_truncate)
1396             {
1397               logprintf (LOG_NOTQUIET,
1398                          _("\
1399 \n\
1400 Continued download failed on this file, which conflicts with `-c'.\n\
1401 Refusing to truncate existing file `%s'.\n\n"), *hs->local_file);
1402               xfree_null (type);
1403               xfree_null (all_headers);
1404               CLOSE_INVALIDATE (sock);
1405               return CONTNOTSUPPORTED;
1406             }
1407
1408           /* Fallthrough */
1409         }
1410
1411       hs->restval = 0;
1412     }
1413   else if (contrange != hs->restval ||
1414            (H_PARTIAL (statcode) && contrange == -1))
1415     {
1416       /* This means the whole request was somehow misunderstood by the
1417          server.  Bail out.  */
1418       xfree_null (type);
1419       xfree_null (all_headers);
1420       CLOSE_INVALIDATE (sock);
1421       return RANGEERR;
1422     }
1423
1424   if (hs->restval)
1425     {
1426       if (contlen != -1)
1427         contlen += contrange;
1428       else
1429         contrange = -1;        /* If conent-length was not sent,
1430                                   content-range will be ignored.  */
1431     }
1432   hs->contlen = contlen;
1433
1434   if (opt.verbose)
1435     {
1436       if ((*dt & RETROKF) && !opt.server_response)
1437         {
1438           /* No need to print this output if the body won't be
1439              downloaded at all, or if the original server response is
1440              printed.  */
1441           logputs (LOG_VERBOSE, _("Length: "));
1442           if (contlen != -1)
1443             {
1444               logputs (LOG_VERBOSE, legible (contlen));
1445               if (contrange != -1)
1446                 logprintf (LOG_VERBOSE, _(" (%s to go)"),
1447                            legible (contlen - contrange));
1448             }
1449           else
1450             logputs (LOG_VERBOSE,
1451                      opt.ignore_length ? _("ignored") : _("unspecified"));
1452           if (type)
1453             logprintf (LOG_VERBOSE, " [%s]\n", type);
1454           else
1455             logputs (LOG_VERBOSE, "\n");
1456         }
1457     }
1458   xfree_null (type);
1459   type = NULL;                  /* We don't need it any more.  */
1460
1461   /* Return if we have no intention of further downloading.  */
1462   if (!(*dt & RETROKF) || (*dt & HEAD_ONLY))
1463     {
1464       /* In case the caller cares to look...  */
1465       hs->len = 0L;
1466       hs->res = 0;
1467       xfree_null (type);
1468       xfree_null (all_headers);
1469       CLOSE_INVALIDATE (sock);  /* would be CLOSE_FINISH, but there
1470                                    might be more bytes in the body. */
1471       return RETRFINISHED;
1472     }
1473
1474   /* Open the local file.  */
1475   if (!opt.dfp)
1476     {
1477       mkalldirs (*hs->local_file);
1478       if (opt.backups)
1479         rotate_backups (*hs->local_file);
1480       fp = fopen (*hs->local_file, hs->restval ? "ab" : "wb");
1481       if (!fp)
1482         {
1483           logprintf (LOG_NOTQUIET, "%s: %s\n", *hs->local_file, strerror (errno));
1484           CLOSE_INVALIDATE (sock); /* would be CLOSE_FINISH, but there
1485                                       might be more bytes in the body. */
1486           xfree_null (all_headers);
1487           return FOPENERR;
1488         }
1489     }
1490   else                          /* opt.dfp */
1491     {
1492       extern int global_download_count;
1493       fp = opt.dfp;
1494       /* To ensure that repeated "from scratch" downloads work for -O
1495          files, we rewind the file pointer, unless restval is
1496          non-zero.  (This works only when -O is used on regular files,
1497          but it's still a valuable feature.)
1498
1499          However, this loses when more than one URL is specified on
1500          the command line the second rewinds eradicates the contents
1501          of the first download.  Thus we disable the above trick for
1502          all the downloads except the very first one.
1503
1504          #### A possible solution to this would be to remember the
1505          file position in the output document and to seek to that
1506          position, instead of rewinding.
1507
1508          We don't truncate stdout, since that breaks
1509          "wget -O - [...] >> foo".
1510       */
1511       if (!hs->restval && global_download_count == 0 && opt.dfp != stdout)
1512         {
1513           /* This will silently fail for streams that don't correspond
1514              to regular files, but that's OK.  */
1515           rewind (fp);
1516           /* ftruncate is needed because opt.dfp is opened in append
1517              mode if opt.always_rest is set.  */
1518           ftruncate (fileno (fp), 0);
1519           clearerr (fp);
1520         }
1521     }
1522
1523   /* #### This confuses the code that checks for file size.  There
1524      should be some overhead information.  */
1525   if (opt.save_headers)
1526     fwrite (all_headers, 1, all_length, fp);
1527
1528   /* Get the contents of the document.  */
1529   hs->res = get_contents (sock, fp, &hs->len, hs->restval,
1530                           (contlen != -1 ? contlen : 0),
1531                           &rbuf, keep_alive, &hs->dltime);
1532
1533   if (hs->res >= 0)
1534     CLOSE_FINISH (sock);
1535   else
1536     CLOSE_INVALIDATE (sock);
1537
1538   {
1539     /* Close or flush the file.  We have to be careful to check for
1540        error here.  Checking the result of fwrite() is not enough --
1541        errors could go unnoticed!  */
1542     int flush_res;
1543     if (!opt.dfp)
1544       flush_res = fclose (fp);
1545     else
1546       flush_res = fflush (fp);
1547     if (flush_res == EOF)
1548       hs->res = -2;
1549   }
1550   xfree_null (all_headers);
1551   if (hs->res == -2)
1552     return FWRITEERR;
1553   return RETRFINISHED;
1554 }
1555
1556 /* The genuine HTTP loop!  This is the part where the retrieval is
1557    retried, and retried, and retried, and...  */
1558 uerr_t
1559 http_loop (struct url *u, char **newloc, char **local_file, const char *referer,
1560            int *dt, struct url *proxy)
1561 {
1562   int count;
1563   int use_ts, got_head = 0;     /* time-stamping info */
1564   char *filename_plus_orig_suffix;
1565   char *local_filename = NULL;
1566   char *tms, *locf, *tmrate;
1567   uerr_t err;
1568   time_t tml = -1, tmr = -1;    /* local and remote time-stamps */
1569   long local_size = 0;          /* the size of the local file */
1570   size_t filename_len;
1571   struct http_stat hstat;       /* HTTP status */
1572   struct stat st;
1573   char *dummy = NULL;
1574
1575   /* This used to be done in main(), but it's a better idea to do it
1576      here so that we don't go through the hoops if we're just using
1577      FTP or whatever. */
1578   if (opt.cookies)
1579     {
1580       if (!wget_cookie_jar)
1581         wget_cookie_jar = cookie_jar_new ();
1582       if (opt.cookies_input && !cookies_loaded_p)
1583         {
1584           cookie_jar_load (wget_cookie_jar, opt.cookies_input);
1585           cookies_loaded_p = 1;
1586         }
1587     }
1588
1589   *newloc = NULL;
1590
1591   /* Warn on (likely bogus) wildcard usage in HTTP.  Don't use
1592      has_wildcards_p because it would also warn on `?', and we know that
1593      shows up in CGI paths a *lot*.  */
1594   if (strchr (u->url, '*'))
1595     logputs (LOG_VERBOSE, _("Warning: wildcards not supported in HTTP.\n"));
1596
1597   /* Determine the local filename.  */
1598   if (local_file && *local_file)
1599     hstat.local_file = local_file;
1600   else if (local_file)
1601     {
1602       *local_file = url_file_name (u);
1603       hstat.local_file = local_file;
1604     }
1605   else
1606     {
1607       dummy = url_file_name (u);
1608       hstat.local_file = &dummy;
1609     }
1610
1611   if (!opt.output_document)
1612     locf = *hstat.local_file;
1613   else
1614     locf = opt.output_document;
1615
1616   hstat.referer = referer;
1617
1618   filename_len = strlen (*hstat.local_file);
1619   filename_plus_orig_suffix = alloca (filename_len + sizeof (".orig"));
1620
1621   if (opt.noclobber && file_exists_p (*hstat.local_file))
1622     {
1623       /* If opt.noclobber is turned on and file already exists, do not
1624          retrieve the file */
1625       logprintf (LOG_VERBOSE, _("\
1626 File `%s' already there, will not retrieve.\n"), *hstat.local_file);
1627       /* If the file is there, we suppose it's retrieved OK.  */
1628       *dt |= RETROKF;
1629
1630       /* #### Bogusness alert.  */
1631       /* If its suffix is "html" or "htm" or similar, assume text/html.  */
1632       if (has_html_suffix_p (*hstat.local_file))
1633         *dt |= TEXTHTML;
1634
1635       xfree_null (dummy);
1636       return RETROK;
1637     }
1638
1639   use_ts = 0;
1640   if (opt.timestamping)
1641     {
1642       int local_dot_orig_file_exists = 0;
1643
1644       if (opt.backup_converted)
1645         /* If -K is specified, we'll act on the assumption that it was specified
1646            last time these files were downloaded as well, and instead of just
1647            comparing local file X against server file X, we'll compare local
1648            file X.orig (if extant, else X) against server file X.  If -K
1649            _wasn't_ specified last time, or the server contains files called
1650            *.orig, -N will be back to not operating correctly with -k. */
1651         {
1652           /* Would a single s[n]printf() call be faster?  --dan
1653
1654              Definitely not.  sprintf() is horribly slow.  It's a
1655              different question whether the difference between the two
1656              affects a program.  Usually I'd say "no", but at one
1657              point I profiled Wget, and found that a measurable and
1658              non-negligible amount of time was lost calling sprintf()
1659              in url.c.  Replacing sprintf with inline calls to
1660              strcpy() and long_to_string() made a difference.
1661              --hniksic */
1662           memcpy (filename_plus_orig_suffix, *hstat.local_file, filename_len);
1663           memcpy (filename_plus_orig_suffix + filename_len,
1664                   ".orig", sizeof (".orig"));
1665
1666           /* Try to stat() the .orig file. */
1667           if (stat (filename_plus_orig_suffix, &st) == 0)
1668             {
1669               local_dot_orig_file_exists = 1;
1670               local_filename = filename_plus_orig_suffix;
1671             }
1672         }      
1673
1674       if (!local_dot_orig_file_exists)
1675         /* Couldn't stat() <file>.orig, so try to stat() <file>. */
1676         if (stat (*hstat.local_file, &st) == 0)
1677           local_filename = *hstat.local_file;
1678
1679       if (local_filename != NULL)
1680         /* There was a local file, so we'll check later to see if the version
1681            the server has is the same version we already have, allowing us to
1682            skip a download. */
1683         {
1684           use_ts = 1;
1685           tml = st.st_mtime;
1686 #ifdef WINDOWS
1687           /* Modification time granularity is 2 seconds for Windows, so
1688              increase local time by 1 second for later comparison. */
1689           tml++;
1690 #endif
1691           local_size = st.st_size;
1692           got_head = 0;
1693         }
1694     }
1695   /* Reset the counter.  */
1696   count = 0;
1697   *dt = 0 | ACCEPTRANGES;
1698   /* THE loop */
1699   do
1700     {
1701       /* Increment the pass counter.  */
1702       ++count;
1703       sleep_between_retrievals (count);
1704       /* Get the current time string.  */
1705       tms = time_str (NULL);
1706       /* Print fetch message, if opt.verbose.  */
1707       if (opt.verbose)
1708         {
1709           char *hurl = url_string (u, 1);
1710           char tmp[15];
1711           strcpy (tmp, "        ");
1712           if (count > 1)
1713             sprintf (tmp, _("(try:%2d)"), count);
1714           logprintf (LOG_VERBOSE, "--%s--  %s\n  %s => `%s'\n",
1715                      tms, hurl, tmp, locf);
1716 #ifdef WINDOWS
1717           ws_changetitle (hurl, 1);
1718 #endif
1719           xfree (hurl);
1720         }
1721
1722       /* Default document type is empty.  However, if spider mode is
1723          on or time-stamping is employed, HEAD_ONLY commands is
1724          encoded within *dt.  */
1725       if (opt.spider || (use_ts && !got_head))
1726         *dt |= HEAD_ONLY;
1727       else
1728         *dt &= ~HEAD_ONLY;
1729       /* Assume no restarting.  */
1730       hstat.restval = 0L;
1731       /* Decide whether or not to restart.  */
1732       if (((count > 1 && (*dt & ACCEPTRANGES)) || opt.always_rest)
1733           /* #### this calls access() and then stat(); could be optimized. */
1734           && file_exists_p (locf))
1735         if (stat (locf, &st) == 0 && S_ISREG (st.st_mode))
1736           hstat.restval = st.st_size;
1737
1738       /* In `-c' is used and the file is existing and non-empty,
1739          refuse to truncate it if the server doesn't support continued
1740          downloads.  */
1741       hstat.no_truncate = 0;
1742       if (opt.always_rest && hstat.restval)
1743         hstat.no_truncate = 1;
1744
1745       /* Decide whether to send the no-cache directive.  We send it in
1746          two cases:
1747            a) we're using a proxy, and we're past our first retrieval.
1748               Some proxies are notorious for caching incomplete data, so
1749               we require a fresh get.
1750            b) caching is explicitly inhibited. */
1751       if ((proxy && count > 1)  /* a */
1752           || !opt.allow_cache   /* b */
1753           )
1754         *dt |= SEND_NOCACHE;
1755       else
1756         *dt &= ~SEND_NOCACHE;
1757
1758       /* Try fetching the document, or at least its head.  */
1759       err = gethttp (u, &hstat, dt, proxy);
1760
1761       /* It's unfortunate that wget determines the local filename before finding
1762          out the Content-Type of the file.  Barring a major restructuring of the
1763          code, we need to re-set locf here, since gethttp() may have xrealloc()d
1764          *hstat.local_file to tack on ".html". */
1765       if (!opt.output_document)
1766         locf = *hstat.local_file;
1767       else
1768         locf = opt.output_document;
1769
1770       /* Time?  */
1771       tms = time_str (NULL);
1772       /* Get the new location (with or without the redirection).  */
1773       if (hstat.newloc)
1774         *newloc = xstrdup (hstat.newloc);
1775       switch (err)
1776         {
1777         case HERR: case HEOF: case CONSOCKERR: case CONCLOSED:
1778         case CONERROR: case READERR: case WRITEFAILED:
1779         case RANGEERR:
1780           /* Non-fatal errors continue executing the loop, which will
1781              bring them to "while" statement at the end, to judge
1782              whether the number of tries was exceeded.  */
1783           free_hstat (&hstat);
1784           printwhat (count, opt.ntry);
1785           continue;
1786           break;
1787         case HOSTERR: case CONIMPOSSIBLE: case PROXERR: case AUTHFAILED: 
1788         case SSLERRCTXCREATE: case CONTNOTSUPPORTED:
1789           /* Fatal errors just return from the function.  */
1790           free_hstat (&hstat);
1791           xfree_null (dummy);
1792           return err;
1793           break;
1794         case FWRITEERR: case FOPENERR:
1795           /* Another fatal error.  */
1796           logputs (LOG_VERBOSE, "\n");
1797           logprintf (LOG_NOTQUIET, _("Cannot write to `%s' (%s).\n"),
1798                      *hstat.local_file, strerror (errno));
1799           free_hstat (&hstat);
1800           xfree_null (dummy);
1801           return err;
1802           break;
1803         case CONSSLERR:
1804           /* Another fatal error.  */
1805           logputs (LOG_VERBOSE, "\n");
1806           logprintf (LOG_NOTQUIET, _("Unable to establish SSL connection.\n"));
1807           free_hstat (&hstat);
1808           xfree_null (dummy);
1809           return err;
1810           break;
1811         case NEWLOCATION:
1812           /* Return the new location to the caller.  */
1813           if (!hstat.newloc)
1814             {
1815               logprintf (LOG_NOTQUIET,
1816                          _("ERROR: Redirection (%d) without location.\n"),
1817                          hstat.statcode);
1818               free_hstat (&hstat);
1819               xfree_null (dummy);
1820               return WRONGCODE;
1821             }
1822           free_hstat (&hstat);
1823           xfree_null (dummy);
1824           return NEWLOCATION;
1825           break;
1826         case RETRUNNEEDED:
1827           /* The file was already fully retrieved. */
1828           free_hstat (&hstat);
1829           xfree_null (dummy);
1830           return RETROK;
1831           break;
1832         case RETRFINISHED:
1833           /* Deal with you later.  */
1834           break;
1835         default:
1836           /* All possibilities should have been exhausted.  */
1837           abort ();
1838         }
1839       if (!(*dt & RETROKF))
1840         {
1841           if (!opt.verbose)
1842             {
1843               /* #### Ugly ugly ugly! */
1844               char *hurl = url_string (u, 1);
1845               logprintf (LOG_NONVERBOSE, "%s:\n", hurl);
1846               xfree (hurl);
1847             }
1848           logprintf (LOG_NOTQUIET, _("%s ERROR %d: %s.\n"),
1849                      tms, hstat.statcode, hstat.error);
1850           logputs (LOG_VERBOSE, "\n");
1851           free_hstat (&hstat);
1852           xfree_null (dummy);
1853           return WRONGCODE;
1854         }
1855
1856       /* Did we get the time-stamp?  */
1857       if (!got_head)
1858         {
1859           if (opt.timestamping && !hstat.remote_time)
1860             {
1861               logputs (LOG_NOTQUIET, _("\
1862 Last-modified header missing -- time-stamps turned off.\n"));
1863             }
1864           else if (hstat.remote_time)
1865             {
1866               /* Convert the date-string into struct tm.  */
1867               tmr = http_atotm (hstat.remote_time);
1868               if (tmr == (time_t) (-1))
1869                 logputs (LOG_VERBOSE, _("\
1870 Last-modified header invalid -- time-stamp ignored.\n"));
1871             }
1872         }
1873
1874       /* The time-stamping section.  */
1875       if (use_ts)
1876         {
1877           got_head = 1;
1878           *dt &= ~HEAD_ONLY;
1879           use_ts = 0;           /* no more time-stamping */
1880           count = 0;            /* the retrieve count for HEAD is
1881                                    reset */
1882           if (hstat.remote_time && tmr != (time_t) (-1))
1883             {
1884               /* Now time-stamping can be used validly.  Time-stamping
1885                  means that if the sizes of the local and remote file
1886                  match, and local file is newer than the remote file,
1887                  it will not be retrieved.  Otherwise, the normal
1888                  download procedure is resumed.  */
1889               if (tml >= tmr &&
1890                   (hstat.contlen == -1 || local_size == hstat.contlen))
1891                 {
1892                   logprintf (LOG_VERBOSE, _("\
1893 Server file no newer than local file `%s' -- not retrieving.\n\n"),
1894                              local_filename);
1895                   free_hstat (&hstat);
1896                   xfree_null (dummy);
1897                   return RETROK;
1898                 }
1899               else if (tml >= tmr)
1900                 logprintf (LOG_VERBOSE, _("\
1901 The sizes do not match (local %ld) -- retrieving.\n"), local_size);
1902               else
1903                 logputs (LOG_VERBOSE,
1904                          _("Remote file is newer, retrieving.\n"));
1905             }
1906           free_hstat (&hstat);
1907           continue;
1908         }
1909       if ((tmr != (time_t) (-1))
1910           && !opt.spider
1911           && ((hstat.len == hstat.contlen) ||
1912               ((hstat.res == 0) &&
1913                ((hstat.contlen == -1) ||
1914                 (hstat.len >= hstat.contlen && !opt.kill_longer)))))
1915         {
1916           /* #### This code repeats in http.c and ftp.c.  Move it to a
1917              function!  */
1918           const char *fl = NULL;
1919           if (opt.output_document)
1920             {
1921               if (opt.od_known_regular)
1922                 fl = opt.output_document;
1923             }
1924           else
1925             fl = *hstat.local_file;
1926           if (fl)
1927             touch (fl, tmr);
1928         }
1929       /* End of time-stamping section.  */
1930
1931       if (opt.spider)
1932         {
1933           logprintf (LOG_NOTQUIET, "%d %s\n\n", hstat.statcode, hstat.error);
1934           xfree_null (dummy);
1935           return RETROK;
1936         }
1937
1938       tmrate = retr_rate (hstat.len - hstat.restval, hstat.dltime, 0);
1939
1940       if (hstat.len == hstat.contlen)
1941         {
1942           if (*dt & RETROKF)
1943             {
1944               logprintf (LOG_VERBOSE,
1945                          _("%s (%s) - `%s' saved [%ld/%ld]\n\n"),
1946                          tms, tmrate, locf, hstat.len, hstat.contlen);
1947               logprintf (LOG_NONVERBOSE,
1948                          "%s URL:%s [%ld/%ld] -> \"%s\" [%d]\n",
1949                          tms, u->url, hstat.len, hstat.contlen, locf, count);
1950             }
1951           ++opt.numurls;
1952           total_downloaded_bytes += hstat.len;
1953
1954           /* Remember that we downloaded the file for later ".orig" code. */
1955           if (*dt & ADDED_HTML_EXTENSION)
1956             downloaded_file(FILE_DOWNLOADED_AND_HTML_EXTENSION_ADDED, locf);
1957           else
1958             downloaded_file(FILE_DOWNLOADED_NORMALLY, locf);
1959
1960           free_hstat (&hstat);
1961           xfree_null (dummy);
1962           return RETROK;
1963         }
1964       else if (hstat.res == 0) /* No read error */
1965         {
1966           if (hstat.contlen == -1)  /* We don't know how much we were supposed
1967                                        to get, so assume we succeeded. */ 
1968             {
1969               if (*dt & RETROKF)
1970                 {
1971                   logprintf (LOG_VERBOSE,
1972                              _("%s (%s) - `%s' saved [%ld]\n\n"),
1973                              tms, tmrate, locf, hstat.len);
1974                   logprintf (LOG_NONVERBOSE,
1975                              "%s URL:%s [%ld] -> \"%s\" [%d]\n",
1976                              tms, u->url, hstat.len, locf, count);
1977                 }
1978               ++opt.numurls;
1979               total_downloaded_bytes += hstat.len;
1980
1981               /* Remember that we downloaded the file for later ".orig" code. */
1982               if (*dt & ADDED_HTML_EXTENSION)
1983                 downloaded_file(FILE_DOWNLOADED_AND_HTML_EXTENSION_ADDED, locf);
1984               else
1985                 downloaded_file(FILE_DOWNLOADED_NORMALLY, locf);
1986               
1987               free_hstat (&hstat);
1988               xfree_null (dummy);
1989               return RETROK;
1990             }
1991           else if (hstat.len < hstat.contlen) /* meaning we lost the
1992                                                  connection too soon */
1993             {
1994               logprintf (LOG_VERBOSE,
1995                          _("%s (%s) - Connection closed at byte %ld. "),
1996                          tms, tmrate, hstat.len);
1997               printwhat (count, opt.ntry);
1998               free_hstat (&hstat);
1999               continue;
2000             }
2001           else if (!opt.kill_longer) /* meaning we got more than expected */
2002             {
2003               logprintf (LOG_VERBOSE,
2004                          _("%s (%s) - `%s' saved [%ld/%ld])\n\n"),
2005                          tms, tmrate, locf, hstat.len, hstat.contlen);
2006               logprintf (LOG_NONVERBOSE,
2007                          "%s URL:%s [%ld/%ld] -> \"%s\" [%d]\n",
2008                          tms, u->url, hstat.len, hstat.contlen, locf, count);
2009               ++opt.numurls;
2010               total_downloaded_bytes += hstat.len;
2011
2012               /* Remember that we downloaded the file for later ".orig" code. */
2013               if (*dt & ADDED_HTML_EXTENSION)
2014                 downloaded_file(FILE_DOWNLOADED_AND_HTML_EXTENSION_ADDED, locf);
2015               else
2016                 downloaded_file(FILE_DOWNLOADED_NORMALLY, locf);
2017               
2018               free_hstat (&hstat);
2019               xfree_null (dummy);
2020               return RETROK;
2021             }
2022           else                  /* the same, but not accepted */
2023             {
2024               logprintf (LOG_VERBOSE,
2025                          _("%s (%s) - Connection closed at byte %ld/%ld. "),
2026                          tms, tmrate, hstat.len, hstat.contlen);
2027               printwhat (count, opt.ntry);
2028               free_hstat (&hstat);
2029               continue;
2030             }
2031         }
2032       else                      /* now hstat.res can only be -1 */
2033         {
2034           if (hstat.contlen == -1)
2035             {
2036               logprintf (LOG_VERBOSE,
2037                          _("%s (%s) - Read error at byte %ld (%s)."),
2038                          tms, tmrate, hstat.len, strerror (errno));
2039               printwhat (count, opt.ntry);
2040               free_hstat (&hstat);
2041               continue;
2042             }
2043           else                  /* hstat.res == -1 and contlen is given */
2044             {
2045               logprintf (LOG_VERBOSE,
2046                          _("%s (%s) - Read error at byte %ld/%ld (%s). "),
2047                          tms, tmrate, hstat.len, hstat.contlen,
2048                          strerror (errno));
2049               printwhat (count, opt.ntry);
2050               free_hstat (&hstat);
2051               continue;
2052             }
2053         }
2054       /* not reached */
2055       break;
2056     }
2057   while (!opt.ntry || (count < opt.ntry));
2058   return TRYLIMEXC;
2059 }
2060 \f
2061 /* Converts struct tm to time_t, assuming the data in tm is UTC rather
2062    than local timezone.
2063
2064    mktime is similar but assumes struct tm, also known as the
2065    "broken-down" form of time, is in local time zone.  mktime_from_utc
2066    uses mktime to make the conversion understanding that an offset
2067    will be introduced by the local time assumption.
2068
2069    mktime_from_utc then measures the introduced offset by applying
2070    gmtime to the initial result and applying mktime to the resulting
2071    "broken-down" form.  The difference between the two mktime results
2072    is the measured offset which is then subtracted from the initial
2073    mktime result to yield a calendar time which is the value returned.
2074
2075    tm_isdst in struct tm is set to 0 to force mktime to introduce a
2076    consistent offset (the non DST offset) since tm and tm+o might be
2077    on opposite sides of a DST change.
2078
2079    Some implementations of mktime return -1 for the nonexistent
2080    localtime hour at the beginning of DST.  In this event, use
2081    mktime(tm - 1hr) + 3600.
2082
2083    Schematically
2084      mktime(tm)   --> t+o
2085      gmtime(t+o)  --> tm+o
2086      mktime(tm+o) --> t+2o
2087      t+o - (t+2o - t+o) = t
2088
2089    Note that glibc contains a function of the same purpose named
2090    `timegm' (reverse of gmtime).  But obviously, it is not universally
2091    available, and unfortunately it is not straightforwardly
2092    extractable for use here.  Perhaps configure should detect timegm
2093    and use it where available.
2094
2095    Contributed by Roger Beeman <beeman@cisco.com>, with the help of
2096    Mark Baushke <mdb@cisco.com> and the rest of the Gurus at CISCO.
2097    Further improved by Roger with assistance from Edward J. Sabol
2098    based on input by Jamie Zawinski.  */
2099
2100 static time_t
2101 mktime_from_utc (struct tm *t)
2102 {
2103   time_t tl, tb;
2104   struct tm *tg;
2105
2106   tl = mktime (t);
2107   if (tl == -1)
2108     {
2109       t->tm_hour--;
2110       tl = mktime (t);
2111       if (tl == -1)
2112         return -1; /* can't deal with output from strptime */
2113       tl += 3600;
2114     }
2115   tg = gmtime (&tl);
2116   tg->tm_isdst = 0;
2117   tb = mktime (tg);
2118   if (tb == -1)
2119     {
2120       tg->tm_hour--;
2121       tb = mktime (tg);
2122       if (tb == -1)
2123         return -1; /* can't deal with output from gmtime */
2124       tb += 3600;
2125     }
2126   return (tl - (tb - tl));
2127 }
2128
2129 /* Check whether the result of strptime() indicates success.
2130    strptime() returns the pointer to how far it got to in the string.
2131    The processing has been successful if the string is at `GMT' or
2132    `+X', or at the end of the string.
2133
2134    In extended regexp parlance, the function returns 1 if P matches
2135    "^ *(GMT|[+-][0-9]|$)", 0 otherwise.  P being NULL (which strptime
2136    can return) is considered a failure and 0 is returned.  */
2137 static int
2138 check_end (const char *p)
2139 {
2140   if (!p)
2141     return 0;
2142   while (ISSPACE (*p))
2143     ++p;
2144   if (!*p
2145       || (p[0] == 'G' && p[1] == 'M' && p[2] == 'T')
2146       || ((p[0] == '+' || p[0] == '-') && ISDIGIT (p[1])))
2147     return 1;
2148   else
2149     return 0;
2150 }
2151
2152 /* Convert the textual specification of time in TIME_STRING to the
2153    number of seconds since the Epoch.
2154
2155    TIME_STRING can be in any of the three formats RFC2068 allows the
2156    HTTP servers to emit -- RFC1123-date, RFC850-date or asctime-date.
2157    Timezones are ignored, and should be GMT.
2158
2159    Return the computed time_t representation, or -1 if the conversion
2160    fails.
2161
2162    This function uses strptime with various string formats for parsing
2163    TIME_STRING.  This results in a parser that is not as lenient in
2164    interpreting TIME_STRING as I would like it to be.  Being based on
2165    strptime, it always allows shortened months, one-digit days, etc.,
2166    but due to the multitude of formats in which time can be
2167    represented, an ideal HTTP time parser would be even more
2168    forgiving.  It should completely ignore things like week days and
2169    concentrate only on the various forms of representing years,
2170    months, days, hours, minutes, and seconds.  For example, it would
2171    be nice if it accepted ISO 8601 out of the box.
2172
2173    I've investigated free and PD code for this purpose, but none was
2174    usable.  getdate was big and unwieldy, and had potential copyright
2175    issues, or so I was informed.  Dr. Marcus Hennecke's atotm(),
2176    distributed with phttpd, is excellent, but we cannot use it because
2177    it is not assigned to the FSF.  So I stuck it with strptime.  */
2178
2179 time_t
2180 http_atotm (const char *time_string)
2181 {
2182   /* NOTE: Solaris strptime man page claims that %n and %t match white
2183      space, but that's not universally available.  Instead, we simply
2184      use ` ' to mean "skip all WS", which works under all strptime
2185      implementations I've tested.  */
2186
2187   static const char *time_formats[] = {
2188     "%a, %d %b %Y %T",          /* RFC1123: Thu, 29 Jan 1998 22:12:57 */
2189     "%A, %d-%b-%y %T",          /* RFC850:  Thursday, 29-Jan-98 22:12:57 */
2190     "%a, %d-%b-%Y %T",          /* pseudo-RFC850:  Thu, 29-Jan-1998 22:12:57
2191                                    (google.com uses this for their cookies.) */
2192     "%a %b %d %T %Y"            /* asctime: Thu Jan 29 22:12:57 1998 */
2193   };
2194
2195   int i;
2196   struct tm t;
2197
2198   /* According to Roger Beeman, we need to initialize tm_isdst, since
2199      strptime won't do it.  */
2200   t.tm_isdst = 0;
2201
2202   /* Note that under foreign locales Solaris strptime() fails to
2203      recognize English dates, which renders this function useless.  We
2204      solve this by being careful not to affect LC_TIME when
2205      initializing locale.
2206
2207      Another solution would be to temporarily set locale to C, invoke
2208      strptime(), and restore it back.  This is slow and dirty,
2209      however, and locale support other than LC_MESSAGES can mess other
2210      things, so I rather chose to stick with just setting LC_MESSAGES.
2211
2212      GNU strptime does not have this problem because it recognizes
2213      both international and local dates.  */
2214
2215   for (i = 0; i < countof (time_formats); i++)
2216     if (check_end (strptime (time_string, time_formats[i], &t)))
2217       return mktime_from_utc (&t);
2218
2219   /* All formats have failed.  */
2220   return -1;
2221 }
2222 \f
2223 /* Authorization support: We support two authorization schemes:
2224
2225    * `Basic' scheme, consisting of base64-ing USER:PASSWORD string;
2226
2227    * `Digest' scheme, added by Junio Hamano <junio@twinsun.com>,
2228    consisting of answering to the server's challenge with the proper
2229    MD5 digests.  */
2230
2231 /* How many bytes it will take to store LEN bytes in base64.  */
2232 #define BASE64_LENGTH(len) (4 * (((len) + 2) / 3))
2233
2234 /* Encode the string S of length LENGTH to base64 format and place it
2235    to STORE.  STORE will be 0-terminated, and must point to a writable
2236    buffer of at least 1+BASE64_LENGTH(length) bytes.  */
2237 static void
2238 base64_encode (const char *s, char *store, int length)
2239 {
2240   /* Conversion table.  */
2241   static char tbl[64] = {
2242     'A','B','C','D','E','F','G','H',
2243     'I','J','K','L','M','N','O','P',
2244     'Q','R','S','T','U','V','W','X',
2245     'Y','Z','a','b','c','d','e','f',
2246     'g','h','i','j','k','l','m','n',
2247     'o','p','q','r','s','t','u','v',
2248     'w','x','y','z','0','1','2','3',
2249     '4','5','6','7','8','9','+','/'
2250   };
2251   int i;
2252   unsigned char *p = (unsigned char *)store;
2253
2254   /* Transform the 3x8 bits to 4x6 bits, as required by base64.  */
2255   for (i = 0; i < length; i += 3)
2256     {
2257       *p++ = tbl[s[0] >> 2];
2258       *p++ = tbl[((s[0] & 3) << 4) + (s[1] >> 4)];
2259       *p++ = tbl[((s[1] & 0xf) << 2) + (s[2] >> 6)];
2260       *p++ = tbl[s[2] & 0x3f];
2261       s += 3;
2262     }
2263   /* Pad the result if necessary...  */
2264   if (i == length + 1)
2265     *(p - 1) = '=';
2266   else if (i == length + 2)
2267     *(p - 1) = *(p - 2) = '=';
2268   /* ...and zero-terminate it.  */
2269   *p = '\0';
2270 }
2271
2272 /* Create the authentication header contents for the `Basic' scheme.
2273    This is done by encoding the string `USER:PASS' in base64 and
2274    prepending `HEADER: Basic ' to it.  */
2275 static char *
2276 basic_authentication_encode (const char *user, const char *passwd,
2277                              const char *header)
2278 {
2279   char *t1, *t2, *res;
2280   int len1 = strlen (user) + 1 + strlen (passwd);
2281   int len2 = BASE64_LENGTH (len1);
2282
2283   t1 = (char *)alloca (len1 + 1);
2284   sprintf (t1, "%s:%s", user, passwd);
2285   t2 = (char *)alloca (1 + len2);
2286   base64_encode (t1, t2, len1);
2287   res = (char *)xmalloc (len2 + 11 + strlen (header));
2288   sprintf (res, "%s: Basic %s\r\n", header, t2);
2289
2290   return res;
2291 }
2292
2293 #ifdef USE_DIGEST
2294 /* Parse HTTP `WWW-Authenticate:' header.  AU points to the beginning
2295    of a field in such a header.  If the field is the one specified by
2296    ATTR_NAME ("realm", "opaque", and "nonce" are used by the current
2297    digest authorization code), extract its value in the (char*)
2298    variable pointed by RET.  Returns negative on a malformed header,
2299    or number of bytes that have been parsed by this call.  */
2300 static int
2301 extract_header_attr (const char *au, const char *attr_name, char **ret)
2302 {
2303   const char *cp, *ep;
2304
2305   ep = cp = au;
2306
2307   if (strncmp (cp, attr_name, strlen (attr_name)) == 0)
2308     {
2309       cp += strlen (attr_name);
2310       if (!*cp)
2311         return -1;
2312       cp += skip_lws (cp);
2313       if (*cp != '=')
2314         return -1;
2315       if (!*++cp)
2316         return -1;
2317       cp += skip_lws (cp);
2318       if (*cp != '\"')
2319         return -1;
2320       if (!*++cp)
2321         return -1;
2322       for (ep = cp; *ep && *ep != '\"'; ep++)
2323         ;
2324       if (!*ep)
2325         return -1;
2326       xfree_null (*ret);
2327       *ret = strdupdelim (cp, ep);
2328       return ep - au + 1;
2329     }
2330   else
2331     return 0;
2332 }
2333
2334 /* Dump the hexadecimal representation of HASH to BUF.  HASH should be
2335    an array of 16 bytes containing the hash keys, and BUF should be a
2336    buffer of 33 writable characters (32 for hex digits plus one for
2337    zero termination).  */
2338 static void
2339 dump_hash (unsigned char *buf, const unsigned char *hash)
2340 {
2341   int i;
2342
2343   for (i = 0; i < MD5_HASHLEN; i++, hash++)
2344     {
2345       *buf++ = XNUM_TO_digit (*hash >> 4);
2346       *buf++ = XNUM_TO_digit (*hash & 0xf);
2347     }
2348   *buf = '\0';
2349 }
2350
2351 /* Take the line apart to find the challenge, and compose a digest
2352    authorization header.  See RFC2069 section 2.1.2.  */
2353 static char *
2354 digest_authentication_encode (const char *au, const char *user,
2355                               const char *passwd, const char *method,
2356                               const char *path)
2357 {
2358   static char *realm, *opaque, *nonce;
2359   static struct {
2360     const char *name;
2361     char **variable;
2362   } options[] = {
2363     { "realm", &realm },
2364     { "opaque", &opaque },
2365     { "nonce", &nonce }
2366   };
2367   char *res;
2368
2369   realm = opaque = nonce = NULL;
2370
2371   au += 6;                      /* skip over `Digest' */
2372   while (*au)
2373     {
2374       int i;
2375
2376       au += skip_lws (au);
2377       for (i = 0; i < countof (options); i++)
2378         {
2379           int skip = extract_header_attr (au, options[i].name,
2380                                           options[i].variable);
2381           if (skip < 0)
2382             {
2383               xfree_null (realm);
2384               xfree_null (opaque);
2385               xfree_null (nonce);
2386               return NULL;
2387             }
2388           else if (skip)
2389             {
2390               au += skip;
2391               break;
2392             }
2393         }
2394       if (i == countof (options))
2395         {
2396           while (*au && *au != '=')
2397             au++;
2398           if (*au && *++au)
2399             {
2400               au += skip_lws (au);
2401               if (*au == '\"')
2402                 {
2403                   au++;
2404                   while (*au && *au != '\"')
2405                     au++;
2406                   if (*au)
2407                     au++;
2408                 }
2409             }
2410         }
2411       while (*au && *au != ',')
2412         au++;
2413       if (*au)
2414         au++;
2415     }
2416   if (!realm || !nonce || !user || !passwd || !path || !method)
2417     {
2418       xfree_null (realm);
2419       xfree_null (opaque);
2420       xfree_null (nonce);
2421       return NULL;
2422     }
2423
2424   /* Calculate the digest value.  */
2425   {
2426     ALLOCA_MD5_CONTEXT (ctx);
2427     unsigned char hash[MD5_HASHLEN];
2428     unsigned char a1buf[MD5_HASHLEN * 2 + 1], a2buf[MD5_HASHLEN * 2 + 1];
2429     unsigned char response_digest[MD5_HASHLEN * 2 + 1];
2430
2431     /* A1BUF = H(user ":" realm ":" password) */
2432     gen_md5_init (ctx);
2433     gen_md5_update ((unsigned char *)user, strlen (user), ctx);
2434     gen_md5_update ((unsigned char *)":", 1, ctx);
2435     gen_md5_update ((unsigned char *)realm, strlen (realm), ctx);
2436     gen_md5_update ((unsigned char *)":", 1, ctx);
2437     gen_md5_update ((unsigned char *)passwd, strlen (passwd), ctx);
2438     gen_md5_finish (ctx, hash);
2439     dump_hash (a1buf, hash);
2440
2441     /* A2BUF = H(method ":" path) */
2442     gen_md5_init (ctx);
2443     gen_md5_update ((unsigned char *)method, strlen (method), ctx);
2444     gen_md5_update ((unsigned char *)":", 1, ctx);
2445     gen_md5_update ((unsigned char *)path, strlen (path), ctx);
2446     gen_md5_finish (ctx, hash);
2447     dump_hash (a2buf, hash);
2448
2449     /* RESPONSE_DIGEST = H(A1BUF ":" nonce ":" A2BUF) */
2450     gen_md5_init (ctx);
2451     gen_md5_update (a1buf, MD5_HASHLEN * 2, ctx);
2452     gen_md5_update ((unsigned char *)":", 1, ctx);
2453     gen_md5_update ((unsigned char *)nonce, strlen (nonce), ctx);
2454     gen_md5_update ((unsigned char *)":", 1, ctx);
2455     gen_md5_update (a2buf, MD5_HASHLEN * 2, ctx);
2456     gen_md5_finish (ctx, hash);
2457     dump_hash (response_digest, hash);
2458
2459     res = (char*) xmalloc (strlen (user)
2460                            + strlen (user)
2461                            + strlen (realm)
2462                            + strlen (nonce)
2463                            + strlen (path)
2464                            + 2 * MD5_HASHLEN /*strlen (response_digest)*/
2465                            + (opaque ? strlen (opaque) : 0)
2466                            + 128);
2467     sprintf (res, "Authorization: Digest \
2468 username=\"%s\", realm=\"%s\", nonce=\"%s\", uri=\"%s\", response=\"%s\"",
2469              user, realm, nonce, path, response_digest);
2470     if (opaque)
2471       {
2472         char *p = res + strlen (res);
2473         strcat (p, ", opaque=\"");
2474         strcat (p, opaque);
2475         strcat (p, "\"");
2476       }
2477     strcat (res, "\r\n");
2478   }
2479   return res;
2480 }
2481 #endif /* USE_DIGEST */
2482
2483
2484 #define BEGINS_WITH(line, string_constant)                              \
2485   (!strncasecmp (line, string_constant, sizeof (string_constant) - 1)   \
2486    && (ISSPACE (line[sizeof (string_constant) - 1])                     \
2487        || !line[sizeof (string_constant) - 1]))
2488
2489 static int
2490 known_authentication_scheme_p (const char *au)
2491 {
2492   return BEGINS_WITH (au, "Basic")
2493     || BEGINS_WITH (au, "Digest")
2494     || BEGINS_WITH (au, "NTLM");
2495 }
2496
2497 #undef BEGINS_WITH
2498
2499 /* Create the HTTP authorization request header.  When the
2500    `WWW-Authenticate' response header is seen, according to the
2501    authorization scheme specified in that header (`Basic' and `Digest'
2502    are supported by the current implementation), produce an
2503    appropriate HTTP authorization request header.  */
2504 static char *
2505 create_authorization_line (const char *au, const char *user,
2506                            const char *passwd, const char *method,
2507                            const char *path)
2508 {
2509   char *wwwauth = NULL;
2510
2511   if (!strncasecmp (au, "Basic", 5))
2512     wwwauth = basic_authentication_encode (user, passwd, "Authorization");
2513   if (!strncasecmp (au, "NTLM", 4))
2514     wwwauth = basic_authentication_encode (user, passwd, "Authorization");
2515 #ifdef USE_DIGEST
2516   else if (!strncasecmp (au, "Digest", 6))
2517     wwwauth = digest_authentication_encode (au, user, passwd, method, path);
2518 #endif /* USE_DIGEST */
2519   return wwwauth;
2520 }
2521 \f
2522 void
2523 http_cleanup (void)
2524 {
2525   if (pc_last_host_ip)
2526     address_list_release (pc_last_host_ip);
2527 }