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