]> sjero.net Git - wget/blobdiff - src/html-url.c
[svn] Convert URLs in <form action=...>.
[wget] / src / html-url.c
index 1c8856be406adb0180bde689e774e3a85f5a7b40..11789e59f017561f966b989a2a1d731b76d12c55 100644 (file)
@@ -48,6 +48,7 @@ typedef void (*tag_handler_t) PARAMS ((int, struct taginfo *,
 
 DECLARE_TAG_HANDLER (tag_find_urls);
 DECLARE_TAG_HANDLER (tag_handle_base);
+DECLARE_TAG_HANDLER (tag_handle_form);
 DECLARE_TAG_HANDLER (tag_handle_link);
 DECLARE_TAG_HANDLER (tag_handle_meta);
 
@@ -73,29 +74,31 @@ static struct {
   { "embed",   tag_find_urls },
 #define TAG_FIG                7
   { "fig",     tag_find_urls },
-#define TAG_FRAME      8
+#define TAG_FORM       8
+  { "form",    tag_handle_form },
+#define TAG_FRAME      9
   { "frame",   tag_find_urls },
-#define TAG_IFRAME     9
+#define TAG_IFRAME     10
   { "iframe",  tag_find_urls },
-#define TAG_IMG                10
+#define TAG_IMG                11
   { "img",     tag_find_urls },
-#define TAG_INPUT      11
+#define TAG_INPUT      12
   { "input",   tag_find_urls },
-#define TAG_LAYER      12
+#define TAG_LAYER      13
   { "layer",   tag_find_urls },
-#define TAG_LINK       13
+#define TAG_LINK       14
   { "link",    tag_handle_link },
-#define TAG_META       14
+#define TAG_META       15
   { "meta",    tag_handle_meta },
-#define TAG_OVERLAY    15
+#define TAG_OVERLAY    16
   { "overlay", tag_find_urls },
-#define TAG_SCRIPT     16
+#define TAG_SCRIPT     17
   { "script",  tag_find_urls },
-#define TAG_TABLE      17
+#define TAG_TABLE      18
   { "table",   tag_find_urls },
-#define TAG_TD         18
+#define TAG_TD         19
   { "td",      tag_find_urls },
-#define TAG_TH         19
+#define TAG_TH         20
   { "th",      tag_find_urls }
 };
 
@@ -120,7 +123,7 @@ static struct {
   { TAG_AREA,          "href",         TUA_EXTERNAL },
   { TAG_BGSOUND,       "src",          0 },
   { TAG_BODY,          "background",   0 },
-  { TAG_EMBED,         "href",         0 },
+  { TAG_EMBED,         "href",         TUA_EXTERNAL },
   { TAG_EMBED,         "src",          0 },
   { TAG_FIG,           "src",          0 },
   { TAG_FRAME,         "src",          0 },
@@ -141,10 +144,11 @@ static struct {
    from the information above.  However, some places in the code refer
    to the attributes not mentioned here.  We add them manually.  */
 static const char *additional_attributes[] = {
-  "rel",                       /* for TAG_LINK */
-  "http-equiv",                        /* for TAG_META */
-  "name",                      /* for TAG_META */
-  "content"                    /* for TAG_META */
+  "rel",                       /* used by tag_handle_link */
+  "http-equiv",                        /* used by tag_handle_meta */
+  "name",                      /* used by tag_handle_meta */
+  "content",                   /* used by tag_handle_meta */
+  "action"                     /* used by tag_handle_form */
 };
 
 static const char **interesting_tags;
@@ -328,9 +332,13 @@ append_one_url (const char *link_uri, int inlinep,
 
       if (!link_has_scheme)
        {
-         /* We have no base, and the link does not have a host
-            attached to it.  Nothing we can do.  */
-         /* #### Should we print a warning here?  Wget 1.5.x used to.  */
+         /* Base URL is unavailable, and the link does not have a
+            location attached to it -- we have to give up.  Since
+            this can only happen when using `--force-html -i', print
+            a warning.  */
+         logprintf (LOG_NOTQUIET,
+                    _("%s: Cannot resolve incomplete link %s.\n"),
+                    ctx->document_file, link_uri);
          return NULL;
        }
 
@@ -364,6 +372,8 @@ append_one_url (const char *link_uri, int inlinep,
       xfree (complete_uri);
     }
 
+  DEBUGP (("appending \"%s\" to urlpos.\n", url->url));
+
   newel = (struct urlpos *)xmalloc (sizeof (struct urlpos));
   memset (newel, 0, sizeof (*newel));
 
@@ -394,8 +404,8 @@ append_one_url (const char *link_uri, int inlinep,
 /* All the tag_* functions are called from collect_tags_mapper, as
    specified by KNOWN_TAGS.  */
 
-/* For most tags, all we want to do is harvest URLs from their
-   attributes.  */
+/* Default tag handler: collect URLs from attributes specified for
+   this tag by tag_url_attributes.  */
 
 static void
 tag_find_urls (int tagid, struct taginfo *tag, struct map_context *ctx)
@@ -407,7 +417,7 @@ tag_find_urls (int tagid, struct taginfo *tag, struct map_context *ctx)
     if (tag_url_attributes[i].tagid == tagid)
       {
        /* We've found the index of tag_url_attributes where the
-          attributes of our tags begin.  */
+          attributes of our tag begin.  */
        first = i;
        break;
       }
@@ -426,25 +436,26 @@ tag_find_urls (int tagid, struct taginfo *tag, struct map_context *ctx)
     {
       /* Find whether TAG/ATTRIND is a combination that contains a
         URL. */
-      char *attrvalue = tag->attrs[attrind].value;
+      char *link = tag->attrs[attrind].value;
 
       /* If you're cringing at the inefficiency of the nested loops,
-        remember that the number of attributes the inner loop
-        iterates over is laughably small -- three in the worst case
-        (IMG).  */
+        remember that they both iterate over a laughably small
+        quantity of items.  The worst-case inner loop is for the IMG
+        tag, which has three attributes.  */
       for (i = first; i < size && tag_url_attributes[i].tagid == tagid; i++)
        {
          if (0 == strcasecmp (tag->attrs[attrind].name,
                               tag_url_attributes[i].attr_name))
            {
              int flags = tag_url_attributes[i].flags;
-             append_one_url (attrvalue, !(flags & TUA_EXTERNAL),
-                             tag, attrind, ctx);
+             append_one_url (link, !(flags & TUA_EXTERNAL), tag, attrind, ctx);
            }
        }
     }
 }
 
+/* Handle the BASE tag, for <base href=...>. */
+
 static void
 tag_handle_base (int tagid, struct taginfo *tag, struct map_context *ctx)
 {
@@ -468,30 +479,49 @@ tag_handle_base (int tagid, struct taginfo *tag, struct map_context *ctx)
     ctx->base = xstrdup (newbase);
 }
 
+/* Mark the URL found in <form action=...> for conversion. */
+
+static void
+tag_handle_form (int tagid, struct taginfo *tag, struct map_context *ctx)
+{
+  int attrind;
+  char *action = find_attr (tag, "action", &attrind);
+  if (action)
+    {
+      struct urlpos *action_urlpos = append_one_url (action, 0, tag,
+                                                    attrind, ctx);
+      if (action_urlpos)
+       action_urlpos->ignore_when_downloading = 1;
+    }
+}
+
+/* Handle the LINK tag.  It requires special handling because how its
+   links will be followed in -p mode depends on the REL attribute.  */
+
 static void
 tag_handle_link (int tagid, struct taginfo *tag, struct map_context *ctx)
 {
   int attrind;
   char *href = find_attr (tag, "href", &attrind);
 
-  /* All <link href="..."> link references are external,
-     except for <link rel="stylesheet" href="...">.  */
+  /* All <link href="..."> link references are external, except those
+     known not to be, such as style sheet and shortcut icon:
+
+       <link rel="stylesheet" href="...">
+       <link rel="shortcut icon" href="...">
+  */
   if (href)
     {
       char *rel  = find_attr (tag, "rel", NULL);
-      int inlinep = (rel && 0 == strcasecmp (rel, "stylesheet"));
+      int inlinep = (rel
+                    && (0 == strcasecmp (rel, "stylesheet")
+                        || 0 == strcasecmp (rel, "shortcut icon")));
       append_one_url (href, inlinep, tag, attrind, ctx);
     }
 }
 
-/* Some pages use a META tag to specify that the page be refreshed by
-   a new page after a given number of seconds.  The general format for
-   this is:
-
-   <meta http-equiv=Refresh content="NUMBER; URL=index2.html">
-
-   So we just need to skip past the "NUMBER; URL=" garbage to get to
-   the URL.  */
+/* Handle the META tag.  This requires special handling because of the
+   refresh feature and because of robot exclusion.  */
 
 static void
 tag_handle_meta (int tagid, struct taginfo *tag, struct map_context *ctx)
@@ -501,11 +531,23 @@ tag_handle_meta (int tagid, struct taginfo *tag, struct map_context *ctx)
 
   if (http_equiv && 0 == strcasecmp (http_equiv, "refresh"))
     {
-      struct urlpos *entry;
+      /* Some pages use a META tag to specify that the page be
+        refreshed by a new page after a given number of seconds.  The
+        general format for this is:
 
+          <meta http-equiv=Refresh content="NUMBER; URL=index2.html">
+
+        So we just need to skip past the "NUMBER; URL=" garbage to
+        get to the URL.  */
+
+      struct urlpos *entry;
       int attrind;
-      char *p, *refresh = find_attr (tag, "content", &attrind);
       int timeout = 0;
+      char *p;
+
+      char *refresh = find_attr (tag, "content", &attrind);
+      if (!refresh)
+       return;
 
       for (p = refresh; ISDIGIT (*p); p++)
        timeout = 10 * timeout + *p - '0';