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