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