]> sjero.net Git - wget/blob - src/http.c
[svn] Cookie interface and implementation changes
[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       if (!hs->restval && global_download_count == 0)
1513         {
1514           /* This will silently fail for streams that don't correspond
1515              to regular files, but that's OK.  */
1516           rewind (fp);
1517           /* ftruncate is needed because opt.dfp is opened in append
1518              mode if opt.always_rest is set.  */
1519           ftruncate (fileno (fp), 0);
1520           clearerr (fp);
1521         }
1522     }
1523
1524   /* #### This confuses the code that checks for file size.  There
1525      should be some overhead information.  */
1526   if (opt.save_headers)
1527     fwrite (all_headers, 1, all_length, fp);
1528
1529   /* Get the contents of the document.  */
1530   hs->res = get_contents (sock, fp, &hs->len, hs->restval,
1531                           (contlen != -1 ? contlen : 0),
1532                           &rbuf, keep_alive, &hs->dltime);
1533
1534   if (hs->res >= 0)
1535     CLOSE_FINISH (sock);
1536   else
1537     CLOSE_INVALIDATE (sock);
1538
1539   {
1540     /* Close or flush the file.  We have to be careful to check for
1541        error here.  Checking the result of fwrite() is not enough --
1542        errors could go unnoticed!  */
1543     int flush_res;
1544     if (!opt.dfp)
1545       flush_res = fclose (fp);
1546     else
1547       flush_res = fflush (fp);
1548     if (flush_res == EOF)
1549       hs->res = -2;
1550   }
1551   FREE_MAYBE (all_headers);
1552   if (hs->res == -2)
1553     return FWRITEERR;
1554   return RETRFINISHED;
1555 }
1556
1557 /* The genuine HTTP loop!  This is the part where the retrieval is
1558    retried, and retried, and retried, and...  */
1559 uerr_t
1560 http_loop (struct url *u, char **newloc, char **local_file, const char *referer,
1561            int *dt, struct url *proxy)
1562 {
1563   int count;
1564   int use_ts, got_head = 0;     /* time-stamping info */
1565   char *filename_plus_orig_suffix;
1566   char *local_filename = NULL;
1567   char *tms, *locf, *tmrate;
1568   uerr_t err;
1569   time_t tml = -1, tmr = -1;    /* local and remote time-stamps */
1570   long local_size = 0;          /* the size of the local file */
1571   size_t filename_len;
1572   struct http_stat hstat;       /* HTTP status */
1573   struct stat st;
1574   char *dummy = NULL;
1575
1576   /* This used to be done in main(), but it's a better idea to do it
1577      here so that we don't go through the hoops if we're just using
1578      FTP or whatever. */
1579   if (opt.cookies)
1580     {
1581       if (!wget_cookie_jar)
1582         wget_cookie_jar = cookie_jar_new ();
1583       if (opt.cookies_input && !cookies_loaded_p)
1584         {
1585           cookie_jar_load (wget_cookie_jar, opt.cookies_input);
1586           cookies_loaded_p = 1;
1587         }
1588     }
1589
1590   *newloc = NULL;
1591
1592   /* Warn on (likely bogus) wildcard usage in HTTP.  Don't use
1593      has_wildcards_p because it would also warn on `?', and we know that
1594      shows up in CGI paths a *lot*.  */
1595   if (strchr (u->url, '*'))
1596     logputs (LOG_VERBOSE, _("Warning: wildcards not supported in HTTP.\n"));
1597
1598   /* Determine the local filename.  */
1599   if (local_file && *local_file)
1600     hstat.local_file = local_file;
1601   else if (local_file)
1602     {
1603       *local_file = url_filename (u);
1604       hstat.local_file = local_file;
1605     }
1606   else
1607     {
1608       dummy = url_filename (u);
1609       hstat.local_file = &dummy;
1610     }
1611
1612   if (!opt.output_document)
1613     locf = *hstat.local_file;
1614   else
1615     locf = opt.output_document;
1616
1617   hstat.referer = referer;
1618
1619   filename_len = strlen (*hstat.local_file);
1620   filename_plus_orig_suffix = alloca (filename_len + sizeof (".orig"));
1621
1622   if (opt.noclobber && file_exists_p (*hstat.local_file))
1623     {
1624       /* If opt.noclobber is turned on and file already exists, do not
1625          retrieve the file */
1626       logprintf (LOG_VERBOSE, _("\
1627 File `%s' already there, will not retrieve.\n"), *hstat.local_file);
1628       /* If the file is there, we suppose it's retrieved OK.  */
1629       *dt |= RETROKF;
1630
1631       /* #### Bogusness alert.  */
1632       /* If its suffix is "html" or "htm" or similar, assume text/html.  */
1633       if (has_html_suffix_p (*hstat.local_file))
1634         *dt |= TEXTHTML;
1635
1636       FREE_MAYBE (dummy);
1637       return RETROK;
1638     }
1639
1640   use_ts = 0;
1641   if (opt.timestamping)
1642     {
1643       boolean  local_dot_orig_file_exists = FALSE;
1644
1645       if (opt.backup_converted)
1646         /* If -K is specified, we'll act on the assumption that it was specified
1647            last time these files were downloaded as well, and instead of just
1648            comparing local file X against server file X, we'll compare local
1649            file X.orig (if extant, else X) against server file X.  If -K
1650            _wasn't_ specified last time, or the server contains files called
1651            *.orig, -N will be back to not operating correctly with -k. */
1652         {
1653           /* Would a single s[n]printf() call be faster?  --dan
1654
1655              Definitely not.  sprintf() is horribly slow.  It's a
1656              different question whether the difference between the two
1657              affects a program.  Usually I'd say "no", but at one
1658              point I profiled Wget, and found that a measurable and
1659              non-negligible amount of time was lost calling sprintf()
1660              in url.c.  Replacing sprintf with inline calls to
1661              strcpy() and long_to_string() made a difference.
1662              --hniksic */
1663           memcpy (filename_plus_orig_suffix, *hstat.local_file, filename_len);
1664           memcpy (filename_plus_orig_suffix + filename_len,
1665                   ".orig", sizeof (".orig"));
1666
1667           /* Try to stat() the .orig file. */
1668           if (stat (filename_plus_orig_suffix, &st) == 0)
1669             {
1670               local_dot_orig_file_exists = TRUE;
1671               local_filename = filename_plus_orig_suffix;
1672             }
1673         }      
1674
1675       if (!local_dot_orig_file_exists)
1676         /* Couldn't stat() <file>.orig, so try to stat() <file>. */
1677         if (stat (*hstat.local_file, &st) == 0)
1678           local_filename = *hstat.local_file;
1679
1680       if (local_filename != NULL)
1681         /* There was a local file, so we'll check later to see if the version
1682            the server has is the same version we already have, allowing us to
1683            skip a download. */
1684         {
1685           use_ts = 1;
1686           tml = st.st_mtime;
1687 #ifdef WINDOWS
1688           /* Modification time granularity is 2 seconds for Windows, so
1689              increase local time by 1 second for later comparison. */
1690           tml++;
1691 #endif
1692           local_size = st.st_size;
1693           got_head = 0;
1694         }
1695     }
1696   /* Reset the counter.  */
1697   count = 0;
1698   *dt = 0 | ACCEPTRANGES;
1699   /* THE loop */
1700   do
1701     {
1702       /* Increment the pass counter.  */
1703       ++count;
1704       sleep_between_retrievals (count);
1705       /* Get the current time string.  */
1706       tms = time_str (NULL);
1707       /* Print fetch message, if opt.verbose.  */
1708       if (opt.verbose)
1709         {
1710           char *hurl = url_string (u, 1);
1711           char tmp[15];
1712           strcpy (tmp, "        ");
1713           if (count > 1)
1714             sprintf (tmp, _("(try:%2d)"), count);
1715           logprintf (LOG_VERBOSE, "--%s--  %s\n  %s => `%s'\n",
1716                      tms, hurl, tmp, locf);
1717 #ifdef WINDOWS
1718           ws_changetitle (hurl, 1);
1719 #endif
1720           xfree (hurl);
1721         }
1722
1723       /* Default document type is empty.  However, if spider mode is
1724          on or time-stamping is employed, HEAD_ONLY commands is
1725          encoded within *dt.  */
1726       if (opt.spider || (use_ts && !got_head))
1727         *dt |= HEAD_ONLY;
1728       else
1729         *dt &= ~HEAD_ONLY;
1730       /* Assume no restarting.  */
1731       hstat.restval = 0L;
1732       /* Decide whether or not to restart.  */
1733       if (((count > 1 && (*dt & ACCEPTRANGES)) || opt.always_rest)
1734           /* #### this calls access() and then stat(); could be optimized. */
1735           && file_exists_p (locf))
1736         if (stat (locf, &st) == 0 && S_ISREG (st.st_mode))
1737           hstat.restval = st.st_size;
1738
1739       /* In `-c' is used and the file is existing and non-empty,
1740          refuse to truncate it if the server doesn't support continued
1741          downloads.  */
1742       hstat.no_truncate = 0;
1743       if (opt.always_rest && hstat.restval)
1744         hstat.no_truncate = 1;
1745
1746       /* Decide whether to send the no-cache directive.  We send it in
1747          two cases:
1748            a) we're using a proxy, and we're past our first retrieval.
1749               Some proxies are notorious for caching incomplete data, so
1750               we require a fresh get.
1751            b) caching is explicitly inhibited. */
1752       if ((proxy && count > 1)  /* a */
1753           || !opt.allow_cache   /* b */
1754           )
1755         *dt |= SEND_NOCACHE;
1756       else
1757         *dt &= ~SEND_NOCACHE;
1758
1759       /* Try fetching the document, or at least its head.  */
1760       err = gethttp (u, &hstat, dt, proxy);
1761
1762       /* It's unfortunate that wget determines the local filename before finding
1763          out the Content-Type of the file.  Barring a major restructuring of the
1764          code, we need to re-set locf here, since gethttp() may have xrealloc()d
1765          *hstat.local_file to tack on ".html". */
1766       if (!opt.output_document)
1767         locf = *hstat.local_file;
1768       else
1769         locf = opt.output_document;
1770
1771       /* Time?  */
1772       tms = time_str (NULL);
1773       /* Get the new location (with or without the redirection).  */
1774       if (hstat.newloc)
1775         *newloc = xstrdup (hstat.newloc);
1776       switch (err)
1777         {
1778         case HERR: case HEOF: case CONSOCKERR: case CONCLOSED:
1779         case CONERROR: case READERR: case WRITEFAILED:
1780         case RANGEERR:
1781           /* Non-fatal errors continue executing the loop, which will
1782              bring them to "while" statement at the end, to judge
1783              whether the number of tries was exceeded.  */
1784           free_hstat (&hstat);
1785           printwhat (count, opt.ntry);
1786           continue;
1787           break;
1788         case HOSTERR: case CONREFUSED: case PROXERR: case AUTHFAILED: 
1789         case SSLERRCTXCREATE: case CONTNOTSUPPORTED:
1790           /* Fatal errors just return from the function.  */
1791           free_hstat (&hstat);
1792           FREE_MAYBE (dummy);
1793           return err;
1794           break;
1795         case FWRITEERR: case FOPENERR:
1796           /* Another fatal error.  */
1797           logputs (LOG_VERBOSE, "\n");
1798           logprintf (LOG_NOTQUIET, _("Cannot write to `%s' (%s).\n"),
1799                      *hstat.local_file, strerror (errno));
1800           free_hstat (&hstat);
1801           FREE_MAYBE (dummy);
1802           return err;
1803           break;
1804         case CONSSLERR:
1805           /* Another fatal error.  */
1806           logputs (LOG_VERBOSE, "\n");
1807           logprintf (LOG_NOTQUIET, _("Unable to establish SSL connection.\n"));
1808           free_hstat (&hstat);
1809           FREE_MAYBE (dummy);
1810           return err;
1811           break;
1812         case NEWLOCATION:
1813           /* Return the new location to the caller.  */
1814           if (!hstat.newloc)
1815             {
1816               logprintf (LOG_NOTQUIET,
1817                          _("ERROR: Redirection (%d) without location.\n"),
1818                          hstat.statcode);
1819               free_hstat (&hstat);
1820               FREE_MAYBE (dummy);
1821               return WRONGCODE;
1822             }
1823           free_hstat (&hstat);
1824           FREE_MAYBE (dummy);
1825           return NEWLOCATION;
1826           break;
1827         case RETRUNNEEDED:
1828           /* The file was already fully retrieved. */
1829           free_hstat (&hstat);
1830           FREE_MAYBE (dummy);
1831           return RETROK;
1832           break;
1833         case RETRFINISHED:
1834           /* Deal with you later.  */
1835           break;
1836         default:
1837           /* All possibilities should have been exhausted.  */
1838           abort ();
1839         }
1840       if (!(*dt & RETROKF))
1841         {
1842           if (!opt.verbose)
1843             {
1844               /* #### Ugly ugly ugly! */
1845               char *hurl = url_string (u, 1);
1846               logprintf (LOG_NONVERBOSE, "%s:\n", hurl);
1847               xfree (hurl);
1848             }
1849           logprintf (LOG_NOTQUIET, _("%s ERROR %d: %s.\n"),
1850                      tms, hstat.statcode, hstat.error);
1851           logputs (LOG_VERBOSE, "\n");
1852           free_hstat (&hstat);
1853           FREE_MAYBE (dummy);
1854           return WRONGCODE;
1855         }
1856
1857       /* Did we get the time-stamp?  */
1858       if (!got_head)
1859         {
1860           if (opt.timestamping && !hstat.remote_time)
1861             {
1862               logputs (LOG_NOTQUIET, _("\
1863 Last-modified header missing -- time-stamps turned off.\n"));
1864             }
1865           else if (hstat.remote_time)
1866             {
1867               /* Convert the date-string into struct tm.  */
1868               tmr = http_atotm (hstat.remote_time);
1869               if (tmr == (time_t) (-1))
1870                 logputs (LOG_VERBOSE, _("\
1871 Last-modified header invalid -- time-stamp ignored.\n"));
1872             }
1873         }
1874
1875       /* The time-stamping section.  */
1876       if (use_ts)
1877         {
1878           got_head = 1;
1879           *dt &= ~HEAD_ONLY;
1880           use_ts = 0;           /* no more time-stamping */
1881           count = 0;            /* the retrieve count for HEAD is
1882                                    reset */
1883           if (hstat.remote_time && tmr != (time_t) (-1))
1884             {
1885               /* Now time-stamping can be used validly.  Time-stamping
1886                  means that if the sizes of the local and remote file
1887                  match, and local file is newer than the remote file,
1888                  it will not be retrieved.  Otherwise, the normal
1889                  download procedure is resumed.  */
1890               if (tml >= tmr &&
1891                   (hstat.contlen == -1 || local_size == hstat.contlen))
1892                 {
1893                   logprintf (LOG_VERBOSE, _("\
1894 Server file no newer than local file `%s' -- not retrieving.\n\n"),
1895                              local_filename);
1896                   free_hstat (&hstat);
1897                   FREE_MAYBE (dummy);
1898                   return RETROK;
1899                 }
1900               else if (tml >= tmr)
1901                 logprintf (LOG_VERBOSE, _("\
1902 The sizes do not match (local %ld) -- retrieving.\n"), local_size);
1903               else
1904                 logputs (LOG_VERBOSE,
1905                          _("Remote file is newer, retrieving.\n"));
1906             }
1907           free_hstat (&hstat);
1908           continue;
1909         }
1910       if ((tmr != (time_t) (-1))
1911           && !opt.spider
1912           && ((hstat.len == hstat.contlen) ||
1913               ((hstat.res == 0) &&
1914                ((hstat.contlen == -1) ||
1915                 (hstat.len >= hstat.contlen && !opt.kill_longer)))))
1916         {
1917           /* #### This code repeats in http.c and ftp.c.  Move it to a
1918              function!  */
1919           const char *fl = NULL;
1920           if (opt.output_document)
1921             {
1922               if (opt.od_known_regular)
1923                 fl = opt.output_document;
1924             }
1925           else
1926             fl = *hstat.local_file;
1927           if (fl)
1928             touch (fl, tmr);
1929         }
1930       /* End of time-stamping section.  */
1931
1932       if (opt.spider)
1933         {
1934           logprintf (LOG_NOTQUIET, "%d %s\n\n", hstat.statcode, hstat.error);
1935           FREE_MAYBE (dummy);
1936           return RETROK;
1937         }
1938
1939       tmrate = retr_rate (hstat.len - hstat.restval, hstat.dltime, 0);
1940
1941       if (hstat.len == hstat.contlen)
1942         {
1943           if (*dt & RETROKF)
1944             {
1945               logprintf (LOG_VERBOSE,
1946                          _("%s (%s) - `%s' saved [%ld/%ld]\n\n"),
1947                          tms, tmrate, locf, hstat.len, hstat.contlen);
1948               logprintf (LOG_NONVERBOSE,
1949                          "%s URL:%s [%ld/%ld] -> \"%s\" [%d]\n",
1950                          tms, u->url, hstat.len, hstat.contlen, locf, count);
1951             }
1952           ++opt.numurls;
1953           downloaded_increase (hstat.len);
1954
1955           /* Remember that we downloaded the file for later ".orig" code. */
1956           if (*dt & ADDED_HTML_EXTENSION)
1957             downloaded_file(FILE_DOWNLOADED_AND_HTML_EXTENSION_ADDED, locf);
1958           else
1959             downloaded_file(FILE_DOWNLOADED_NORMALLY, locf);
1960
1961           free_hstat (&hstat);
1962           FREE_MAYBE (dummy);
1963           return RETROK;
1964         }
1965       else if (hstat.res == 0) /* No read error */
1966         {
1967           if (hstat.contlen == -1)  /* We don't know how much we were supposed
1968                                        to get, so assume we succeeded. */ 
1969             {
1970               if (*dt & RETROKF)
1971                 {
1972                   logprintf (LOG_VERBOSE,
1973                              _("%s (%s) - `%s' saved [%ld]\n\n"),
1974                              tms, tmrate, locf, hstat.len);
1975                   logprintf (LOG_NONVERBOSE,
1976                              "%s URL:%s [%ld] -> \"%s\" [%d]\n",
1977                              tms, u->url, hstat.len, locf, count);
1978                 }
1979               ++opt.numurls;
1980               downloaded_increase (hstat.len);
1981
1982               /* Remember that we downloaded the file for later ".orig" code. */
1983               if (*dt & ADDED_HTML_EXTENSION)
1984                 downloaded_file(FILE_DOWNLOADED_AND_HTML_EXTENSION_ADDED, locf);
1985               else
1986                 downloaded_file(FILE_DOWNLOADED_NORMALLY, locf);
1987               
1988               free_hstat (&hstat);
1989               FREE_MAYBE (dummy);
1990               return RETROK;
1991             }
1992           else if (hstat.len < hstat.contlen) /* meaning we lost the
1993                                                  connection too soon */
1994             {
1995               logprintf (LOG_VERBOSE,
1996                          _("%s (%s) - Connection closed at byte %ld. "),
1997                          tms, tmrate, hstat.len);
1998               printwhat (count, opt.ntry);
1999               free_hstat (&hstat);
2000               continue;
2001             }
2002           else if (!opt.kill_longer) /* meaning we got more than expected */
2003             {
2004               logprintf (LOG_VERBOSE,
2005                          _("%s (%s) - `%s' saved [%ld/%ld])\n\n"),
2006                          tms, tmrate, locf, hstat.len, hstat.contlen);
2007               logprintf (LOG_NONVERBOSE,
2008                          "%s URL:%s [%ld/%ld] -> \"%s\" [%d]\n",
2009                          tms, u->url, hstat.len, hstat.contlen, locf, count);
2010               ++opt.numurls;
2011               downloaded_increase (hstat.len);
2012
2013               /* Remember that we downloaded the file for later ".orig" code. */
2014               if (*dt & ADDED_HTML_EXTENSION)
2015                 downloaded_file(FILE_DOWNLOADED_AND_HTML_EXTENSION_ADDED, locf);
2016               else
2017                 downloaded_file(FILE_DOWNLOADED_NORMALLY, locf);
2018               
2019               free_hstat (&hstat);
2020               FREE_MAYBE (dummy);
2021               return RETROK;
2022             }
2023           else                  /* the same, but not accepted */
2024             {
2025               logprintf (LOG_VERBOSE,
2026                          _("%s (%s) - Connection closed at byte %ld/%ld. "),
2027                          tms, tmrate, hstat.len, hstat.contlen);
2028               printwhat (count, opt.ntry);
2029               free_hstat (&hstat);
2030               continue;
2031             }
2032         }
2033       else                      /* now hstat.res can only be -1 */
2034         {
2035           if (hstat.contlen == -1)
2036             {
2037               logprintf (LOG_VERBOSE,
2038                          _("%s (%s) - Read error at byte %ld (%s)."),
2039                          tms, tmrate, hstat.len, strerror (errno));
2040               printwhat (count, opt.ntry);
2041               free_hstat (&hstat);
2042               continue;
2043             }
2044           else                  /* hstat.res == -1 and contlen is given */
2045             {
2046               logprintf (LOG_VERBOSE,
2047                          _("%s (%s) - Read error at byte %ld/%ld (%s). "),
2048                          tms, tmrate, hstat.len, hstat.contlen,
2049                          strerror (errno));
2050               printwhat (count, opt.ntry);
2051               free_hstat (&hstat);
2052               continue;
2053             }
2054         }
2055       /* not reached */
2056       break;
2057     }
2058   while (!opt.ntry || (count < opt.ntry));
2059   return TRYLIMEXC;
2060 }
2061 \f
2062 /* Converts struct tm to time_t, assuming the data in tm is UTC rather
2063    than local timezone.
2064
2065    mktime is similar but assumes struct tm, also known as the
2066    "broken-down" form of time, is in local time zone.  mktime_from_utc
2067    uses mktime to make the conversion understanding that an offset
2068    will be introduced by the local time assumption.
2069
2070    mktime_from_utc then measures the introduced offset by applying
2071    gmtime to the initial result and applying mktime to the resulting
2072    "broken-down" form.  The difference between the two mktime results
2073    is the measured offset which is then subtracted from the initial
2074    mktime result to yield a calendar time which is the value returned.
2075
2076    tm_isdst in struct tm is set to 0 to force mktime to introduce a
2077    consistent offset (the non DST offset) since tm and tm+o might be
2078    on opposite sides of a DST change.
2079
2080    Some implementations of mktime return -1 for the nonexistent
2081    localtime hour at the beginning of DST.  In this event, use
2082    mktime(tm - 1hr) + 3600.
2083
2084    Schematically
2085      mktime(tm)   --> t+o
2086      gmtime(t+o)  --> tm+o
2087      mktime(tm+o) --> t+2o
2088      t+o - (t+2o - t+o) = t
2089
2090    Note that glibc contains a function of the same purpose named
2091    `timegm' (reverse of gmtime).  But obviously, it is not universally
2092    available, and unfortunately it is not straightforwardly
2093    extractable for use here.  Perhaps configure should detect timegm
2094    and use it where available.
2095
2096    Contributed by Roger Beeman <beeman@cisco.com>, with the help of
2097    Mark Baushke <mdb@cisco.com> and the rest of the Gurus at CISCO.
2098    Further improved by Roger with assistance from Edward J. Sabol
2099    based on input by Jamie Zawinski.  */
2100
2101 static time_t
2102 mktime_from_utc (struct tm *t)
2103 {
2104   time_t tl, tb;
2105   struct tm *tg;
2106
2107   tl = mktime (t);
2108   if (tl == -1)
2109     {
2110       t->tm_hour--;
2111       tl = mktime (t);
2112       if (tl == -1)
2113         return -1; /* can't deal with output from strptime */
2114       tl += 3600;
2115     }
2116   tg = gmtime (&tl);
2117   tg->tm_isdst = 0;
2118   tb = mktime (tg);
2119   if (tb == -1)
2120     {
2121       tg->tm_hour--;
2122       tb = mktime (tg);
2123       if (tb == -1)
2124         return -1; /* can't deal with output from gmtime */
2125       tb += 3600;
2126     }
2127   return (tl - (tb - tl));
2128 }
2129
2130 /* Check whether the result of strptime() indicates success.
2131    strptime() returns the pointer to how far it got to in the string.
2132    The processing has been successful if the string is at `GMT' or
2133    `+X', or at the end of the string.
2134
2135    In extended regexp parlance, the function returns 1 if P matches
2136    "^ *(GMT|[+-][0-9]|$)", 0 otherwise.  P being NULL (which strptime
2137    can return) is considered a failure and 0 is returned.  */
2138 static int
2139 check_end (const char *p)
2140 {
2141   if (!p)
2142     return 0;
2143   while (ISSPACE (*p))
2144     ++p;
2145   if (!*p
2146       || (p[0] == 'G' && p[1] == 'M' && p[2] == 'T')
2147       || ((p[0] == '+' || p[0] == '-') && ISDIGIT (p[1])))
2148     return 1;
2149   else
2150     return 0;
2151 }
2152
2153 /* Convert the textual specification of time in TIME_STRING to the
2154    number of seconds since the Epoch.
2155
2156    TIME_STRING can be in any of the three formats RFC2068 allows the
2157    HTTP servers to emit -- RFC1123-date, RFC850-date or asctime-date.
2158    Timezones are ignored, and should be GMT.
2159
2160    Return the computed time_t representation, or -1 if the conversion
2161    fails.
2162
2163    This function uses strptime with various string formats for parsing
2164    TIME_STRING.  This results in a parser that is not as lenient in
2165    interpreting TIME_STRING as I would like it to be.  Being based on
2166    strptime, it always allows shortened months, one-digit days, etc.,
2167    but due to the multitude of formats in which time can be
2168    represented, an ideal HTTP time parser would be even more
2169    forgiving.  It should completely ignore things like week days and
2170    concentrate only on the various forms of representing years,
2171    months, days, hours, minutes, and seconds.  For example, it would
2172    be nice if it accepted ISO 8601 out of the box.
2173
2174    I've investigated free and PD code for this purpose, but none was
2175    usable.  getdate was big and unwieldy, and had potential copyright
2176    issues, or so I was informed.  Dr. Marcus Hennecke's atotm(),
2177    distributed with phttpd, is excellent, but we cannot use it because
2178    it is not assigned to the FSF.  So I stuck it with strptime.  */
2179
2180 time_t
2181 http_atotm (const char *time_string)
2182 {
2183   /* NOTE: Solaris strptime man page claims that %n and %t match white
2184      space, but that's not universally available.  Instead, we simply
2185      use ` ' to mean "skip all WS", which works under all strptime
2186      implementations I've tested.  */
2187
2188   static const char *time_formats[] = {
2189     "%a, %d %b %Y %T",          /* RFC1123: Thu, 29 Jan 1998 22:12:57 */
2190     "%A, %d-%b-%y %T",          /* RFC850:  Thursday, 29-Jan-98 22:12:57 */
2191     "%a, %d-%b-%Y %T",          /* pseudo-RFC850:  Thu, 29-Jan-1998 22:12:57
2192                                    (google.com uses this for their cookies.) */
2193     "%a %b %d %T %Y"            /* asctime: Thu Jan 29 22:12:57 1998 */
2194   };
2195
2196   int i;
2197   struct tm t;
2198
2199   /* According to Roger Beeman, we need to initialize tm_isdst, since
2200      strptime won't do it.  */
2201   t.tm_isdst = 0;
2202
2203   /* Note that under foreign locales Solaris strptime() fails to
2204      recognize English dates, which renders this function useless.  We
2205      solve this by being careful not to affect LC_TIME when
2206      initializing locale.
2207
2208      Another solution would be to temporarily set locale to C, invoke
2209      strptime(), and restore it back.  This is slow and dirty,
2210      however, and locale support other than LC_MESSAGES can mess other
2211      things, so I rather chose to stick with just setting LC_MESSAGES.
2212
2213      GNU strptime does not have this problem because it recognizes
2214      both international and local dates.  */
2215
2216   for (i = 0; i < ARRAY_SIZE (time_formats); i++)
2217     if (check_end (strptime (time_string, time_formats[i], &t)))
2218       return mktime_from_utc (&t);
2219
2220   /* All formats have failed.  */
2221   return -1;
2222 }
2223 \f
2224 /* Authorization support: We support two authorization schemes:
2225
2226    * `Basic' scheme, consisting of base64-ing USER:PASSWORD string;
2227
2228    * `Digest' scheme, added by Junio Hamano <junio@twinsun.com>,
2229    consisting of answering to the server's challenge with the proper
2230    MD5 digests.  */
2231
2232 /* How many bytes it will take to store LEN bytes in base64.  */
2233 #define BASE64_LENGTH(len) (4 * (((len) + 2) / 3))
2234
2235 /* Encode the string S of length LENGTH to base64 format and place it
2236    to STORE.  STORE will be 0-terminated, and must point to a writable
2237    buffer of at least 1+BASE64_LENGTH(length) bytes.  */
2238 static void
2239 base64_encode (const char *s, char *store, int length)
2240 {
2241   /* Conversion table.  */
2242   static char tbl[64] = {
2243     'A','B','C','D','E','F','G','H',
2244     'I','J','K','L','M','N','O','P',
2245     'Q','R','S','T','U','V','W','X',
2246     'Y','Z','a','b','c','d','e','f',
2247     'g','h','i','j','k','l','m','n',
2248     'o','p','q','r','s','t','u','v',
2249     'w','x','y','z','0','1','2','3',
2250     '4','5','6','7','8','9','+','/'
2251   };
2252   int i;
2253   unsigned char *p = (unsigned char *)store;
2254
2255   /* Transform the 3x8 bits to 4x6 bits, as required by base64.  */
2256   for (i = 0; i < length; i += 3)
2257     {
2258       *p++ = tbl[s[0] >> 2];
2259       *p++ = tbl[((s[0] & 3) << 4) + (s[1] >> 4)];
2260       *p++ = tbl[((s[1] & 0xf) << 2) + (s[2] >> 6)];
2261       *p++ = tbl[s[2] & 0x3f];
2262       s += 3;
2263     }
2264   /* Pad the result if necessary...  */
2265   if (i == length + 1)
2266     *(p - 1) = '=';
2267   else if (i == length + 2)
2268     *(p - 1) = *(p - 2) = '=';
2269   /* ...and zero-terminate it.  */
2270   *p = '\0';
2271 }
2272
2273 /* Create the authentication header contents for the `Basic' scheme.
2274    This is done by encoding the string `USER:PASS' in base64 and
2275    prepending `HEADER: Basic ' to it.  */
2276 static char *
2277 basic_authentication_encode (const char *user, const char *passwd,
2278                              const char *header)
2279 {
2280   char *t1, *t2, *res;
2281   int len1 = strlen (user) + 1 + strlen (passwd);
2282   int len2 = BASE64_LENGTH (len1);
2283
2284   t1 = (char *)alloca (len1 + 1);
2285   sprintf (t1, "%s:%s", user, passwd);
2286   t2 = (char *)alloca (1 + len2);
2287   base64_encode (t1, t2, len1);
2288   res = (char *)xmalloc (len2 + 11 + strlen (header));
2289   sprintf (res, "%s: Basic %s\r\n", header, t2);
2290
2291   return res;
2292 }
2293
2294 #ifdef USE_DIGEST
2295 /* Parse HTTP `WWW-Authenticate:' header.  AU points to the beginning
2296    of a field in such a header.  If the field is the one specified by
2297    ATTR_NAME ("realm", "opaque", and "nonce" are used by the current
2298    digest authorization code), extract its value in the (char*)
2299    variable pointed by RET.  Returns negative on a malformed header,
2300    or number of bytes that have been parsed by this call.  */
2301 static int
2302 extract_header_attr (const char *au, const char *attr_name, char **ret)
2303 {
2304   const char *cp, *ep;
2305
2306   ep = cp = au;
2307
2308   if (strncmp (cp, attr_name, strlen (attr_name)) == 0)
2309     {
2310       cp += strlen (attr_name);
2311       if (!*cp)
2312         return -1;
2313       cp += skip_lws (cp);
2314       if (*cp != '=')
2315         return -1;
2316       if (!*++cp)
2317         return -1;
2318       cp += skip_lws (cp);
2319       if (*cp != '\"')
2320         return -1;
2321       if (!*++cp)
2322         return -1;
2323       for (ep = cp; *ep && *ep != '\"'; ep++)
2324         ;
2325       if (!*ep)
2326         return -1;
2327       FREE_MAYBE (*ret);
2328       *ret = strdupdelim (cp, ep);
2329       return ep - au + 1;
2330     }
2331   else
2332     return 0;
2333 }
2334
2335 /* Dump the hexadecimal representation of HASH to BUF.  HASH should be
2336    an array of 16 bytes containing the hash keys, and BUF should be a
2337    buffer of 33 writable characters (32 for hex digits plus one for
2338    zero termination).  */
2339 static void
2340 dump_hash (unsigned char *buf, const unsigned char *hash)
2341 {
2342   int i;
2343
2344   for (i = 0; i < MD5_HASHLEN; i++, hash++)
2345     {
2346       *buf++ = XDIGIT_TO_xchar (*hash >> 4);
2347       *buf++ = XDIGIT_TO_xchar (*hash & 0xf);
2348     }
2349   *buf = '\0';
2350 }
2351
2352 /* Take the line apart to find the challenge, and compose a digest
2353    authorization header.  See RFC2069 section 2.1.2.  */
2354 static char *
2355 digest_authentication_encode (const char *au, const char *user,
2356                               const char *passwd, const char *method,
2357                               const char *path)
2358 {
2359   static char *realm, *opaque, *nonce;
2360   static struct {
2361     const char *name;
2362     char **variable;
2363   } options[] = {
2364     { "realm", &realm },
2365     { "opaque", &opaque },
2366     { "nonce", &nonce }
2367   };
2368   char *res;
2369
2370   realm = opaque = nonce = NULL;
2371
2372   au += 6;                      /* skip over `Digest' */
2373   while (*au)
2374     {
2375       int i;
2376
2377       au += skip_lws (au);
2378       for (i = 0; i < ARRAY_SIZE (options); i++)
2379         {
2380           int skip = extract_header_attr (au, options[i].name,
2381                                           options[i].variable);
2382           if (skip < 0)
2383             {
2384               FREE_MAYBE (realm);
2385               FREE_MAYBE (opaque);
2386               FREE_MAYBE (nonce);
2387               return NULL;
2388             }
2389           else if (skip)
2390             {
2391               au += skip;
2392               break;
2393             }
2394         }
2395       if (i == ARRAY_SIZE (options))
2396         {
2397           while (*au && *au != '=')
2398             au++;
2399           if (*au && *++au)
2400             {
2401               au += skip_lws (au);
2402               if (*au == '\"')
2403                 {
2404                   au++;
2405                   while (*au && *au != '\"')
2406                     au++;
2407                   if (*au)
2408                     au++;
2409                 }
2410             }
2411         }
2412       while (*au && *au != ',')
2413         au++;
2414       if (*au)
2415         au++;
2416     }
2417   if (!realm || !nonce || !user || !passwd || !path || !method)
2418     {
2419       FREE_MAYBE (realm);
2420       FREE_MAYBE (opaque);
2421       FREE_MAYBE (nonce);
2422       return NULL;
2423     }
2424
2425   /* Calculate the digest value.  */
2426   {
2427     ALLOCA_MD5_CONTEXT (ctx);
2428     unsigned char hash[MD5_HASHLEN];
2429     unsigned char a1buf[MD5_HASHLEN * 2 + 1], a2buf[MD5_HASHLEN * 2 + 1];
2430     unsigned char response_digest[MD5_HASHLEN * 2 + 1];
2431
2432     /* A1BUF = H(user ":" realm ":" password) */
2433     gen_md5_init (ctx);
2434     gen_md5_update ((unsigned char *)user, strlen (user), ctx);
2435     gen_md5_update ((unsigned char *)":", 1, ctx);
2436     gen_md5_update ((unsigned char *)realm, strlen (realm), ctx);
2437     gen_md5_update ((unsigned char *)":", 1, ctx);
2438     gen_md5_update ((unsigned char *)passwd, strlen (passwd), ctx);
2439     gen_md5_finish (ctx, hash);
2440     dump_hash (a1buf, hash);
2441
2442     /* A2BUF = H(method ":" path) */
2443     gen_md5_init (ctx);
2444     gen_md5_update ((unsigned char *)method, strlen (method), ctx);
2445     gen_md5_update ((unsigned char *)":", 1, ctx);
2446     gen_md5_update ((unsigned char *)path, strlen (path), ctx);
2447     gen_md5_finish (ctx, hash);
2448     dump_hash (a2buf, hash);
2449
2450     /* RESPONSE_DIGEST = H(A1BUF ":" nonce ":" A2BUF) */
2451     gen_md5_init (ctx);
2452     gen_md5_update (a1buf, MD5_HASHLEN * 2, ctx);
2453     gen_md5_update ((unsigned char *)":", 1, ctx);
2454     gen_md5_update ((unsigned char *)nonce, strlen (nonce), ctx);
2455     gen_md5_update ((unsigned char *)":", 1, ctx);
2456     gen_md5_update (a2buf, MD5_HASHLEN * 2, ctx);
2457     gen_md5_finish (ctx, hash);
2458     dump_hash (response_digest, hash);
2459
2460     res = (char*) xmalloc (strlen (user)
2461                            + strlen (user)
2462                            + strlen (realm)
2463                            + strlen (nonce)
2464                            + strlen (path)
2465                            + 2 * MD5_HASHLEN /*strlen (response_digest)*/
2466                            + (opaque ? strlen (opaque) : 0)
2467                            + 128);
2468     sprintf (res, "Authorization: Digest \
2469 username=\"%s\", realm=\"%s\", nonce=\"%s\", uri=\"%s\", response=\"%s\"",
2470              user, realm, nonce, path, response_digest);
2471     if (opaque)
2472       {
2473         char *p = res + strlen (res);
2474         strcat (p, ", opaque=\"");
2475         strcat (p, opaque);
2476         strcat (p, "\"");
2477       }
2478     strcat (res, "\r\n");
2479   }
2480   return res;
2481 }
2482 #endif /* USE_DIGEST */
2483
2484
2485 #define BEGINS_WITH(line, string_constant)                              \
2486   (!strncasecmp (line, string_constant, sizeof (string_constant) - 1)   \
2487    && (ISSPACE (line[sizeof (string_constant) - 1])                     \
2488        || !line[sizeof (string_constant) - 1]))
2489
2490 static int
2491 known_authentication_scheme_p (const char *au)
2492 {
2493   return BEGINS_WITH (au, "Basic")
2494     || BEGINS_WITH (au, "Digest")
2495     || BEGINS_WITH (au, "NTLM");
2496 }
2497
2498 #undef BEGINS_WITH
2499
2500 /* Create the HTTP authorization request header.  When the
2501    `WWW-Authenticate' response header is seen, according to the
2502    authorization scheme specified in that header (`Basic' and `Digest'
2503    are supported by the current implementation), produce an
2504    appropriate HTTP authorization request header.  */
2505 static char *
2506 create_authorization_line (const char *au, const char *user,
2507                            const char *passwd, const char *method,
2508                            const char *path)
2509 {
2510   char *wwwauth = NULL;
2511
2512   if (!strncasecmp (au, "Basic", 5))
2513     wwwauth = basic_authentication_encode (user, passwd, "Authorization");
2514   if (!strncasecmp (au, "NTLM", 4))
2515     wwwauth = basic_authentication_encode (user, passwd, "Authorization");
2516 #ifdef USE_DIGEST
2517   else if (!strncasecmp (au, "Digest", 6))
2518     wwwauth = digest_authentication_encode (au, user, passwd, method, path);
2519 #endif /* USE_DIGEST */
2520   return wwwauth;
2521 }
2522 \f
2523 void
2524 http_cleanup (void)
2525 {
2526   if (pc_last_host_ip)
2527     address_list_release (pc_last_host_ip);
2528 }