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