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