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