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