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