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