]> sjero.net Git - wget/commitdiff
[svn] Added support for --restrict-file-names=lowercase and --restrict-file-names...
authormtortonesi <devnull@localhost>
Tue, 13 Jun 2006 13:58:33 +0000 (06:58 -0700)
committermtortonesi <devnull@localhost>
Tue, 13 Jun 2006 13:58:33 +0000 (06:58 -0700)
src/ChangeLog
src/init.c
src/options.h
src/test.c
src/url.c
tests/ChangeLog
tests/Test10.px [new file with mode: 0755]
tests/Test8.px
tests/Test9.px [new file with mode: 0755]

index 87bb27b2927112b7318f7455fb23d0e8617edd9a..ab09fb6270b73bd3587f057a29b668869cc1e362 100644 (file)
@@ -1,3 +1,19 @@
+2006-06-13  Mauro Tortonesi  <mauro@ferrara.linux.it>
+
+       * options.h (struct options): Introduced member restrict_files_case to
+       keep track of preferences on character case restrictions for
+       filenames.
+
+       * init.c: Modified defaults and cmd_spec_restrict_file_names to
+       support character case restrictions for filenames. Added
+       test_cmd_spec_restrict_file_names unit test.
+
+       * url.c: Modified append_uri_pathel to support character case
+       restrictions for filenames. Added test_append_uri_pathel unit test.
+
+       * test.c: Added test_cmd_spec_restrict_file_names and
+       test_append_uri_pathel to the list of unit tests to run.
+
 2006-06-12  Mauro Tortonesi  <mauro@ferrara.linux.it>
 
        * retr.c (retrieve_from_file): Use retrieve_tree and automatically
index 2e51291a997ed450512a1f4dc1144a810e9ba5f4..fccc4581f0e94bb8074b8a1dd674ac4a230b1952 100644 (file)
@@ -54,6 +54,10 @@ so, delete this exception statement from your version.  */
 #include "http.h"              /* for http_cleanup */
 #include "retr.h"              /* for output_stream */
 
+#ifdef TESTING
+#include "test.h"
+#endif
+
 /* We want tilde expansion enabled only when reading `.wgetrc' lines;
    otherwise, it will be performed by the shell.  This variable will
    be set by the wgetrc-reading function.  */
@@ -314,6 +318,7 @@ defaults (void)
   opt.restrict_files_os = restrict_windows;
 #endif
   opt.restrict_files_ctrl = true;
+  opt.restrict_files_case = restrict_no_case_restriction;
 
   opt.content_disposition = true;
 }
@@ -1178,40 +1183,47 @@ cmd_spec_restrict_file_names (const char *com, const char *val, void *place_igno
 {
   int restrict_os = opt.restrict_files_os;
   int restrict_ctrl = opt.restrict_files_ctrl;
+  int restrict_case = opt.restrict_files_case;
 
-  const char *end = strchr (val, ',');
-  if (!end)
-    end = val + strlen (val);
+  const char *end;
 
 #define VAL_IS(string_literal) BOUNDED_EQUAL (val, end, string_literal)
 
-  if (VAL_IS ("unix"))
-    restrict_os = restrict_unix;
-  else if (VAL_IS ("windows"))
-    restrict_os = restrict_windows;
-  else if (VAL_IS ("nocontrol"))
-    restrict_ctrl = 0;
-  else
+  do
     {
-    err:
-      fprintf (stderr,
-              _("%s: %s: Invalid restriction `%s', use `unix' or `windows'.\n"),
-              exec_name, com, val);
-      return false;
+      end = strchr (val, ',');
+      if (!end)
+        end = val + strlen (val);
+      
+      if (VAL_IS ("unix"))
+        restrict_os = restrict_unix;
+      else if (VAL_IS ("windows"))
+        restrict_os = restrict_windows;
+      else if (VAL_IS ("lowercase"))
+        restrict_case = restrict_lowercase;
+      else if (VAL_IS ("uppercase"))
+        restrict_case = restrict_uppercase;
+      else if (VAL_IS ("nocontrol"))
+        restrict_ctrl = false;
+      else
+        {
+          fprintf (stderr,
+                   _("%s: %s: Invalid restriction `%s', use [unix|windows],[lowercase|uppercase],[nocontrol].\n"),
+                   exec_name, com, val);
+          return false;
+       }
+
+      if (*end) 
+       val = end + 1;
     }
+  while (*val && *end);
 
 #undef VAL_IS
 
-  if (*end)
-    {
-      if (!strcmp (end + 1, "nocontrol"))
-       restrict_ctrl = false;
-      else
-       goto err;
-    }
-
   opt.restrict_files_os = restrict_os;
   opt.restrict_files_ctrl = restrict_ctrl;
+  opt.restrict_files_case = restrict_case;
+  
   return true;
 }
 
@@ -1492,3 +1504,50 @@ cleanup (void)
   xfree_null (opt.passwd);
 #endif /* DEBUG_MALLOC */
 }
