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