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