+\f
+/* Unit testing routines.  */
+
+#ifdef TESTING
+
+const char *
+test_cmd_spec_restrict_file_names()
+{
+  int i;
+  struct {
+    char *val;
+    int expected_restrict_files_os;
+    int expected_restrict_files_ctrl;
+    int expected_restrict_files_case;
+    bool result;
+  } test_array[] = {
+    { "windows", restrict_windows, true, restrict_no_case_restriction, true },
+    { "windows,", restrict_windows, true, restrict_no_case_restriction, true },
+    { "windows,lowercase", restrict_windows, true, restrict_lowercase, true },
+    { "unix,nocontrol,lowercase,", restrict_unix, false, restrict_lowercase, true },
+  };
+  
+  for (i = 0; i < sizeof(test_array)/sizeof(test_array[0]); ++i) 
+    {
+      bool res;
+      
+      defaults();
+      res = cmd_spec_restrict_file_names ("dummy", test_array[i].val, NULL);
+
+      /*
+      fprintf (stderr, "test_cmd_spec_restrict_file_names: TEST %d\n", i); fflush (stderr);
+      fprintf (stderr, "opt.restrict_files_os: %d\n",   opt.restrict_files_os); fflush (stderr);
+      fprintf (stderr, "opt.restrict_files_ctrl: %d\n", opt.restrict_files_ctrl); fflush (stderr);
+      fprintf (stderr, "opt.restrict_files_case: %d\n", opt.restrict_files_case); fflush (stderr);
+      */
+      mu_assert ("test_cmd_spec_restrict_file_names: wrong result", 
+                 res == test_array[i].result
+                 && opt.restrict_files_os   == test_array[i].expected_restrict_files_os 
+                 && opt.restrict_files_ctrl == test_array[i].expected_restrict_files_ctrl 
+                 && opt.restrict_files_case == test_array[i].expected_restrict_files_case);
+    }
+
+  return NULL;
+}
+
+#endif /* TESTING */
+
index f1b9cd75439f016538fd3724401c52df1859fef7..a7e36273c2e9f3f8af1206b7b3229b69be8e02e3 100644 (file)
@@ -203,6 +203,11 @@ struct options
   bool restrict_files_ctrl;    /* non-zero if control chars in URLs
                                   are restricted from appearing in
                                   generated file names. */
+  enum {
+    restrict_no_case_restriction,
+    restrict_lowercase,
+    restrict_uppercase
+  } restrict_files_case;       /* file name case restriction. */
 
   bool strict_comments;                /* whether strict SGML comments are
                                   enforced.  */
index 9f54a3e4a73fb37f33d1f5d9188e7ff4fcbd3393..bc24feaa000944acc772e4ea39530c5ee148e75c 100644 (file)
@@ -38,6 +38,8 @@ so, delete this exception statement from your version.  */
 const char *test_parse_content_disposition();
 const char *test_subdir_p();
 const char *test_dir_matches_p();
+const char *test_cmd_spec_restrict_file_names();
+const char *test_append_uri_pathel();
 
 int tests_run;
 
@@ -47,6 +49,8 @@ all_tests()
   mu_run_test (test_parse_content_disposition);
   mu_run_test (test_subdir_p);
   mu_run_test (test_dir_matches_p);
+  mu_run_test (test_cmd_spec_restrict_file_names);
+  mu_run_test (test_append_uri_pathel);
   
   return NULL;
 }
index 30828c2a4b291f0cd76db7b1aab8daacbb20364a..1d199feaf040c0f96d52d0022d07ca59587ad9ab 100644 (file)
--- a/src/url.c
+++ b/src/url.c
@@ -43,6 +43,10 @@ so, delete this exception statement from your version.  */
 #include "url.h"
 #include "host.h"  /* for is_valid_ipv6_address */
 
+#ifdef TESTING
+#include "test.h"
+#endif
+
 enum {
   scm_disabled = 1,            /* for https when OpenSSL fails to init. */
   scm_has_params = 2,          /* whether scheme has ;params */
@@ -1360,6 +1364,21 @@ append_uri_pathel (const char *b, const char *e, bool escaped,
        }
       assert (q - TAIL (dest) == outlen);
     }
+  
+  /* Perform inline case transformation if required.  */
+  if (opt.restrict_files_case == restrict_lowercase
+      || opt.restrict_files_case == restrict_uppercase)
+    {
+      char *q;
+      for (q = TAIL (dest); *q; ++q)
+        {
+          if (opt.restrict_files_case == restrict_lowercase)
+            *q = TOLOWER (*q);
+          else
+            *q = TOUPPER (*q);
+        }
+    }
+         
   TAIL_INCR (dest, outlen);
 }
 
