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