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