]> sjero.net Git - wget/blobdiff - src/recur.c
Ted Mielczarek's CSS wonder-patch, applied against the source from around the time...
[wget] / src / recur.c
index 641174d69d23ded46be218c8b1aa5b11645c061b..024073ce3cf43aa900e0a3a90f2a7892bd6ef76a 100644 (file)
@@ -1,5 +1,5 @@
 /* Handling of recursive HTTP retrieving.
-   Copyright (C) 1996-2005 Free Software Foundation, Inc.
+   Copyright (C) 1996-2006 Free Software Foundation, Inc.
 
 This file is part of GNU Wget.
 
@@ -48,7 +48,10 @@ so, delete this exception statement from your version.  */
 #include "hash.h"
 #include "res.h"
 #include "convert.h"
-\f
+#include "html-url.h"
+#include "css-url.h"
+#include "spider.h"
+
 /* Functions for maintaining the URL queue.  */
 
 struct queue_element {
@@ -57,7 +60,8 @@ struct queue_element {
   int depth;                   /* the depth */
   bool html_allowed;           /* whether the document is allowed to
                                   be treated as HTML. */
-
+  bool css_allowed;            /* whether the document is allowed to
+                                  be treated as CSS. */
   struct queue_element *next;  /* next element in queue */
 };
 
@@ -90,13 +94,15 @@ url_queue_delete (struct url_queue *queue)
 
 static void
 url_enqueue (struct url_queue *queue,
-            const char *url, const char *referer, int depth, bool html_allowed)
+            const char *url, const char *referer, int depth,
+             bool html_allowed, bool css_allowed)
 {
   struct queue_element *qel = xnew (struct queue_element);
   qel->url = url;
   qel->referer = referer;
   qel->depth = depth;
   qel->html_allowed = html_allowed;
+  qel->css_allowed = css_allowed;
   qel->next = NULL;
 
   ++queue->count;
@@ -120,7 +126,7 @@ url_enqueue (struct url_queue *queue,
 static bool
 url_dequeue (struct url_queue *queue,
             const char **url, const char **referer, int *depth,
-            bool *html_allowed)
+            bool *html_allowed, bool *css_allowed)
 {
   struct queue_element *qel = queue->head;
 
@@ -135,6 +141,7 @@ url_dequeue (struct url_queue *queue,
   *referer = qel->referer;
   *depth = qel->depth;
   *html_allowed = qel->html_allowed;
+  *css_allowed = qel->css_allowed;
 
   --queue->count;
 
@@ -199,7 +206,7 @@ retrieve_tree (const char *start_url)
 
   /* Enqueue the starting URL.  Use start_url_parsed->url rather than
      just URL so we enqueue the canonical form of the URL.  */
-  url_enqueue (queue, xstrdup (start_url_parsed->url), NULL, 0, true);
+  url_enqueue (queue, xstrdup (start_url_parsed->url), NULL, 0, true, false);
   string_set_add (blacklist, start_url_parsed->url);
 
   while (1)
@@ -207,7 +214,8 @@ retrieve_tree (const char *start_url)
       bool descend = false;
       char *url, *referer, *file = NULL;
       int depth;
-      bool html_allowed;
+      bool html_allowed, css_allowed;
+      bool is_css = false;
       bool dash_p_leaf_HTML = false;
 
       if (opt.quota && total_downloaded_bytes > opt.quota)
@@ -219,7 +227,7 @@ retrieve_tree (const char *start_url)
 
       if (!url_dequeue (queue,
                        (const char **)&url, (const char **)&referer,
-                       &depth, &html_allowed))
+                       &depth, &html_allowed, &css_allowed))
        break;
 
       /* ...and download it.  Note that this download is in most cases
@@ -237,24 +245,46 @@ retrieve_tree (const char *start_url)
          DEBUGP (("Already downloaded \"%s\", reusing it from \"%s\".\n",
                   url, file));
 
+          /* this sucks, needs to be combined! */
          if (html_allowed
              && downloaded_html_set
              && string_set_contains (downloaded_html_set, file))
-           descend = true;
+            {
+              descend = true;
+              is_css = false;
+            }
+          if (css_allowed
+              && downloaded_css_set
+              && string_set_contains (downloaded_css_set, file))
+            {
+              descend = 1;
+              is_css = true;
+            }
        }
       else
        {
          int dt = 0;
          char *redirected = NULL;
-         bool oldrec = opt.recursive;
 
-         opt.recursive = false;
-         status = retrieve_url (url, &file, &redirected, referer, &dt);
-         opt.recursive = oldrec;
+         status = retrieve_url (url, &file, &redirected, referer, &dt, false);
 
          if (html_allowed && file && status == RETROK
              && (dt & RETROKF) && (dt & TEXTHTML))
-           descend = true;
+            {
+              descend = true;
+              is_css = false;
+            }
+
+          /* a little different, css_allowed can override content type
+             lots of web servers serve css with an incorrect content type
+          */
+          if (file && status == RETROK
+              && (dt & RETROKF) &&
+              ((dt & TEXTCSS) || css_allowed))
+            {
+              descend = true;
+              is_css = false;
+            }
 
          if (redirected)
            {
@@ -277,6 +307,11 @@ retrieve_tree (const char *start_url)
            }
        }
 