@@ -1984,3 +2003,38 @@ test_path_simplify (void)
     }
 }
 #endif
+\f
+#ifdef TESTING
+
+const char *
+test_append_uri_pathel()
+{
+  int i;
+  struct {
+    char *original_url;
+    char *input;
+    bool escaped;
+    char *expected_result;
+  } test_array[] = {
+    { "http://www.yoyodyne.com/path/", "somepage.html", false, "http://www.yoyodyne.com/path/somepage.html" },
+  };
+  
+  for (i = 0; i < sizeof(test_array)/sizeof(test_array[0]); ++i) 
+    {
+      struct growable dest;
+      const char *p = test_array[i].input;
+      
+      memset (&dest, 0, sizeof (dest));
+      
+      append_string (test_array[i].original_url, &dest);
+      append_uri_pathel (p, p + strlen(p), test_array[i].escaped, &dest);
+
+      mu_assert ("test_append_uri_pathel: wrong result", 
+                 strcmp (dest.base, test_array[i].expected_result) == 0);
+    }
+
+  return NULL;
+}
+
+#endif /* TESTING */
+
index a8974571b5ae30efe15ea2b685444da520c82fbc..4bc0da93f4717f673df1d4f92c990ebf02a20de5 100644 (file)
@@ -1,3 +1,9 @@
+2006-06-13  Mauro Tortonesi  <mauro@ferrara.linux.it>
+
+       * Test9.px: Added test for --restrict-file-names=lowercase option.
+       
+       * Test10.px: Added test for --restrict-file-names=uppercase option.
+
 2006-05-26  Mauro Tortonesi  <mauro@ferrara.linux.it>
 
        * HTTPServer.pm: Added synchronization between client and server
diff --git a/tests/Test10.px b/tests/Test10.px
new file mode 100755 (executable)
index 0000000..e229403
--- /dev/null
@@ -0,0 +1,55 @@
+#!/usr/bin/perl -w
+
+use strict;
+
+use HTTPTest;
+
+
+###############################################################################
+
+my $mainpage = <<EOF;
+<html>
+<head>
+  <title>Some Page Title</title>
+</head>
+<body>
+  <p>
+    Some text...
+  </p>
+</body>
+</html>
+EOF
+
+# code, msg, headers, content
+my %urls = (
+    '/SomePage.html' => {
+        code => "200",
+        msg => "Dontcare",
+        headers => {
+            "Content-type" => "text/html",
+        },
+        content => $mainpage,
+    },
+);
+
+my $cmdline = "wget --restrict-file-names=uppercase http://localhost:8080/SomePage.html";
+
+my $expected_error_code = 0;
+
+my %expected_downloaded_files = (
+    'SOMEPAGE.HTML' => {
+        content => $mainpage,
+    },
+);
+
+###############################################################################
+
+my $the_test = HTTPTest->new (name => "Test9",
+                              input => \%urls, 
+                              cmdline => $cmdline, 
+                              errcode => $expected_error_code, 
+                              output => \%expected_downloaded_files);
+$the_test->run();
+
+# vim: et ts=4 sw=4
+
index 15fda010a9ff8a026a52650c433b40103c731c24..9d4a30810c4dd7aacf44fee96b2dc05528325fd2 100755 (executable)
@@ -49,7 +49,7 @@ my %urls = (
     },
 );
 
-my $cmdline = "wget -Sd --spider -r http://localhost:8080/";
+my $cmdline = "wget --spider -r http://localhost:8080/";
 
 my $expected_error_code = 0;
 
diff --git a/tests/Test9.px b/tests/Test9.px
new file mode 100755 (executable)
index 0000000..98c8ed6
--- /dev/null
@@ -0,0 +1,55 @@
+#!/usr/bin/perl -w
+
+use strict;
+
+use HTTPTest;
+
+
+###############################################################################
+
+my $mainpage = <<EOF;
+<html>
+<head>
+  <title>Some Page Title</title>
+</head>
+<body>
+  <p>
+    Some text...
+  </p>
+</body>
+</html>
+EOF
+
+# code, msg, headers, content
+my %urls = (
+    '/SomePage.html' => {
+        code => "200",
+        msg => "Dontcare",
+        headers => {
+            "Content-type" => "text/html",
+        },
+        content => $mainpage,
+    },
+);
+
+my $cmdline = "wget --restrict-file-names=lowercase http://localhost:8080/SomePage.html";
+
+my $expected_error_code = 0;
+
+my %expected_downloaded_files = (
+    'somepage.html' => {
+        content => $mainpage,
+    },
+);
+
+###############################################################################
+
+my $the_test = HTTPTest->new (name => "Test9",
+                              input => \%urls, 
+                              cmdline => $cmdline, 
+                              errcode => $expected_error_code, 
+                              output => \%expected_downloaded_files);
+$the_test->run();
+
+# vim: et ts=4 sw=4
+