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