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