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