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