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