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