]> sjero.net Git - wget/blob - src/http.c
[svn] Rewrite parsing and handling of URLs.
[wget] / src / http.c
1 /* HTTP support.
2    Copyright (C) 1995, 1996, 1997, 1998, 2000, 2001
3    Free Software Foundation, Inc.
4
5 This file is part of GNU Wget.
6
7 GNU Wget is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
11
12 GNU Wget is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with Wget; if not, write to the Free Software
19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
20
21 #include <config.h>
22
23 #include <stdio.h>
24 #include <stdlib.h>
25 #include <sys/types.h>
26 #ifdef HAVE_STRING_H
27 # include <string.h>
28 #else
29 # include <strings.h>
30 #endif
31 #ifdef HAVE_UNISTD_H
32 # include <unistd.h>
33 #endif
34 #include <assert.h>
35 #include <errno.h>
36 #if TIME_WITH_SYS_TIME
37 # include <sys/time.h>
38 # include <time.h>
39 #else
40 # if HAVE_SYS_TIME_H
41 #  include <sys/time.h>
42 # else
43 #  include <time.h>
44 # endif
45 #endif
46
47 #ifdef WINDOWS
48 # include <winsock.h>
49 #else
50 # include <netdb.h>             /* for h_errno */
51 #endif
52
53 #include "wget.h"
54 #include "utils.h"
55 #include "url.h"
56 #include "host.h"
57 #include "rbuf.h"
58 #include "retr.h"
59 #include "headers.h"
60 #include "connect.h"
61 #include "fnmatch.h"
62 #include "netrc.h"
63 #ifdef HAVE_SSL
64 # include "gen_sslfunc.h"
65 #endif /* HAVE_SSL */
66 #include "cookies.h"
67
68 extern char *version_string;
69
70 #ifndef errno
71 extern int errno;
72 #endif
73 #ifndef h_errno
74 # ifndef __CYGWIN__
75 extern int h_errno;
76 # endif
77 #endif
78 \f
79 static int cookies_loaded_p;
80
81 #define TEXTHTML_S "text/html"
82 #define HTTP_ACCEPT "*/*"
83
84 /* Some status code validation macros: */
85 #define H_20X(x)        (((x) >= 200) && ((x) < 300))
86 #define H_PARTIAL(x)    ((x) == HTTP_STATUS_PARTIAL_CONTENTS)
87 #define H_REDIRECTED(x) (((x) == HTTP_STATUS_MOVED_PERMANENTLY) \
88                          || ((x) == HTTP_STATUS_MOVED_TEMPORARILY))
89
90 /* HTTP/1.0 status codes from RFC1945, provided for reference.  */
91 /* Successful 2xx.  */
92 #define HTTP_STATUS_OK                  200
93 #define HTTP_STATUS_CREATED             201
94 #define HTTP_STATUS_ACCEPTED            202
95 #define HTTP_STATUS_NO_CONTENT          204
96 #define HTTP_STATUS_PARTIAL_CONTENTS    206
97
98 /* Redirection 3xx.  */
99 #define HTTP_STATUS_MULTIPLE_CHOICES    300
100 #define HTTP_STATUS_MOVED_PERMANENTLY   301
101 #define HTTP_STATUS_MOVED_TEMPORARILY   302
102 #define HTTP_STATUS_NOT_MODIFIED        304
103
104 /* Client error 4xx.  */
105 #define HTTP_STATUS_BAD_REQUEST         400
106 #define HTTP_STATUS_UNAUTHORIZED        401
107 #define HTTP_STATUS_FORBIDDEN           403
108 #define HTTP_STATUS_NOT_FOUND           404
109
110 /* Server errors 5xx.  */
111 #define HTTP_STATUS_INTERNAL            500
112 #define HTTP_STATUS_NOT_IMPLEMENTED     501
113 #define HTTP_STATUS_BAD_GATEWAY         502
114 #define HTTP_STATUS_UNAVAILABLE         503
115
116 \f
117 /* Parse the HTTP status line, which is of format:
118
119    HTTP-Version SP Status-Code SP Reason-Phrase
120
121    The function returns the status-code, or -1 if the status line is
122    malformed.  The pointer to reason-phrase is returned in RP.  */
123 static int
124 parse_http_status_line (const char *line, const char **reason_phrase_ptr)
125 {
126   /* (the variables must not be named `major' and `minor', because
127      that breaks compilation with SunOS4 cc.)  */
128   int mjr, mnr, statcode;
129   const char *p;
130
131   *reason_phrase_ptr = NULL;
132
133   /* The standard format of HTTP-Version is: `HTTP/X.Y', where X is
134      major version, and Y is minor version.  */
135   if (strncmp (line, "HTTP/", 5) != 0)
136     return -1;
137   line += 5;
138
139   /* Calculate major HTTP version.  */
140   p = line;
141   for (mjr = 0; ISDIGIT (*line); line++)
142     mjr = 10 * mjr + (*line - '0');
143   if (*line != '.' || p == line)
144     return -1;
145   ++line;
146
147   /* Calculate minor HTTP version.  */
148   p = line;
149   for (mnr = 0; ISDIGIT (*line); line++)
150     mnr = 10 * mnr + (*line - '0');
151   if (*line != ' ' || p == line)
152     return -1;
153   /* Wget will accept only 1.0 and higher HTTP-versions.  The value of
154      minor version can be safely ignored.  */
155   if (mjr < 1)
156     return -1;
157   ++line;
158
159   /* Calculate status code.  */
160   if (!(ISDIGIT (*line) && ISDIGIT (line[1]) && ISDIGIT (line[2])))
161     return -1;
162   statcode = 100 * (*line - '0') + 10 * (line[1] - '0') + (line[2] - '0');
163
164   /* Set up the reason phrase pointer.  */
165   line += 3;
166   /* RFC2068 requires SPC here, but we allow the string to finish
167      here, in case no reason-phrase is present.  */
168   if (*line != ' ')
169     {
170       if (!*line)
171         *reason_phrase_ptr = line;
172       else
173         return -1;
174     }
175   else
176     *reason_phrase_ptr = line + 1;
177
178   return statcode;
179 }
180 \f
181 /* Functions to be used as arguments to header_process(): */
182
183 struct http_process_range_closure {
184   long first_byte_pos;
185   long last_byte_pos;
186   long entity_length;
187 };
188
189 /* Parse the `Content-Range' header and extract the information it
190    contains.  Returns 1 if successful, -1 otherwise.  */
191 static int
192 http_process_range (const char *hdr, void *arg)
193 {
194   struct http_process_range_closure *closure
195     = (struct http_process_range_closure *)arg;
196   long num;
197
198   /* Certain versions of Nutscape proxy server send out
199      `Content-Length' without "bytes" specifier, which is a breach of
200      RFC2068 (as well as the HTTP/1.1 draft which was current at the
201      time).  But hell, I must support it...  */
202   if (!strncasecmp (hdr, "bytes", 5))
203     {
204       hdr += 5;
205       hdr += skip_lws (hdr);
206       if (!*hdr)
207         return 0;
208     }
209   if (!ISDIGIT (*hdr))
210     return 0;
211   for (num = 0; ISDIGIT (*hdr); hdr++)
212     num = 10 * num + (*hdr - '0');
213   if (*hdr != '-' || !ISDIGIT (*(hdr + 1)))
214     return 0;
215   closure->first_byte_pos = num;
216   ++hdr;
217   for (num = 0; ISDIGIT (*hdr); hdr++)
218     num = 10 * num + (*hdr - '0');
219   if (*hdr != '/' || !ISDIGIT (*(hdr + 1)))
220     return 0;
221   closure->last_byte_pos = num;
222   ++hdr;
223   for (num = 0; ISDIGIT (*hdr); hdr++)
224     num = 10 * num + (*hdr - '0');
225   closure->entity_length = num;
226   return 1;
227 }
228
229 /* Place 1 to ARG if the HDR contains the word "none", 0 otherwise.
230    Used for `Accept-Ranges'.  */
231 static int
232 http_process_none (const char *hdr, void *arg)
233 {
234   int *where = (int *)arg;
235
236   if (strstr (hdr, "none"))
237     *where = 1;
238   else
239     *where = 0;
240   return 1;
241 }
242
243 /* Place the malloc-ed copy of HDR hdr, to the first `;' to ARG.  */
244 static int
245 http_process_type (const char *hdr, void *arg)
246 {
247   char **result = (char **)arg;
248   /* Locate P on `;' or the terminating zero, whichever comes first. */
249   const char *p = strchr (hdr, ';');
250   if (!p)
251     p = hdr + strlen (hdr);
252   while (p > hdr && ISSPACE (*(p - 1)))
253     --p;
254   *result = strdupdelim (hdr, p);
255   return 1;
256 }
257
258 /* Check whether the `Connection' header is set to "keep-alive". */
259 static int
260 http_process_connection (const char *hdr, void *arg)
261 {
262   int *flag = (int *)arg;
263   if (!strcasecmp (hdr, "Keep-Alive"))
264     *flag = 1;
265   return 1;
266 }
267 \f
268 /* Persistent connections.  Currently, we cache the most recently used
269    connection as persistent, provided that the HTTP server agrees to
270    make it such.  The persistence data is stored in the variables
271    below.  Ideally, it would be in a structure, and it should be
272    possible to cache an arbitrary fixed number of these connections.
273
274    I think the code is quite easy to extend in that direction.  */
275
276 /* Whether a persistent connection is active. */
277 static int pc_active_p;
278 /* Host and port of currently active persistent connection. */
279 static unsigned char pc_last_host[4];
280 static unsigned short pc_last_port;
281
282 /* File descriptor of the currently active persistent connection. */
283 static int pc_last_fd;
284
285 #ifdef HAVE_SSL
286 /* Whether a ssl handshake has occoured on this connection */
287 static int pc_active_ssl;
288 /* SSL connection of the currently active persistent connection. */
289 static SSL *pc_last_ssl;
290 #endif /* HAVE_SSL */
291
292 /* Mark the persistent connection as invalid.  This is used by the
293    CLOSE_* macros after they forcefully close a registered persistent
294    connection.  This does not close the file descriptor -- it is left
295    to the caller to do that.  (Maybe it should, though.)  */
296
297 static void
298 invalidate_persistent (void)
299 {
300   pc_active_p = 0;
301 #ifdef HAVE_SSL
302   pc_active_ssl = 0;
303 #endif /* HAVE_SSL */
304   DEBUGP (("Invalidating fd %d from further reuse.\n", pc_last_fd));
305 }
306
307 /* Register FD, which should be a TCP/IP connection to HOST:PORT, as
308    persistent.  This will enable someone to use the same connection
309    later.  In the context of HTTP, this must be called only AFTER the
310    response has been received and the server has promised that the
311    connection will remain alive.
312
313    If a previous connection was persistent, it is closed. */
314
315 static void
316 register_persistent (const char *host, unsigned short port, int fd
317 #ifdef HAVE_SSL
318                      , SSL *ssl
319 #endif
320                      )
321 {
322   int success;
323
324   if (pc_active_p)
325     {
326       if (pc_last_fd == fd)
327         {
328           /* The connection FD is already registered.  Nothing to
329              do. */
330           return;
331         }
332       else
333         {
334           /* The old persistent connection is still active; let's
335              close it first.  This situation arises whenever a
336              persistent connection exists, but we then connect to a
337              different host, and try to register a persistent
338              connection to that one.  */
339 #ifdef HAVE_SSL
340           /* The ssl disconnect has to take place before the closing
341              of pc_last_fd.  */
342           if (pc_last_ssl)
343             shutdown_ssl(pc_last_ssl);
344 #endif
345           CLOSE (pc_last_fd);
346           invalidate_persistent ();
347         }
348     }
349
350   /* This store_hostaddress may not fail, because it has the results
351      in the cache.  */
352   success = store_hostaddress (pc_last_host, host);
353   assert (success);
354   pc_last_port = port;
355   pc_last_fd = fd;
356   pc_active_p = 1;
357 #ifdef HAVE_SSL
358   pc_last_ssl = ssl;
359   pc_active_ssl = ssl ? 1 : 0;
360 #endif
361   DEBUGP (("Registered fd %d for persistent reuse.\n", fd));
362 }
363
364 /* Return non-zero if a persistent connection is available for
365    connecting to HOST:PORT.  */
366
367 static int
368 persistent_available_p (const char *host, unsigned short port
369 #ifdef HAVE_SSL
370                         , int ssl
371 #endif
372                         )
373 {
374   unsigned char this_host[4];
375   /* First, check whether a persistent connection is active at all.  */
376   if (!pc_active_p)
377     return 0;
378   /* Second, check if the active connection pertains to the correct
379      (HOST, PORT) ordered pair.  */
380   if (port != pc_last_port)
381     return 0;
382 #ifdef HAVE_SSL
383   /* Second, a): check if current connection is (not) ssl, too.  This
384      test is unlikely to fail because HTTP and HTTPS typicaly use
385      different ports.  Yet it is possible, or so I [Christian
386      Fraenkel] have been told, to run HTTPS and HTTP simultaneus on
387      the same port.  */
388   if (ssl != pc_active_ssl)
389     return 0;
390 #endif /* HAVE_SSL */
391   if (!store_hostaddress (this_host, host))
392     return 0;
393   if (memcmp (pc_last_host, this_host, 4))
394     return 0;
395   /* Third: check whether the connection is still open.  This is
396      important because most server implement a liberal (short) timeout
397      on persistent connections.  Wget can of course always reconnect
398      if the connection doesn't work out, but it's nicer to know in
399      advance.  This test is a logical followup of the first test, but
400      is "expensive" and therefore placed at the end of the list.  */
401   if (!test_socket_open (pc_last_fd))
402     {
403       /* Oops, the socket is no longer open.  Now that we know that,
404          let's invalidate the persistent connection before returning
405          0.  */
406       CLOSE (pc_last_fd);
407       invalidate_persistent ();
408       return 0;
409     }
410   return 1;
411 }
412
413 #ifdef HAVE_SSL
414 # define SHUTDOWN_SSL(ssl) do {         \
415   if (ssl)                              \
416     shutdown_ssl (ssl);                 \
417 } while (0)
418 #else
419 # define SHUTDOWN_SSL(ssl) 
420 #endif
421
422 /* The idea behind these two CLOSE macros is to distinguish between
423    two cases: one when the job we've been doing is finished, and we
424    want to close the connection and leave, and two when something is
425    seriously wrong and we're closing the connection as part of
426    cleanup.
427
428    In case of keep_alive, CLOSE_FINISH should leave the connection
429    open, while CLOSE_INVALIDATE should still close it.
430
431    Note that the semantics of the flag `keep_alive' is "this
432    connection *will* be reused (the server has promised not to close
433    the connection once we're done)", while the semantics of
434    `pc_active_p && (fd) == pc_last_fd' is "we're *now* using an
435    active, registered connection".  */
436
437 #define CLOSE_FINISH(fd) do {                   \
438   if (!keep_alive)                              \
439     {                                           \
440       SHUTDOWN_SSL (ssl);                       \
441       CLOSE (fd);                               \
442       if (pc_active_p && (fd) == pc_last_fd)    \
443         invalidate_persistent ();               \
444     }                                           \
445 } while (0)
446
447 #define CLOSE_INVALIDATE(fd) do {               \
448   SHUTDOWN_SSL (ssl);                           \
449   CLOSE (fd);                                   \
450   if (pc_active_p && (fd) == pc_last_fd)        \
451     invalidate_persistent ();                   \
452 } while (0)
453 \f
454 struct http_stat
455 {
456   long len;                     /* received length */
457   long contlen;                 /* expected length */
458   long restval;                 /* the restart value */
459   int res;                      /* the result of last read */
460   char *newloc;                 /* new location (redirection) */
461   char *remote_time;            /* remote time-stamp string */
462   char *error;                  /* textual HTTP error */
463   int statcode;                 /* status code */
464   long dltime;                  /* time of the download */
465   int no_truncate;              /* whether truncating the file is
466                                    forbidden. */
467   const char *referer;          /* value of the referer header. */
468   char **local_file;            /* local file. */
469 };
470
471 static void
472 free_hstat (struct http_stat *hs)
473 {
474   FREE_MAYBE (hs->newloc);
475   FREE_MAYBE (hs->remote_time);
476   FREE_MAYBE (hs->error);
477
478   /* Guard against being called twice. */
479   hs->newloc = NULL;
480   hs->remote_time = NULL;
481   hs->error = NULL;
482 }
483
484 static char *create_authorization_line PARAMS ((const char *, const char *,
485                                                 const char *, const char *,
486                                                 const char *));
487 static char *basic_authentication_encode PARAMS ((const char *, const char *,
488                                                   const char *));
489 static int known_authentication_scheme_p PARAMS ((const char *));
490
491 time_t http_atotm PARAMS ((char *));
492
493 #define BEGINS_WITH(line, string_constant)                              \
494   (!strncasecmp (line, string_constant, sizeof (string_constant) - 1)   \
495    && (ISSPACE (line[sizeof (string_constant) - 1])                     \
496        || !line[sizeof (string_constant) - 1]))
497
498 /* Retrieve a document through HTTP protocol.  It recognizes status
499    code, and correctly handles redirections.  It closes the network
500    socket.  If it receives an error from the functions below it, it
501    will print it if there is enough information to do so (almost
502    always), returning the error to the caller (i.e. http_loop).
503
504    Various HTTP parameters are stored to hs.  Although it parses the
505    response code correctly, it is not used in a sane way.  The caller
506    can do that, though.
507
508    If PROXY is non-NULL, the connection will be made to the proxy
509    server, and u->url will be requested.  */
510 static uerr_t
511 gethttp (struct url *u, struct http_stat *hs, int *dt, struct url *proxy)
512 {
513   char *request, *type, *command, *full_path;
514   char *user, *passwd;
515   char *pragma_h, *referer, *useragent, *range, *wwwauth;
516   char *authenticate_h;
517   char *proxyauth;
518   char *all_headers;
519   char *port_maybe;
520   char *request_keep_alive;
521   int sock, hcount, num_written, all_length, statcode;
522   long contlen, contrange;
523   struct url *conn;
524   uerr_t err;
525   FILE *fp;
526   int auth_tried_already;
527   struct rbuf rbuf;
528 #ifdef HAVE_SSL
529   static SSL_CTX *ssl_ctx = NULL;
530   SSL *ssl = NULL;
531 #endif /* HAVE_SSL */
532   struct wget_timer *timer;
533   char *cookies = NULL;
534
535   /* Whether this connection will be kept alive after the HTTP request
536      is done. */
537   int keep_alive;
538
539   /* Flags that detect the two ways of specifying HTTP keep-alive
540      response.  */
541   int http_keep_alive_1, http_keep_alive_2;
542
543   /* Whether keep-alive should be inhibited. */
544   int inhibit_keep_alive;
545
546 #ifdef HAVE_SSL
547   /* initialize ssl_ctx on first run */
548   if (!ssl_ctx)
549     {
550       err = init_ssl (&ssl_ctx);
551       if (err != 0)
552         {
553           switch (err)
554             {
555             case SSLERRCTXCREATE:
556               /* this is fatal */
557               logprintf (LOG_NOTQUIET, _("Failed to set up an SSL context\n"));
558               ssl_printerrors ();
559               return err;
560             case SSLERRCERTFILE:
561               /* try without certfile */
562               logprintf (LOG_NOTQUIET,
563                          _("Failed to load certificates from %s\n"),
564                          opt.sslcertfile);
565               ssl_printerrors ();
566               logprintf (LOG_NOTQUIET,
567                          _("Trying without the specified certificate\n"));
568               break;
569             case SSLERRCERTKEY:
570               logprintf (LOG_NOTQUIET,
571                          _("Failed to get certificate key from %s\n"),
572                          opt.sslcertkey);
573               ssl_printerrors ();
574               logprintf (LOG_NOTQUIET,
575                          _("Trying without the specified certificate\n"));
576               break;
577             default:
578               break;
579             }
580         }
581     }
582 #endif /* HAVE_SSL */
583
584   if (!(*dt & HEAD_ONLY))
585     /* If we're doing a GET on the URL, as opposed to just a HEAD, we need to
586        know the local filename so we can save to it. */
587     assert (*hs->local_file != NULL);
588
589   authenticate_h = 0;
590   auth_tried_already = 0;
591
592   inhibit_keep_alive = !opt.http_keep_alive || proxy != NULL;
593
594  again:
595   /* We need to come back here when the initial attempt to retrieve
596      without authorization header fails.  (Expected to happen at least
597      for the Digest authorization scheme.)  */
598
599   keep_alive = 0;
600   http_keep_alive_1 = http_keep_alive_2 = 0;
601
602   /* Initialize certain elements of struct http_stat.  */
603   hs->len = 0L;
604   hs->contlen = -1;
605   hs->res = -1;
606   hs->newloc = NULL;
607   hs->remote_time = NULL;
608   hs->error = NULL;
609
610   /* If we're using a proxy, we will be connecting to the proxy
611      server. */
612   conn = proxy ? proxy : u;
613
614   /* First: establish the connection.  */
615   if (inhibit_keep_alive
616       ||
617 #ifndef HAVE_SSL
618       !persistent_available_p (conn->host, conn->port)
619 #else
620       !persistent_available_p (conn->host, conn->port,
621                                u->scheme == SCHEME_HTTPS)
622 #endif /* HAVE_SSL */
623       )
624     {
625       logprintf (LOG_VERBOSE, _("Connecting to %s:%hu... "),
626                  conn->host, conn->port);
627       err = make_connection (&sock, conn->host, conn->port);
628       switch (err)
629         {
630         case HOSTERR:
631           logputs (LOG_VERBOSE, "\n");
632           logprintf (LOG_NOTQUIET, "%s: %s.\n", conn->host, herrmsg (h_errno));
633           return HOSTERR;
634           break;
635         case CONSOCKERR:
636           logputs (LOG_VERBOSE, "\n");
637           logprintf (LOG_NOTQUIET, "socket: %s\n", strerror (errno));
638           return CONSOCKERR;
639           break;
640         case CONREFUSED:
641           logputs (LOG_VERBOSE, "\n");
642           logprintf (LOG_NOTQUIET,
643                      _("Connection to %s:%hu refused.\n"), conn->host,
644                      conn->port);
645           CLOSE (sock);
646           return CONREFUSED;
647         case CONERROR:
648           logputs (LOG_VERBOSE, "\n");
649           logprintf (LOG_NOTQUIET, "connect: %s\n", strerror (errno));
650           CLOSE (sock);
651           return CONERROR;
652           break;
653         case NOCONERROR:
654           /* Everything is fine!  */
655           logputs (LOG_VERBOSE, _("connected!\n"));
656           break;
657         default:
658           abort ();
659           break;
660         }
661 #ifdef HAVE_SSL
662      if (conn->scheme == SCHEME_HTTPS)
663        if (connect_ssl (&ssl, ssl_ctx,sock) != 0)
664          {
665            logputs (LOG_VERBOSE, "\n");
666            logprintf (LOG_NOTQUIET, _("Unable to establish SSL connection.\n"));
667            ssl_printerrors ();
668            CLOSE (sock);
669            return CONSSLERR;
670          }
671 #endif /* HAVE_SSL */
672     }
673   else
674     {
675       logprintf (LOG_VERBOSE, _("Reusing connection to %s:%hu.\n"),
676                  conn->host, conn->port);
677       /* #### pc_last_fd should be accessed through an accessor
678          function.  */
679       sock = pc_last_fd;
680 #ifdef HAVE_SSL
681       ssl = pc_last_ssl;
682 #endif /* HAVE_SSL */
683       DEBUGP (("Reusing fd %d.\n", sock));
684     }
685
686   command = (*dt & HEAD_ONLY) ? "HEAD" : "GET";
687
688   referer = NULL;
689   if (hs->referer)
690     {
691       referer = (char *)alloca (9 + strlen (hs->referer) + 3);
692       sprintf (referer, "Referer: %s\r\n", hs->referer);
693     }
694
695   if (*dt & SEND_NOCACHE)
696     pragma_h = "Pragma: no-cache\r\n";
697   else
698     pragma_h = "";
699
700   if (hs->restval)
701     {
702       range = (char *)alloca (13 + numdigit (hs->restval) + 4);
703       /* Gag me!  Some servers (e.g. WebSitePro) have been known to
704          respond to the following `Range' format by generating a
705          multipart/x-byte-ranges MIME document!  This MIME type was
706          present in an old draft of the byteranges specification.
707          HTTP/1.1 specifies a multipart/byte-ranges MIME type, but
708          only if multiple non-overlapping ranges are requested --
709          which Wget never does.  */
710       sprintf (range, "Range: bytes=%ld-\r\n", hs->restval);
711     }
712   else
713     range = NULL;
714   if (opt.useragent)
715     STRDUP_ALLOCA (useragent, opt.useragent);
716   else
717     {
718       useragent = (char *)alloca (10 + strlen (version_string));
719       sprintf (useragent, "Wget/%s", version_string);
720     }
721   /* Construct the authentication, if userid is present.  */
722   user = u->user;
723   passwd = u->passwd;
724   search_netrc (u->host, (const char **)&user, (const char **)&passwd, 0);
725   user = user ? user : opt.http_user;
726   passwd = passwd ? passwd : opt.http_passwd;
727
728   wwwauth = NULL;
729   if (user && passwd)
730     {
731       if (!authenticate_h)
732         {
733           /* We have the username and the password, but haven't tried
734              any authorization yet.  Let's see if the "Basic" method
735              works.  If not, we'll come back here and construct a
736              proper authorization method with the right challenges.
737
738              If we didn't employ this kind of logic, every URL that
739              requires authorization would have to be processed twice,
740              which is very suboptimal and generates a bunch of false
741              "unauthorized" errors in the server log.
742
743              #### But this logic also has a serious problem when used
744              with stronger authentications: we *first* transmit the
745              username and the password in clear text, and *then*
746              attempt a stronger authentication scheme.  That cannot be
747              right!  We are only fortunate that almost everyone still
748              uses the `Basic' scheme anyway.
749
750              There should be an option to prevent this from happening,
751              for those who use strong authentication schemes and value
752              their passwords.  */
753           wwwauth = basic_authentication_encode (user, passwd, "Authorization");
754         }
755       else
756         {
757           wwwauth = create_authorization_line (authenticate_h, user, passwd,
758                                                command, u->path);
759         }
760     }
761
762   proxyauth = NULL;
763   if (proxy)
764     {
765       char *proxy_user, *proxy_passwd;
766       /* For normal username and password, URL components override
767          command-line/wgetrc parameters.  With proxy authentication,
768          it's the reverse, because proxy URLs are normally the
769          "permanent" ones, so command-line args should take
770          precedence.  */
771       if (opt.proxy_user && opt.proxy_passwd)
772         {
773           proxy_user = opt.proxy_user;
774           proxy_passwd = opt.proxy_passwd;
775         }
776       else
777         {
778           proxy_user = proxy->user;
779           proxy_passwd = proxy->passwd;
780         }
781       /* #### This does not appear right.  Can't the proxy request,
782          say, `Digest' authentication?  */
783       if (proxy_user && proxy_passwd)
784         proxyauth = basic_authentication_encode (proxy_user, proxy_passwd,
785                                                  "Proxy-Authorization");
786     }
787
788   /* String of the form :PORT.  Used only for non-standard ports. */
789   port_maybe = NULL;
790   if (u->port != scheme_default_port (u->scheme))
791     {
792       port_maybe = (char *)alloca (numdigit (u->port) + 2);
793       sprintf (port_maybe, ":%d", u->port);
794     }
795
796   if (!inhibit_keep_alive)
797     request_keep_alive = "Connection: Keep-Alive\r\n";
798   else
799     request_keep_alive = NULL;
800
801   if (opt.cookies)
802     cookies = build_cookies_request (u->host, u->port, u->path,
803 #ifdef HAVE_SSL
804                                      u->scheme == SCHEME_HTTPS
805 #else
806                                      0
807 #endif
808                                      );
809
810   if (proxy)
811     full_path = xstrdup (u->url);
812   else
813     full_path = url_full_path (u);
814
815   /* Allocate the memory for the request.  */
816   request = (char *)alloca (strlen (command)
817                             + strlen (full_path)
818                             + strlen (useragent)
819                             + strlen (u->host)
820                             + (port_maybe ? strlen (port_maybe) : 0)
821                             + strlen (HTTP_ACCEPT)
822                             + (request_keep_alive
823                                ? strlen (request_keep_alive) : 0)
824                             + (referer ? strlen (referer) : 0)
825                             + (cookies ? strlen (cookies) : 0)
826                             + (wwwauth ? strlen (wwwauth) : 0)
827                             + (proxyauth ? strlen (proxyauth) : 0)
828                             + (range ? strlen (range) : 0)
829                             + strlen (pragma_h)
830                             + (opt.user_header ? strlen (opt.user_header) : 0)
831                             + 64);
832   /* Construct the request.  */
833   sprintf (request, "\
834 %s %s HTTP/1.0\r\n\
835 User-Agent: %s\r\n\
836 Host: %s%s\r\n\
837 Accept: %s\r\n\
838 %s%s%s%s%s%s%s%s\r\n",
839            command, full_path,
840            useragent, u->host,
841            port_maybe ? port_maybe : "",
842            HTTP_ACCEPT,
843            request_keep_alive ? request_keep_alive : "",
844            referer ? referer : "",
845            cookies ? cookies : "", 
846            wwwauth ? wwwauth : "", 
847            proxyauth ? proxyauth : "", 
848            range ? range : "",
849            pragma_h, 
850            opt.user_header ? opt.user_header : "");
851   DEBUGP (("---request begin---\n%s---request end---\n", request));
852
853   /* Free the temporary memory.  */
854   FREE_MAYBE (wwwauth);
855   FREE_MAYBE (proxyauth);
856   FREE_MAYBE (cookies);
857   xfree (full_path);
858
859   /* Send the request to server.  */
860 #ifdef HAVE_SSL
861   if (u->scheme == SCHEME_HTTPS)
862     num_written = ssl_iwrite (ssl, request, strlen (request));
863   else
864 #endif /* HAVE_SSL */
865     num_written = iwrite (sock, request, strlen (request));
866
867   if (num_written < 0)
868     {
869       logprintf (LOG_VERBOSE, _("Failed writing HTTP request: %s.\n"),
870                  strerror (errno));
871       CLOSE_INVALIDATE (sock);
872       return WRITEFAILED;
873     }
874   logprintf (LOG_VERBOSE, _("%s request sent, awaiting response... "),
875              proxy ? "Proxy" : "HTTP");
876   contlen = contrange = -1;
877   type = NULL;
878   statcode = -1;
879   *dt &= ~RETROKF;
880
881   /* Before reading anything, initialize the rbuf.  */
882   rbuf_initialize (&rbuf, sock);
883 #ifdef HAVE_SSL
884   if (u->scheme == SCHEME_HTTPS)
885     rbuf.ssl = ssl;
886   else
887     rbuf.ssl = NULL;
888 #endif /* HAVE_SSL */
889   all_headers = NULL;
890   all_length = 0;
891   /* Header-fetching loop.  */
892   hcount = 0;
893   while (1)
894     {
895       char *hdr;
896       int status;
897
898       ++hcount;
899       /* Get the header.  */
900       status = header_get (&rbuf, &hdr,
901                            /* Disallow continuations for status line.  */
902                            (hcount == 1 ? HG_NO_CONTINUATIONS : HG_NONE));
903
904       /* Check for errors.  */
905       if (status == HG_EOF && *hdr)
906         {
907           /* This used to be an unconditional error, but that was
908              somewhat controversial, because of a large number of
909              broken CGI's that happily "forget" to send the second EOL
910              before closing the connection of a HEAD request.
911
912              So, the deal is to check whether the header is empty
913              (*hdr is zero if it is); if yes, it means that the
914              previous header was fully retrieved, and that -- most
915              probably -- the request is complete.  "...be liberal in
916              what you accept."  Oh boy.  */
917           logputs (LOG_VERBOSE, "\n");
918           logputs (LOG_NOTQUIET, _("End of file while parsing headers.\n"));
919           xfree (hdr);
920           FREE_MAYBE (type);
921           FREE_MAYBE (all_headers);
922           CLOSE_INVALIDATE (sock);
923           return HEOF;
924         }
925       else if (status == HG_ERROR)
926         {
927           logputs (LOG_VERBOSE, "\n");
928           logprintf (LOG_NOTQUIET, _("Read error (%s) in headers.\n"),
929                      strerror (errno));
930           xfree (hdr);
931           FREE_MAYBE (type);
932           FREE_MAYBE (all_headers);
933           CLOSE_INVALIDATE (sock);
934           return HERR;
935         }
936
937       /* If the headers are to be saved to a file later, save them to
938          memory now.  */
939       if (opt.save_headers)
940         {
941           int lh = strlen (hdr);
942           all_headers = (char *)xrealloc (all_headers, all_length + lh + 2);
943           memcpy (all_headers + all_length, hdr, lh);
944           all_length += lh;
945           all_headers[all_length++] = '\n';
946           all_headers[all_length] = '\0';
947         }
948
949       /* Check for status line.  */
950       if (hcount == 1)
951         {
952           const char *error;
953           /* Parse the first line of server response.  */
954           statcode = parse_http_status_line (hdr, &error);
955           hs->statcode = statcode;
956           /* Store the descriptive response.  */
957           if (statcode == -1) /* malformed response */
958             {
959               /* A common reason for "malformed response" error is the
960                  case when no data was actually received.  Handle this
961                  special case.  */
962               if (!*hdr)
963                 hs->error = xstrdup (_("No data received"));
964               else
965                 hs->error = xstrdup (_("Malformed status line"));
966               xfree (hdr);
967               break;
968             }
969           else if (!*error)
970             hs->error = xstrdup (_("(no description)"));
971           else
972             hs->error = xstrdup (error);
973
974           if ((statcode != -1)
975 #ifdef DEBUG
976               && !opt.debug
977 #endif
978               )
979             {
980              if (opt.server_response)
981                logprintf (LOG_VERBOSE, "\n%2d %s", hcount, hdr);
982              else
983                logprintf (LOG_VERBOSE, "%2d %s", statcode, error);
984             }
985
986           goto done_header;
987         }
988
989       /* Exit on empty header.  */
990       if (!*hdr)
991         {
992           xfree (hdr);
993           break;
994         }
995
996       /* Print the header if requested.  */
997       if (opt.server_response && hcount != 1)
998         logprintf (LOG_VERBOSE, "\n%2d %s", hcount, hdr);
999
1000       /* Try getting content-length.  */
1001       if (contlen == -1 && !opt.ignore_length)
1002         if (header_process (hdr, "Content-Length", header_extract_number,
1003                             &contlen))
1004           goto done_header;
1005       /* Try getting content-type.  */
1006       if (!type)
1007         if (header_process (hdr, "Content-Type", http_process_type, &type))
1008           goto done_header;
1009       /* Try getting location.  */
1010       if (!hs->newloc)
1011         if (header_process (hdr, "Location", header_strdup, &hs->newloc))
1012           goto done_header;
1013       /* Try getting last-modified.  */
1014       if (!hs->remote_time)
1015         if (header_process (hdr, "Last-Modified", header_strdup,
1016                             &hs->remote_time))
1017           goto done_header;
1018       /* Try getting cookies. */
1019       if (opt.cookies)
1020         if (header_process (hdr, "Set-Cookie", set_cookie_header_cb, u))
1021           goto done_header;
1022       /* Try getting www-authentication.  */
1023       if (!authenticate_h)
1024         if (header_process (hdr, "WWW-Authenticate", header_strdup,
1025                             &authenticate_h))
1026           goto done_header;
1027       /* Check for accept-ranges header.  If it contains the word
1028          `none', disable the ranges.  */
1029       if (*dt & ACCEPTRANGES)
1030         {
1031           int nonep;
1032           if (header_process (hdr, "Accept-Ranges", http_process_none, &nonep))
1033             {
1034               if (nonep)
1035                 *dt &= ~ACCEPTRANGES;
1036               goto done_header;
1037             }
1038         }
1039       /* Try getting content-range.  */
1040       if (contrange == -1)
1041         {
1042           struct http_process_range_closure closure;
1043           if (header_process (hdr, "Content-Range", http_process_range, &closure))
1044             {
1045               contrange = closure.first_byte_pos;
1046               goto done_header;
1047             }
1048         }
1049       /* Check for keep-alive related responses. */
1050       if (!inhibit_keep_alive)
1051         {
1052           /* Check for the `Keep-Alive' header. */
1053           if (!http_keep_alive_1)
1054             {
1055               if (header_process (hdr, "Keep-Alive", header_exists,
1056                                   &http_keep_alive_1))
1057                 goto done_header;
1058             }
1059           /* Check for `Connection: Keep-Alive'. */
1060           if (!http_keep_alive_2)
1061             {
1062               if (header_process (hdr, "Connection", http_process_connection,
1063                                   &http_keep_alive_2))
1064                 goto done_header;
1065             }
1066         }
1067     done_header:
1068       xfree (hdr);
1069     }
1070
1071   logputs (LOG_VERBOSE, "\n");
1072
1073   if (contlen != -1
1074       && (http_keep_alive_1 || http_keep_alive_2))
1075     {
1076       assert (inhibit_keep_alive == 0);
1077       keep_alive = 1;
1078     }
1079   if (keep_alive)
1080     /* The server has promised that it will not close the connection
1081        when we're done.  This means that we can register it.  */
1082 #ifndef HAVE_SSL
1083     register_persistent (conn->host, conn->port, sock);
1084 #else
1085     register_persistent (conn->host, conn->port, sock, ssl);
1086 #endif /* HAVE_SSL */
1087
1088   if ((statcode == HTTP_STATUS_UNAUTHORIZED)
1089       && authenticate_h)
1090     {
1091       /* Authorization is required.  */
1092       FREE_MAYBE (type);
1093       type = NULL;
1094       free_hstat (hs);
1095       CLOSE_INVALIDATE (sock);  /* would be CLOSE_FINISH, but there
1096                                    might be more bytes in the body. */
1097       if (auth_tried_already)
1098         {
1099           /* If we have tried it already, then there is not point
1100              retrying it.  */
1101         failed:
1102           logputs (LOG_NOTQUIET, _("Authorization failed.\n"));
1103           xfree (authenticate_h);
1104           return AUTHFAILED;
1105         }
1106       else if (!known_authentication_scheme_p (authenticate_h))
1107         {
1108           xfree (authenticate_h);
1109           logputs (LOG_NOTQUIET, _("Unknown authentication scheme.\n"));
1110           return AUTHFAILED;
1111         }
1112       else if (BEGINS_WITH (authenticate_h, "Basic"))
1113         {
1114           /* The authentication scheme is basic, the one we try by
1115              default, and it failed.  There's no sense in trying
1116              again.  */
1117           goto failed;
1118         }
1119       else
1120         {
1121           auth_tried_already = 1;
1122           goto again;
1123         }
1124     }
1125   /* We do not need this anymore.  */
1126   if (authenticate_h)
1127     {
1128       xfree (authenticate_h);
1129       authenticate_h = NULL;
1130     }
1131
1132   /* 20x responses are counted among successful by default.  */
1133   if (H_20X (statcode))
1134     *dt |= RETROKF;
1135
1136   /* Return if redirected.  */
1137   if (H_REDIRECTED (statcode) || statcode == HTTP_STATUS_MULTIPLE_CHOICES)
1138     {
1139       /* RFC2068 says that in case of the 300 (multiple choices)
1140          response, the server can output a preferred URL through
1141          `Location' header; otherwise, the request should be treated
1142          like GET.  So, if the location is set, it will be a
1143          redirection; otherwise, just proceed normally.  */
1144       if (statcode == HTTP_STATUS_MULTIPLE_CHOICES && !hs->newloc)
1145         *dt |= RETROKF;
1146       else
1147         {
1148           logprintf (LOG_VERBOSE,
1149                      _("Location: %s%s\n"),
1150                      hs->newloc ? hs->newloc : _("unspecified"),
1151                      hs->newloc ? _(" [following]") : "");
1152           CLOSE_INVALIDATE (sock);      /* would be CLOSE_FINISH, but there
1153                                            might be more bytes in the body. */
1154           FREE_MAYBE (type);
1155           FREE_MAYBE (all_headers);
1156           return NEWLOCATION;
1157         }
1158     }
1159
1160   if (type && !strncasecmp (type, TEXTHTML_S, strlen (TEXTHTML_S)))
1161     *dt |= TEXTHTML;
1162   else
1163     /* We don't assume text/html by default.  */
1164     *dt &= ~TEXTHTML;
1165
1166   if (opt.html_extension && (*dt & TEXTHTML))
1167     /* -E / --html-extension / html_extension = on was specified, and this is a
1168        text/html file.  If some case-insensitive variation on ".htm[l]" isn't
1169        already the file's suffix, tack on ".html". */
1170     {
1171       char*  last_period_in_local_filename = strrchr(*hs->local_file, '.');
1172
1173       if (last_period_in_local_filename == NULL ||
1174           !(strcasecmp(last_period_in_local_filename, ".htm") == EQ ||
1175             strcasecmp(last_period_in_local_filename, ".html") == EQ))
1176         {
1177           size_t  local_filename_len = strlen(*hs->local_file);
1178           
1179           *hs->local_file = xrealloc(*hs->local_file,
1180                                      local_filename_len + sizeof(".html"));
1181           strcpy(*hs->local_file + local_filename_len, ".html");
1182
1183           *dt |= ADDED_HTML_EXTENSION;
1184         }
1185     }
1186
1187   if (contrange == -1)
1188     {
1189       /* We did not get a content-range header.  This means that the
1190          server did not honor our `Range' request.  Normally, this
1191          means we should reset hs->restval and continue normally.  */
1192
1193       /* However, if `-c' is used, we need to be a bit more careful:
1194
1195          1. If `-c' is specified and the file already existed when
1196          Wget was started, it would be a bad idea for us to start
1197          downloading it from scratch, effectively truncating it.  I
1198          believe this cannot happen unless `-c' was specified.
1199
1200          2. If `-c' is used on a file that is already fully
1201          downloaded, we're requesting bytes after the end of file,
1202          which can result in server not honoring `Range'.  If this is
1203          the case, `Content-Length' will be equal to the length of the
1204          file.  */
1205       if (opt.always_rest)
1206         {
1207           /* Check for condition #2. */
1208           if (hs->restval > 0               /* restart was requested. */
1209               && contlen != -1              /* we got content-length. */
1210               && hs->restval >= contlen     /* file fully downloaded
1211                                                or has shrunk.  */
1212               )
1213             {
1214               logputs (LOG_VERBOSE, _("\
1215 \n    The file is already fully retrieved; nothing to do.\n\n"));
1216               /* In case the caller inspects. */
1217               hs->len = contlen;
1218               hs->res = 0;
1219               FREE_MAYBE (type);
1220               FREE_MAYBE (all_headers);
1221               CLOSE_INVALIDATE (sock);  /* would be CLOSE_FINISH, but there
1222                                            might be more bytes in the body. */
1223               return RETRUNNEEDED;
1224             }
1225
1226           /* Check for condition #1. */
1227           if (hs->no_truncate)
1228             {
1229               logprintf (LOG_NOTQUIET,
1230                          _("\
1231 \n\
1232 Continued download failed on this file, which conflicts with `-c'.\n\
1233 Refusing to truncate existing file `%s'.\n\n"), *hs->local_file);
1234               FREE_MAYBE (type);
1235               FREE_MAYBE (all_headers);
1236               CLOSE_INVALIDATE (sock);
1237               return CONTNOTSUPPORTED;
1238             }
1239
1240           /* Fallthrough */
1241         }
1242
1243       hs->restval = 0;
1244     }
1245   else if (contrange != hs->restval ||
1246            (H_PARTIAL (statcode) && contrange == -1))
1247     {
1248       /* This means the whole request was somehow misunderstood by the
1249          server.  Bail out.  */
1250       FREE_MAYBE (type);
1251       FREE_MAYBE (all_headers);
1252       CLOSE_INVALIDATE (sock);
1253       return RANGEERR;
1254     }
1255
1256   if (hs->restval)
1257     {
1258       if (contlen != -1)
1259         contlen += contrange;
1260       else
1261         contrange = -1;        /* If conent-length was not sent,
1262                                   content-range will be ignored.  */
1263     }
1264   hs->contlen = contlen;
1265
1266   if (opt.verbose)
1267     {
1268       if ((*dt & RETROKF) && !opt.server_response)
1269         {
1270           /* No need to print this output if the body won't be
1271              downloaded at all, or if the original server response is
1272              printed.  */
1273           logputs (LOG_VERBOSE, _("Length: "));
1274           if (contlen != -1)
1275             {
1276               logputs (LOG_VERBOSE, legible (contlen));
1277               if (contrange != -1)
1278                 logprintf (LOG_VERBOSE, _(" (%s to go)"),
1279                            legible (contlen - contrange));
1280             }
1281           else
1282             logputs (LOG_VERBOSE,
1283                      opt.ignore_length ? _("ignored") : _("unspecified"));
1284           if (type)
1285             logprintf (LOG_VERBOSE, " [%s]\n", type);
1286           else
1287             logputs (LOG_VERBOSE, "\n");
1288         }
1289     }
1290   FREE_MAYBE (type);
1291   type = NULL;                  /* We don't need it any more.  */
1292
1293   /* Return if we have no intention of further downloading.  */
1294   if (!(*dt & RETROKF) || (*dt & HEAD_ONLY))
1295     {
1296       /* In case the caller cares to look...  */
1297       hs->len = 0L;
1298       hs->res = 0;
1299       FREE_MAYBE (type);
1300       FREE_MAYBE (all_headers);
1301       CLOSE_INVALIDATE (sock);  /* would be CLOSE_FINISH, but there
1302                                    might be more bytes in the body. */
1303       return RETRFINISHED;
1304     }
1305
1306   /* Open the local file.  */
1307   if (!opt.dfp)
1308     {
1309       mkalldirs (*hs->local_file);
1310       if (opt.backups)
1311         rotate_backups (*hs->local_file);
1312       fp = fopen (*hs->local_file, hs->restval ? "ab" : "wb");
1313       if (!fp)
1314         {
1315           logprintf (LOG_NOTQUIET, "%s: %s\n", *hs->local_file, strerror (errno));
1316           CLOSE_INVALIDATE (sock); /* would be CLOSE_FINISH, but there
1317                                       might be more bytes in the body. */
1318           FREE_MAYBE (all_headers);
1319           return FOPENERR;
1320         }
1321     }
1322   else                          /* opt.dfp */
1323     {
1324       extern int global_download_count;
1325       fp = opt.dfp;
1326       /* To ensure that repeated "from scratch" downloads work for -O
1327          files, we rewind the file pointer, unless restval is
1328          non-zero.  (This works only when -O is used on regular files,
1329          but it's still a valuable feature.)
1330
1331          However, this loses when more than one URL is specified on
1332          the command line the second rewinds eradicates the contents
1333          of the first download.  Thus we disable the above trick for
1334          all the downloads except the very first one.
1335
1336          #### A possible solution to this would be to remember the
1337          file position in the output document and to seek to that
1338          position, instead of rewinding.  */
1339       if (!hs->restval && global_download_count == 0)
1340         {
1341           /* This will silently fail for streams that don't correspond
1342              to regular files, but that's OK.  */
1343           rewind (fp);
1344           /* ftruncate is needed because opt.dfp is opened in append
1345              mode if opt.always_rest is set.  */
1346           ftruncate (fileno (fp), 0);
1347           clearerr (fp);
1348         }
1349     }
1350
1351   /* #### This confuses the code that checks for file size.  There
1352      should be some overhead information.  */
1353   if (opt.save_headers)
1354     fwrite (all_headers, 1, all_length, fp);
1355   timer = wtimer_new ();
1356   /* Get the contents of the document.  */
1357   hs->res = get_contents (sock, fp, &hs->len, hs->restval,
1358                           (contlen != -1 ? contlen : 0),
1359                           &rbuf, keep_alive);
1360   hs->dltime = wtimer_elapsed (timer);
1361   wtimer_delete (timer);
1362   {
1363     /* Close or flush the file.  We have to be careful to check for
1364        error here.  Checking the result of fwrite() is not enough --
1365        errors could go unnoticed!  */
1366     int flush_res;
1367     if (!opt.dfp)
1368       flush_res = fclose (fp);
1369     else
1370       flush_res = fflush (fp);
1371     if (flush_res == EOF)
1372       hs->res = -2;
1373   }
1374   FREE_MAYBE (all_headers);
1375   CLOSE_FINISH (sock);
1376   if (hs->res == -2)
1377     return FWRITEERR;
1378   return RETRFINISHED;
1379 }
1380
1381 /* The genuine HTTP loop!  This is the part where the retrieval is
1382    retried, and retried, and retried, and...  */
1383 uerr_t
1384 http_loop (struct url *u, char **newloc, char **local_file, const char *referer,
1385            int *dt, struct url *proxy)
1386 {
1387   int count;
1388   int use_ts, got_head = 0;     /* time-stamping info */
1389   char *filename_plus_orig_suffix;
1390   char *local_filename = NULL;
1391   char *tms, *suf, *locf, *tmrate;
1392   uerr_t err;
1393   time_t tml = -1, tmr = -1;    /* local and remote time-stamps */
1394   long local_size = 0;          /* the size of the local file */
1395   size_t filename_len;
1396   struct http_stat hstat;       /* HTTP status */
1397   struct stat st;
1398   char *dummy = NULL;
1399
1400   /* This used to be done in main(), but it's a better idea to do it
1401      here so that we don't go through the hoops if we're just using
1402      FTP or whatever. */
1403   if (opt.cookies && opt.cookies_input && !cookies_loaded_p)
1404     {
1405       load_cookies (opt.cookies_input);
1406       cookies_loaded_p = 1;
1407     }
1408
1409   *newloc = NULL;
1410
1411   /* Warn on (likely bogus) wildcard usage in HTTP.  Don't use
1412      has_wildcards_p because it would also warn on `?', and we know that
1413      shows up in CGI paths a *lot*.  */
1414   if (strchr (u->url, '*'))
1415     logputs (LOG_VERBOSE, _("Warning: wildcards not supported in HTTP.\n"));
1416
1417   /* Determine the local filename.  */
1418   if (local_file && *local_file)
1419     hstat.local_file = local_file;
1420   else if (local_file)
1421     {
1422       *local_file = url_filename (u);
1423       hstat.local_file = local_file;
1424     }
1425   else
1426     {
1427       dummy = url_filename (u);
1428       hstat.local_file = &dummy;
1429     }
1430
1431   if (!opt.output_document)
1432     locf = *hstat.local_file;
1433   else
1434     locf = opt.output_document;
1435
1436   hstat.referer = referer;
1437
1438   filename_len = strlen (*hstat.local_file);
1439   filename_plus_orig_suffix = alloca (filename_len + sizeof (".orig"));
1440
1441   if (opt.noclobber && file_exists_p (*hstat.local_file))
1442     {
1443       /* If opt.noclobber is turned on and file already exists, do not
1444          retrieve the file */
1445       logprintf (LOG_VERBOSE, _("\
1446 File `%s' already there, will not retrieve.\n"), *hstat.local_file);
1447       /* If the file is there, we suppose it's retrieved OK.  */
1448       *dt |= RETROKF;
1449
1450       /* #### Bogusness alert.  */
1451       /* If its suffix is "html" or "htm", assume text/html.  */
1452       if (((suf = suffix (*hstat.local_file)) != NULL)
1453           && (!strcmp (suf, "html") || !strcmp (suf, "htm")))
1454         *dt |= TEXTHTML;
1455       xfree (suf);
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 = 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     MD5_CONTEXT_TYPE 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     MD5_INIT (&ctx);
2250     MD5_UPDATE (user, strlen (user), &ctx);
2251     MD5_UPDATE (":", 1, &ctx);
2252     MD5_UPDATE (realm, strlen (realm), &ctx);
2253     MD5_UPDATE (":", 1, &ctx);
2254     MD5_UPDATE (passwd, strlen (passwd), &ctx);
2255     MD5_FINISH (&ctx, hash);
2256     dump_hash (a1buf, hash);
2257
2258     /* A2BUF = H(method ":" path) */
2259     MD5_INIT (&ctx);
2260     MD5_UPDATE (method, strlen (method), &ctx);
2261     MD5_UPDATE (":", 1, &ctx);
2262     MD5_UPDATE (path, strlen (path), &ctx);
2263     MD5_FINISH (&ctx, hash);
2264     dump_hash (a2buf, hash);
2265
2266     /* RESPONSE_DIGEST = H(A1BUF ":" nonce ":" A2BUF) */
2267     MD5_INIT (&ctx);
2268     MD5_UPDATE (a1buf, MD5_HASHLEN * 2, &ctx);
2269     MD5_UPDATE (":", 1, &ctx);
2270     MD5_UPDATE (nonce, strlen (nonce), &ctx);
2271     MD5_UPDATE (":", 1, &ctx);
2272     MD5_UPDATE (a2buf, MD5_HASHLEN * 2, &ctx);
2273     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 }