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