]> sjero.net Git - wget/blob - src/http.c
[svn] Recursion and progress bar tweaks.
[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_ip[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 lookup_host cannot fail, because it has the results in the
351      cache.  */
352   success = lookup_host (host, pc_last_host_ip);
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_ip[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 (!lookup_host (host, this_host_ip))
392     return 0;
393   if (memcmp (pc_last_host_ip, this_host_ip, 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
1456       FREE_MAYBE (dummy);
1457       return RETROK;
1458     }
1459
1460   use_ts = 0;
1461   if (opt.timestamping)
1462     {
1463       boolean  local_dot_orig_file_exists = FALSE;
1464
1465       if (opt.backup_converted)
1466         /* If -K is specified, we'll act on the assumption that it was specified
1467            last time these files were downloaded as well, and instead of just
1468            comparing local file X against server file X, we'll compare local
1469            file X.orig (if extant, else X) against server file X.  If -K
1470            _wasn't_ specified last time, or the server contains files called
1471            *.orig, -N will be back to not operating correctly with -k. */
1472         {
1473           /* Would a single s[n]printf() call be faster?  --dan
1474
1475              Definitely not.  sprintf() is horribly slow.  It's a
1476              different question whether the difference between the two
1477              affects a program.  Usually I'd say "no", but at one
1478              point I profiled Wget, and found that a measurable and
1479              non-negligible amount of time was lost calling sprintf()
1480              in url.c.  Replacing sprintf with inline calls to
1481              strcpy() and long_to_string() made a difference.
1482              --hniksic */
1483           memcpy (filename_plus_orig_suffix, *hstat.local_file, filename_len);
1484           memcpy (filename_plus_orig_suffix + filename_len,
1485                   ".orig", sizeof (".orig"));
1486
1487           /* Try to stat() the .orig file. */
1488           if (stat (filename_plus_orig_suffix, &st) == 0)
1489             {
1490               local_dot_orig_file_exists = TRUE;
1491               local_filename = filename_plus_orig_suffix;
1492             }
1493         }      
1494
1495       if (!local_dot_orig_file_exists)
1496         /* Couldn't stat() <file>.orig, so try to stat() <file>. */
1497         if (stat (*hstat.local_file, &st) == 0)
1498           local_filename = *hstat.local_file;
1499
1500       if (local_filename != NULL)
1501         /* There was a local file, so we'll check later to see if the version
1502            the server has is the same version we already have, allowing us to
1503            skip a download. */
1504         {
1505           use_ts = 1;
1506           tml = st.st_mtime;
1507           local_size = st.st_size;
1508           got_head = 0;
1509         }
1510     }
1511   /* Reset the counter.  */
1512   count = 0;
1513   *dt = 0 | ACCEPTRANGES;
1514   /* THE loop */
1515   do
1516     {
1517       /* Increment the pass counter.  */
1518       ++count;
1519       sleep_between_retrievals (count);
1520       /* Get the current time string.  */
1521       tms = time_str (NULL);
1522       /* Print fetch message, if opt.verbose.  */
1523       if (opt.verbose)
1524         {
1525           char *hurl = url_string (u, 1);
1526           char tmp[15];
1527           strcpy (tmp, "        ");
1528           if (count > 1)
1529             sprintf (tmp, _("(try:%2d)"), count);
1530           logprintf (LOG_VERBOSE, "--%s--  %s\n  %s => `%s'\n",
1531                      tms, hurl, tmp, locf);
1532 #ifdef WINDOWS
1533           ws_changetitle (hurl, 1);
1534 #endif
1535           xfree (hurl);
1536         }
1537
1538       /* Default document type is empty.  However, if spider mode is
1539          on or time-stamping is employed, HEAD_ONLY commands is
1540          encoded within *dt.  */
1541       if (opt.spider || (use_ts && !got_head))
1542         *dt |= HEAD_ONLY;
1543       else
1544         *dt &= ~HEAD_ONLY;
1545       /* Assume no restarting.  */
1546       hstat.restval = 0L;
1547       /* Decide whether or not to restart.  */
1548       if (((count > 1 && (*dt & ACCEPTRANGES)) || opt.always_rest)
1549           /* #### this calls access() and then stat(); could be optimized. */
1550           && file_exists_p (locf))
1551         if (stat (locf, &st) == 0 && S_ISREG (st.st_mode))
1552           hstat.restval = st.st_size;
1553
1554       /* In `-c' is used and the file is existing and non-empty,
1555          refuse to truncate it if the server doesn't support continued
1556          downloads.  */
1557       hstat.no_truncate = 0;
1558       if (opt.always_rest && hstat.restval)
1559         hstat.no_truncate = 1;
1560
1561       /* Decide whether to send the no-cache directive.  We send it in
1562          two cases:
1563            a) we're using a proxy, and we're past our first retrieval.
1564               Some proxies are notorious for caching incomplete data, so
1565               we require a fresh get.
1566            b) caching is explicitly inhibited. */
1567       if ((proxy && count > 1)  /* a */
1568           || !opt.allow_cache   /* b */
1569           )
1570         *dt |= SEND_NOCACHE;
1571       else
1572         *dt &= ~SEND_NOCACHE;
1573
1574       /* Try fetching the document, or at least its head.  */
1575       err = gethttp (u, &hstat, dt, proxy);
1576
1577       /* It's unfortunate that wget determines the local filename before finding
1578          out the Content-Type of the file.  Barring a major restructuring of the
1579          code, we need to re-set locf here, since gethttp() may have xrealloc()d
1580          *hstat.local_file to tack on ".html". */
1581       if (!opt.output_document)
1582         locf = *hstat.local_file;
1583       else
1584         locf = opt.output_document;
1585
1586       /* Time?  */
1587       tms = time_str (NULL);
1588       /* Get the new location (with or without the redirection).  */
1589       if (hstat.newloc)
1590         *newloc = xstrdup (hstat.newloc);
1591       switch (err)
1592         {
1593         case HERR: case HEOF: case CONSOCKERR: case CONCLOSED:
1594         case CONERROR: case READERR: case WRITEFAILED:
1595         case RANGEERR:
1596           /* Non-fatal errors continue executing the loop, which will
1597              bring them to "while" statement at the end, to judge
1598              whether the number of tries was exceeded.  */
1599           free_hstat (&hstat);
1600           printwhat (count, opt.ntry);
1601           continue;
1602           break;
1603         case HOSTERR: case CONREFUSED: case PROXERR: case AUTHFAILED: 
1604         case SSLERRCTXCREATE: case CONTNOTSUPPORTED:
1605           /* Fatal errors just return from the function.  */
1606           free_hstat (&hstat);
1607           FREE_MAYBE (dummy);
1608           return err;
1609           break;
1610         case FWRITEERR: case FOPENERR:
1611           /* Another fatal error.  */
1612           logputs (LOG_VERBOSE, "\n");
1613           logprintf (LOG_NOTQUIET, _("Cannot write to `%s' (%s).\n"),
1614                      *hstat.local_file, strerror (errno));
1615           free_hstat (&hstat);
1616           FREE_MAYBE (dummy);
1617           return err;
1618           break;
1619         case CONSSLERR:
1620           /* Another fatal error.  */
1621           logputs (LOG_VERBOSE, "\n");
1622           logprintf (LOG_NOTQUIET, _("Unable to establish SSL connection.\n"));
1623           free_hstat (&hstat);
1624           FREE_MAYBE (dummy);
1625           return err;
1626           break;
1627         case NEWLOCATION:
1628           /* Return the new location to the caller.  */
1629           if (!hstat.newloc)
1630             {
1631               logprintf (LOG_NOTQUIET,
1632                          _("ERROR: Redirection (%d) without location.\n"),
1633                          hstat.statcode);
1634               free_hstat (&hstat);
1635               FREE_MAYBE (dummy);
1636               return WRONGCODE;
1637             }
1638           free_hstat (&hstat);
1639           FREE_MAYBE (dummy);
1640           return NEWLOCATION;
1641           break;
1642         case RETRUNNEEDED:
1643           /* The file was already fully retrieved. */
1644           free_hstat (&hstat);
1645           FREE_MAYBE (dummy);
1646           return RETROK;
1647           break;
1648         case RETRFINISHED:
1649           /* Deal with you later.  */
1650           break;
1651         default:
1652           /* All possibilities should have been exhausted.  */
1653           abort ();
1654         }
1655       if (!(*dt & RETROKF))
1656         {
1657           if (!opt.verbose)
1658             {
1659               /* #### Ugly ugly ugly! */
1660               char *hurl = url_string (u, 1);
1661               logprintf (LOG_NONVERBOSE, "%s:\n", hurl);
1662               xfree (hurl);
1663             }
1664           logprintf (LOG_NOTQUIET, _("%s ERROR %d: %s.\n"),
1665                      tms, hstat.statcode, hstat.error);
1666           logputs (LOG_VERBOSE, "\n");
1667           free_hstat (&hstat);
1668           FREE_MAYBE (dummy);
1669           return WRONGCODE;
1670         }
1671
1672       /* Did we get the time-stamp?  */
1673       if (!got_head)
1674         {
1675           if (opt.timestamping && !hstat.remote_time)
1676             {
1677               logputs (LOG_NOTQUIET, _("\
1678 Last-modified header missing -- time-stamps turned off.\n"));
1679             }
1680           else if (hstat.remote_time)
1681             {
1682               /* Convert the date-string into struct tm.  */
1683               tmr = http_atotm (hstat.remote_time);
1684               if (tmr == (time_t) (-1))
1685                 logputs (LOG_VERBOSE, _("\
1686 Last-modified header invalid -- time-stamp ignored.\n"));
1687             }
1688         }
1689
1690       /* The time-stamping section.  */
1691       if (use_ts)
1692         {
1693           got_head = 1;
1694           *dt &= ~HEAD_ONLY;
1695           use_ts = 0;           /* no more time-stamping */
1696           count = 0;            /* the retrieve count for HEAD is
1697                                    reset */
1698           if (hstat.remote_time && tmr != (time_t) (-1))
1699             {
1700               /* Now time-stamping can be used validly.  Time-stamping
1701                  means that if the sizes of the local and remote file
1702                  match, and local file is newer than the remote file,
1703                  it will not be retrieved.  Otherwise, the normal
1704                  download procedure is resumed.  */
1705               if (tml >= tmr &&
1706                   (hstat.contlen == -1 || local_size == hstat.contlen))
1707                 {
1708                   logprintf (LOG_VERBOSE, _("\
1709 Server file no newer than local file `%s' -- not retrieving.\n\n"),
1710                              local_filename);
1711                   free_hstat (&hstat);
1712                   FREE_MAYBE (dummy);
1713                   return RETROK;
1714                 }
1715               else if (tml >= tmr)
1716                 logprintf (LOG_VERBOSE, _("\
1717 The sizes do not match (local %ld) -- retrieving.\n"), local_size);
1718               else
1719                 logputs (LOG_VERBOSE,
1720                          _("Remote file is newer, retrieving.\n"));
1721             }
1722           free_hstat (&hstat);
1723           continue;
1724         }
1725       if ((tmr != (time_t) (-1))
1726           && !opt.spider
1727           && ((hstat.len == hstat.contlen) ||
1728               ((hstat.res == 0) &&
1729                ((hstat.contlen == -1) ||
1730                 (hstat.len >= hstat.contlen && !opt.kill_longer)))))
1731         {
1732           /* #### This code repeats in http.c and ftp.c.  Move it to a
1733              function!  */
1734           const char *fl = NULL;
1735           if (opt.output_document)
1736             {
1737               if (opt.od_known_regular)
1738                 fl = opt.output_document;
1739             }
1740           else
1741             fl = *hstat.local_file;
1742           if (fl)
1743             touch (fl, tmr);
1744         }
1745       /* End of time-stamping section.  */
1746
1747       if (opt.spider)
1748         {
1749           logprintf (LOG_NOTQUIET, "%d %s\n\n", hstat.statcode, hstat.error);
1750           FREE_MAYBE (dummy);
1751           return RETROK;
1752         }
1753
1754       tmrate = retr_rate (hstat.len - hstat.restval, hstat.dltime, 0);
1755
1756       if (hstat.len == hstat.contlen)
1757         {
1758           if (*dt & RETROKF)
1759             {
1760               logprintf (LOG_VERBOSE,
1761                          _("%s (%s) - `%s' saved [%ld/%ld]\n\n"),
1762                          tms, tmrate, locf, hstat.len, hstat.contlen);
1763               logprintf (LOG_NONVERBOSE,
1764                          "%s URL:%s [%ld/%ld] -> \"%s\" [%d]\n",
1765                          tms, u->url, hstat.len, hstat.contlen, locf, count);
1766             }
1767           ++opt.numurls;
1768           downloaded_increase (hstat.len);
1769
1770           /* Remember that we downloaded the file for later ".orig" code. */
1771           if (*dt & ADDED_HTML_EXTENSION)
1772             downloaded_file(FILE_DOWNLOADED_AND_HTML_EXTENSION_ADDED, locf);
1773           else
1774             downloaded_file(FILE_DOWNLOADED_NORMALLY, locf);
1775
1776           free_hstat (&hstat);
1777           FREE_MAYBE (dummy);
1778           return RETROK;
1779         }
1780       else if (hstat.res == 0) /* No read error */
1781         {
1782           if (hstat.contlen == -1)  /* We don't know how much we were supposed
1783                                        to get, so assume we succeeded. */ 
1784             {
1785               if (*dt & RETROKF)
1786                 {
1787                   logprintf (LOG_VERBOSE,
1788                              _("%s (%s) - `%s' saved [%ld]\n\n"),
1789                              tms, tmrate, locf, hstat.len);
1790                   logprintf (LOG_NONVERBOSE,
1791                              "%s URL:%s [%ld] -> \"%s\" [%d]\n",
1792                              tms, u->url, hstat.len, locf, count);
1793                 }
1794               ++opt.numurls;
1795               downloaded_increase (hstat.len);
1796
1797               /* Remember that we downloaded the file for later ".orig" code. */
1798               if (*dt & ADDED_HTML_EXTENSION)
1799                 downloaded_file(FILE_DOWNLOADED_AND_HTML_EXTENSION_ADDED, locf);
1800               else
1801                 downloaded_file(FILE_DOWNLOADED_NORMALLY, locf);
1802               
1803               free_hstat (&hstat);
1804               FREE_MAYBE (dummy);
1805               return RETROK;
1806             }
1807           else if (hstat.len < hstat.contlen) /* meaning we lost the
1808                                                  connection too soon */
1809             {
1810               logprintf (LOG_VERBOSE,
1811                          _("%s (%s) - Connection closed at byte %ld. "),
1812                          tms, tmrate, hstat.len);
1813               printwhat (count, opt.ntry);
1814               free_hstat (&hstat);
1815               continue;
1816             }
1817           else if (!opt.kill_longer) /* meaning we got more than expected */
1818             {
1819               logprintf (LOG_VERBOSE,
1820                          _("%s (%s) - `%s' saved [%ld/%ld])\n\n"),
1821                          tms, tmrate, locf, hstat.len, hstat.contlen);
1822               logprintf (LOG_NONVERBOSE,
1823                          "%s URL:%s [%ld/%ld] -> \"%s\" [%d]\n",
1824                          tms, u->url, hstat.len, hstat.contlen, locf, count);
1825               ++opt.numurls;
1826               downloaded_increase (hstat.len);
1827
1828               /* Remember that we downloaded the file for later ".orig" code. */
1829               if (*dt & ADDED_HTML_EXTENSION)
1830                 downloaded_file(FILE_DOWNLOADED_AND_HTML_EXTENSION_ADDED, locf);
1831               else
1832                 downloaded_file(FILE_DOWNLOADED_NORMALLY, locf);
1833               
1834               free_hstat (&hstat);
1835               FREE_MAYBE (dummy);
1836               return RETROK;
1837             }
1838           else                  /* the same, but not accepted */
1839             {
1840               logprintf (LOG_VERBOSE,
1841                          _("%s (%s) - Connection closed at byte %ld/%ld. "),
1842                          tms, tmrate, hstat.len, hstat.contlen);
1843               printwhat (count, opt.ntry);
1844               free_hstat (&hstat);
1845               continue;
1846             }
1847         }
1848       else                      /* now hstat.res can only be -1 */
1849         {
1850           if (hstat.contlen == -1)
1851             {
1852               logprintf (LOG_VERBOSE,
1853                          _("%s (%s) - Read error at byte %ld (%s)."),
1854                          tms, tmrate, hstat.len, strerror (errno));
1855               printwhat (count, opt.ntry);
1856               free_hstat (&hstat);
1857               continue;
1858             }
1859           else                  /* hstat.res == -1 and contlen is given */
1860             {
1861               logprintf (LOG_VERBOSE,
1862                          _("%s (%s) - Read error at byte %ld/%ld (%s). "),
1863                          tms, tmrate, hstat.len, hstat.contlen,
1864                          strerror (errno));
1865               printwhat (count, opt.ntry);
1866               free_hstat (&hstat);
1867               continue;
1868             }
1869         }
1870       /* not reached */
1871       break;
1872     }
1873   while (!opt.ntry || (count < opt.ntry));
1874   return TRYLIMEXC;
1875 }
1876 \f
1877 /* Converts struct tm to time_t, assuming the data in tm is UTC rather
1878    than local timezone.
1879
1880    mktime is similar but assumes struct tm, also known as the
1881    "broken-down" form of time, is in local time zone.  mktime_from_utc
1882    uses mktime to make the conversion understanding that an offset
1883    will be introduced by the local time assumption.
1884
1885    mktime_from_utc then measures the introduced offset by applying
1886    gmtime to the initial result and applying mktime to the resulting
1887    "broken-down" form.  The difference between the two mktime results
1888    is the measured offset which is then subtracted from the initial
1889    mktime result to yield a calendar time which is the value returned.
1890
1891    tm_isdst in struct tm is set to 0 to force mktime to introduce a
1892    consistent offset (the non DST offset) since tm and tm+o might be
1893    on opposite sides of a DST change.
1894
1895    Some implementations of mktime return -1 for the nonexistent
1896    localtime hour at the beginning of DST.  In this event, use
1897    mktime(tm - 1hr) + 3600.
1898
1899    Schematically
1900      mktime(tm)   --> t+o
1901      gmtime(t+o)  --> tm+o
1902      mktime(tm+o) --> t+2o
1903      t+o - (t+2o - t+o) = t
1904
1905    Note that glibc contains a function of the same purpose named
1906    `timegm' (reverse of gmtime).  But obviously, it is not universally
1907    available, and unfortunately it is not straightforwardly
1908    extractable for use here.  Perhaps configure should detect timegm
1909    and use it where available.
1910
1911    Contributed by Roger Beeman <beeman@cisco.com>, with the help of
1912    Mark Baushke <mdb@cisco.com> and the rest of the Gurus at CISCO.
1913    Further improved by Roger with assistance from Edward J. Sabol
1914    based on input by Jamie Zawinski.  */
1915
1916 static time_t
1917 mktime_from_utc (struct tm *t)
1918 {
1919   time_t tl, tb;
1920   struct tm *tg;
1921
1922   tl = mktime (t);
1923   if (tl == -1)
1924     {
1925       t->tm_hour--;
1926       tl = mktime (t);
1927       if (tl == -1)
1928         return -1; /* can't deal with output from strptime */
1929       tl += 3600;
1930     }
1931   tg = gmtime (&tl);
1932   tg->tm_isdst = 0;
1933   tb = mktime (tg);
1934   if (tb == -1)
1935     {
1936       tg->tm_hour--;
1937       tb = mktime (tg);
1938       if (tb == -1)
1939         return -1; /* can't deal with output from gmtime */
1940       tb += 3600;
1941     }
1942   return (tl - (tb - tl));
1943 }
1944
1945 /* Check whether the result of strptime() indicates success.
1946    strptime() returns the pointer to how far it got to in the string.
1947    The processing has been successful if the string is at `GMT' or
1948    `+X', or at the end of the string.
1949
1950    In extended regexp parlance, the function returns 1 if P matches
1951    "^ *(GMT|[+-][0-9]|$)", 0 otherwise.  P being NULL (which strptime
1952    can return) is considered a failure and 0 is returned.  */
1953 static int
1954 check_end (const char *p)
1955 {
1956   if (!p)
1957     return 0;
1958   while (ISSPACE (*p))
1959     ++p;
1960   if (!*p
1961       || (p[0] == 'G' && p[1] == 'M' && p[2] == 'T')
1962       || ((p[0] == '+' || p[0] == '-') && ISDIGIT (p[1])))
1963     return 1;
1964   else
1965     return 0;
1966 }
1967
1968 /* Convert the textual specification of time in TIME_STRING to the
1969    number of seconds since the Epoch.
1970
1971    TIME_STRING can be in any of the three formats RFC2068 allows the
1972    HTTP servers to emit -- RFC1123-date, RFC850-date or asctime-date.
1973    Timezones are ignored, and should be GMT.
1974
1975    Return the computed time_t representation, or -1 if the conversion
1976    fails.
1977
1978    This function uses strptime with various string formats for parsing
1979    TIME_STRING.  This results in a parser that is not as lenient in
1980    interpreting TIME_STRING as I would like it to be.  Being based on
1981    strptime, it always allows shortened months, one-digit days, etc.,
1982    but due to the multitude of formats in which time can be
1983    represented, an ideal HTTP time parser would be even more
1984    forgiving.  It should completely ignore things like week days and
1985    concentrate only on the various forms of representing years,
1986    months, days, hours, minutes, and seconds.  For example, it would
1987    be nice if it accepted ISO 8601 out of the box.
1988
1989    I've investigated free and PD code for this purpose, but none was
1990    usable.  getdate was big and unwieldy, and had potential copyright
1991    issues, or so I was informed.  Dr. Marcus Hennecke's atotm(),
1992    distributed with phttpd, is excellent, but we cannot use it because
1993    it is not assigned to the FSF.  So I stuck it with strptime.  */
1994
1995 time_t
1996 http_atotm (char *time_string)
1997 {
1998   /* NOTE: Solaris strptime man page claims that %n and %t match white
1999      space, but that's not universally available.  Instead, we simply
2000      use ` ' to mean "skip all WS", which works under all strptime
2001      implementations I've tested.  */
2002
2003   static const char *time_formats[] = {
2004     "%a, %d %b %Y %T",          /* RFC1123: Thu, 29 Jan 1998 22:12:57 */
2005     "%A, %d-%b-%y %T",          /* RFC850:  Thursday, 29-Jan-98 22:12:57 */
2006     "%a, %d-%b-%Y %T",          /* pseudo-RFC850:  Thu, 29-Jan-1998 22:12:57
2007                                    (google.com uses this for their cookies.) */
2008     "%a %b %d %T %Y"            /* asctime: Thu Jan 29 22:12:57 1998 */
2009   };
2010
2011   int i;
2012   struct tm t;
2013
2014   /* According to Roger Beeman, we need to initialize tm_isdst, since
2015      strptime won't do it.  */
2016   t.tm_isdst = 0;
2017
2018   /* Note that under foreign locales Solaris strptime() fails to
2019      recognize English dates, which renders this function useless.  We
2020      solve this by being careful not to affect LC_TIME when
2021      initializing locale.
2022
2023      Another solution would be to temporarily set locale to C, invoke
2024      strptime(), and restore it back.  This is slow and dirty,
2025      however, and locale support other than LC_MESSAGES can mess other
2026      things, so I rather chose to stick with just setting LC_MESSAGES.
2027
2028      GNU strptime does not have this problem because it recognizes
2029      both international and local dates.  */
2030
2031   for (i = 0; i < ARRAY_SIZE (time_formats); i++)
2032     if (check_end (strptime (time_string, time_formats[i], &t)))
2033       return mktime_from_utc (&t);
2034
2035   /* All formats have failed.  */
2036   return -1;
2037 }
2038 \f
2039 /* Authorization support: We support two authorization schemes:
2040
2041    * `Basic' scheme, consisting of base64-ing USER:PASSWORD string;
2042
2043    * `Digest' scheme, added by Junio Hamano <junio@twinsun.com>,
2044    consisting of answering to the server's challenge with the proper
2045    MD5 digests.  */
2046
2047 /* How many bytes it will take to store LEN bytes in base64.  */
2048 #define BASE64_LENGTH(len) (4 * (((len) + 2) / 3))
2049
2050 /* Encode the string S of length LENGTH to base64 format and place it
2051    to STORE.  STORE will be 0-terminated, and must point to a writable
2052    buffer of at least 1+BASE64_LENGTH(length) bytes.  */
2053 static void
2054 base64_encode (const char *s, char *store, int length)
2055 {
2056   /* Conversion table.  */
2057   static char tbl[64] = {
2058     'A','B','C','D','E','F','G','H',
2059     'I','J','K','L','M','N','O','P',
2060     'Q','R','S','T','U','V','W','X',
2061     'Y','Z','a','b','c','d','e','f',
2062     'g','h','i','j','k','l','m','n',
2063     'o','p','q','r','s','t','u','v',
2064     'w','x','y','z','0','1','2','3',
2065     '4','5','6','7','8','9','+','/'
2066   };
2067   int i;
2068   unsigned char *p = (unsigned char *)store;
2069
2070   /* Transform the 3x8 bits to 4x6 bits, as required by base64.  */
2071   for (i = 0; i < length; i += 3)
2072     {
2073       *p++ = tbl[s[0] >> 2];
2074       *p++ = tbl[((s[0] & 3) << 4) + (s[1] >> 4)];
2075       *p++ = tbl[((s[1] & 0xf) << 2) + (s[2] >> 6)];
2076       *p++ = tbl[s[2] & 0x3f];
2077       s += 3;
2078     }
2079   /* Pad the result if necessary...  */
2080   if (i == length + 1)
2081     *(p - 1) = '=';
2082   else if (i == length + 2)
2083     *(p - 1) = *(p - 2) = '=';
2084   /* ...and zero-terminate it.  */
2085   *p = '\0';
2086 }
2087
2088 /* Create the authentication header contents for the `Basic' scheme.
2089    This is done by encoding the string `USER:PASS' in base64 and
2090    prepending `HEADER: Basic ' to it.  */
2091 static char *
2092 basic_authentication_encode (const char *user, const char *passwd,
2093                              const char *header)
2094 {
2095   char *t1, *t2, *res;
2096   int len1 = strlen (user) + 1 + strlen (passwd);
2097   int len2 = BASE64_LENGTH (len1);
2098
2099   t1 = (char *)alloca (len1 + 1);
2100   sprintf (t1, "%s:%s", user, passwd);
2101   t2 = (char *)alloca (1 + len2);
2102   base64_encode (t1, t2, len1);
2103   res = (char *)xmalloc (len2 + 11 + strlen (header));
2104   sprintf (res, "%s: Basic %s\r\n", header, t2);
2105
2106   return res;
2107 }
2108
2109 #ifdef USE_DIGEST
2110 /* Parse HTTP `WWW-Authenticate:' header.  AU points to the beginning
2111    of a field in such a header.  If the field is the one specified by
2112    ATTR_NAME ("realm", "opaque", and "nonce" are used by the current
2113    digest authorization code), extract its value in the (char*)
2114    variable pointed by RET.  Returns negative on a malformed header,
2115    or number of bytes that have been parsed by this call.  */
2116 static int
2117 extract_header_attr (const char *au, const char *attr_name, char **ret)
2118 {
2119   const char *cp, *ep;
2120
2121   ep = cp = au;
2122
2123   if (strncmp (cp, attr_name, strlen (attr_name)) == 0)
2124     {
2125       cp += strlen (attr_name);
2126       if (!*cp)
2127         return -1;
2128       cp += skip_lws (cp);
2129       if (*cp != '=')
2130         return -1;
2131       if (!*++cp)
2132         return -1;
2133       cp += skip_lws (cp);
2134       if (*cp != '\"')
2135         return -1;
2136       if (!*++cp)
2137         return -1;
2138       for (ep = cp; *ep && *ep != '\"'; ep++)
2139         ;
2140       if (!*ep)
2141         return -1;
2142       FREE_MAYBE (*ret);
2143       *ret = strdupdelim (cp, ep);
2144       return ep - au + 1;
2145     }
2146   else
2147     return 0;
2148 }
2149
2150 /* Dump the hexadecimal representation of HASH to BUF.  HASH should be
2151    an array of 16 bytes containing the hash keys, and BUF should be a
2152    buffer of 33 writable characters (32 for hex digits plus one for
2153    zero termination).  */
2154 static void
2155 dump_hash (unsigned char *buf, const unsigned char *hash)
2156 {
2157   int i;
2158
2159   for (i = 0; i < MD5_HASHLEN; i++, hash++)
2160     {
2161       *buf++ = XDIGIT_TO_xchar (*hash >> 4);
2162       *buf++ = XDIGIT_TO_xchar (*hash & 0xf);
2163     }
2164   *buf = '\0';
2165 }
2166
2167 /* Take the line apart to find the challenge, and compose a digest
2168    authorization header.  See RFC2069 section 2.1.2.  */
2169 char *
2170 digest_authentication_encode (const char *au, const char *user,
2171                               const char *passwd, const char *method,
2172                               const char *path)
2173 {
2174   static char *realm, *opaque, *nonce;
2175   static struct {
2176     const char *name;
2177     char **variable;
2178   } options[] = {
2179     { "realm", &realm },
2180     { "opaque", &opaque },
2181     { "nonce", &nonce }
2182   };
2183   char *res;
2184
2185   realm = opaque = nonce = NULL;
2186
2187   au += 6;                      /* skip over `Digest' */
2188   while (*au)
2189     {
2190       int i;
2191
2192       au += skip_lws (au);
2193       for (i = 0; i < ARRAY_SIZE (options); i++)
2194         {
2195           int skip = extract_header_attr (au, options[i].name,
2196                                           options[i].variable);
2197           if (skip < 0)
2198             {
2199               FREE_MAYBE (realm);
2200               FREE_MAYBE (opaque);
2201               FREE_MAYBE (nonce);
2202               return NULL;
2203             }
2204           else if (skip)
2205             {
2206               au += skip;
2207               break;
2208             }
2209         }
2210       if (i == ARRAY_SIZE (options))
2211         {
2212           while (*au && *au != '=')
2213             au++;
2214           if (*au && *++au)
2215             {
2216               au += skip_lws (au);
2217               if (*au == '\"')
2218                 {
2219                   au++;
2220                   while (*au && *au != '\"')
2221                     au++;
2222                   if (*au)
2223                     au++;
2224                 }
2225             }
2226         }
2227       while (*au && *au != ',')
2228         au++;
2229       if (*au)
2230         au++;
2231     }
2232   if (!realm || !nonce || !user || !passwd || !path || !method)
2233     {
2234       FREE_MAYBE (realm);
2235       FREE_MAYBE (opaque);
2236       FREE_MAYBE (nonce);
2237       return NULL;
2238     }
2239
2240   /* Calculate the digest value.  */
2241   {
2242     MD5_CONTEXT_TYPE ctx;
2243     unsigned char hash[MD5_HASHLEN];
2244     unsigned char a1buf[MD5_HASHLEN * 2 + 1], a2buf[MD5_HASHLEN * 2 + 1];
2245     unsigned char response_digest[MD5_HASHLEN * 2 + 1];
2246
2247     /* A1BUF = H(user ":" realm ":" password) */
2248     MD5_INIT (&ctx);
2249     MD5_UPDATE (user, strlen (user), &ctx);
2250     MD5_UPDATE (":", 1, &ctx);
2251     MD5_UPDATE (realm, strlen (realm), &ctx);
2252     MD5_UPDATE (":", 1, &ctx);
2253     MD5_UPDATE (passwd, strlen (passwd), &ctx);
2254     MD5_FINISH (&ctx, hash);
2255     dump_hash (a1buf, hash);
2256
2257     /* A2BUF = H(method ":" path) */
2258     MD5_INIT (&ctx);
2259     MD5_UPDATE (method, strlen (method), &ctx);
2260     MD5_UPDATE (":", 1, &ctx);
2261     MD5_UPDATE (path, strlen (path), &ctx);
2262     MD5_FINISH (&ctx, hash);
2263     dump_hash (a2buf, hash);
2264
2265     /* RESPONSE_DIGEST = H(A1BUF ":" nonce ":" A2BUF) */
2266     MD5_INIT (&ctx);
2267     MD5_UPDATE (a1buf, MD5_HASHLEN * 2, &ctx);
2268     MD5_UPDATE (":", 1, &ctx);
2269     MD5_UPDATE (nonce, strlen (nonce), &ctx);
2270     MD5_UPDATE (":", 1, &ctx);
2271     MD5_UPDATE (a2buf, MD5_HASHLEN * 2, &ctx);
2272     MD5_FINISH (&ctx, hash);
2273     dump_hash (response_digest, hash);
2274
2275     res = (char*) xmalloc (strlen (user)
2276                            + strlen (user)
2277                            + strlen (realm)
2278                            + strlen (nonce)
2279                            + strlen (path)
2280                            + 2 * MD5_HASHLEN /*strlen (response_digest)*/
2281                            + (opaque ? strlen (opaque) : 0)
2282                            + 128);
2283     sprintf (res, "Authorization: Digest \
2284 username=\"%s\", realm=\"%s\", nonce=\"%s\", uri=\"%s\", response=\"%s\"",
2285              user, realm, nonce, path, response_digest);
2286     if (opaque)
2287       {
2288         char *p = res + strlen (res);
2289         strcat (p, ", opaque=\"");
2290         strcat (p, opaque);
2291         strcat (p, "\"");
2292       }
2293     strcat (res, "\r\n");
2294   }
2295   return res;
2296 }
2297 #endif /* USE_DIGEST */
2298
2299
2300 #define BEGINS_WITH(line, string_constant)                              \
2301   (!strncasecmp (line, string_constant, sizeof (string_constant) - 1)   \
2302    && (ISSPACE (line[sizeof (string_constant) - 1])                     \
2303        || !line[sizeof (string_constant) - 1]))
2304
2305 static int
2306 known_authentication_scheme_p (const char *au)
2307 {
2308   return BEGINS_WITH (au, "Basic")
2309     || BEGINS_WITH (au, "Digest")
2310     || BEGINS_WITH (au, "NTLM");
2311 }
2312
2313 #undef BEGINS_WITH
2314
2315 /* Create the HTTP authorization request header.  When the
2316    `WWW-Authenticate' response header is seen, according to the
2317    authorization scheme specified in that header (`Basic' and `Digest'
2318    are supported by the current implementation), produce an
2319    appropriate HTTP authorization request header.  */
2320 static char *
2321 create_authorization_line (const char *au, const char *user,
2322                            const char *passwd, const char *method,
2323                            const char *path)
2324 {
2325   char *wwwauth = NULL;
2326
2327   if (!strncasecmp (au, "Basic", 5))
2328     wwwauth = basic_authentication_encode (user, passwd, "Authorization");
2329   if (!strncasecmp (au, "NTLM", 4))
2330     wwwauth = basic_authentication_encode (user, passwd, "Authorization");
2331 #ifdef USE_DIGEST
2332   else if (!strncasecmp (au, "Digest", 6))
2333     wwwauth = digest_authentication_encode (au, user, passwd, method, path);
2334 #endif /* USE_DIGEST */
2335   return wwwauth;
2336 }