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