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