+      if (opt.spider)
+       {
+          visited_url (url, referer);
+       }
+
       if (descend
          && depth >= opt.reclevel && opt.reclevel != INFINITE_RECURSION)
        {
@@ -303,14 +338,15 @@ retrieve_tree (const char *start_url)
            }
        }
 
-      /* If the downloaded document was HTML, parse it and enqueue the
+      /* If the downloaded document was HTML or CSS, parse it and enqueue the
         links it contains. */
 
       if (descend)
        {
          bool meta_disallow_follow = false;
          struct urlpos *children
-           = get_urls_html (file, url, &meta_disallow_follow);
+           = is_css ? get_urls_css_file (file, url) :
+                       get_urls_html (file, url, &meta_disallow_follow);
 
          if (opt.use_robots && meta_disallow_follow)
            {
@@ -335,7 +371,8 @@ retrieve_tree (const char *start_url)
                    {
                      url_enqueue (queue, xstrdup (child->url->url),
                                   xstrdup (url), depth + 1,
-                                  child->link_expect_html);
+                                  child->link_expect_html,
+                                  child->link_expect_css);
                      /* We blacklist the URL we have enqueued, because we
                         don't want to enqueue (and hence download) the
                         same URL twice.  */
@@ -348,22 +385,27 @@ retrieve_tree (const char *start_url)
            }
        }
 
-      if (opt.delete_after || (file && !acceptable (file)))
+      if (file 
+          && (opt.delete_after 
+              || opt.spider /* opt.recursive is implicitely true */
+              || !acceptable (file)))
        {
          /* Either --delete-after was specified, or we loaded this
-            otherwise rejected (e.g. by -R) HTML file just so we
-            could harvest its hyperlinks -- in either case, delete
-            the local file. */
+            (otherwise unneeded because of --spider or rejected by -R) 
+            HTML file just to harvest its hyperlinks -- in either case, 
+            delete the local file. */
          DEBUGP (("Removing file due to %s in recursive_retrieve():\n",
                   opt.delete_after ? "--delete-after" :
-                  "recursive rejection criteria"));
+                  (opt.spider ? "--spider" : 
+                   "recursive rejection criteria")));
          logprintf (LOG_VERBOSE,
-                    (opt.delete_after
+                    (opt.delete_after || opt.spider
                      ? _("Removing %s.\n")
                      : _("Removing %s since it should be rejected.\n")),
                     file);
          if (unlink (file))
            logprintf (LOG_NOTQUIET, "unlink: %s\n", strerror (errno));
+         logputs (LOG_VERBOSE, "\n");
          register_delete_file (file);
        }
 
@@ -377,9 +419,9 @@ retrieve_tree (const char *start_url)
   {
     char *d1, *d2;
     int d3;
-    bool d4;
+    bool d4, d5;
     while (url_dequeue (queue,
-                       (const char **)&d1, (const char **)&d2, &d3, &d4))
+                       (const char **)&d1, (const char **)&d2, &d3, &d4, &d5))
       {
        xfree (d1);
        xfree_null (d2);
@@ -419,6 +461,13 @@ download_child_p (const struct urlpos *upos, struct url *parent, int depth,
 
   if (string_set_contains (blacklist, url))
     {
+      if (opt.spider) 
+       {
+          char *referrer = url_string (parent, true);
+          DEBUGP (("download_child_p: parent->url is: `%s'\n", parent->url));
+          visited_url (url, referrer);
+         xfree (referrer);
+       }
       DEBUGP (("Already on the black list.\n"));
       goto out;
     }
@@ -482,7 +531,7 @@ download_child_p (const struct urlpos *upos, struct url *parent, int depth,
       && u->port == start_url_parsed->port
       && !(opt.page_requisites && upos->link_inline_p))
     {
-      if (!frontcmp (start_url_parsed->dir, u->dir))
+      if (!subdir_p (start_url_parsed->dir, u->dir))
        {
          DEBUGP (("Going to \"%s\" would escape \"%s\" with no_parent on.\n",
                   u->dir, start_url_parsed->dir));