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