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