]> git.immae.eu Git - github/shaarli/Shaarli.git/commitdiff
Url: introduce global helper functions for cleanup and scheme detection 337/head
authorGuillaume Virlet <github@virlet.org>
Wed, 2 Sep 2015 11:55:39 +0000 (13:55 +0200)
committerGuillaume Virlet <github@virlet.org>
Tue, 8 Sep 2015 20:00:37 +0000 (22:00 +0200)
Relates to #314 & #326

Additions:
 - add global `cleanup_url()` and `get_url_scheme()` functions

Modifications:
 - replace `Url` usage in `index.php` by calls to global functions
 - fix `Url` tests not being run: PHPUnit expects a single test class per file
   - move classes to separate files

application/LinkDB.php
application/Url.php
index.php
tests/Url/CleanupUrlTest.php [new file with mode: 0644]
tests/Url/GetUrlSchemeTest.php [new file with mode: 0644]
tests/Url/UnparseUrlTest.php [new file with mode: 0644]
tests/Url/UrlTest.php [moved from tests/UrlTest.php with 85% similarity]

index 463aa47ef5ef10ecac945206c77e9de48e823e8b..8473350555e3b8abfdba1a4bd995c9d1da249613 100644 (file)
@@ -287,6 +287,10 @@ You use the community supported version of the original Shaarli project, by Seba
 
     /**
      * Returns the link for a given URL, or False if it does not exist.
+     *
+     * @param string $url URL to search for
+     *
+     * @return mixed the existing link if it exists, else 'false'
      */
     public function getLinkFromUrl($url)
     {
index 02a4395d01c8fd75d46921439ba44ef42249da8f..af43b457961729f3a5c2abc82a407b4a402531ec 100755 (executable)
@@ -25,6 +25,32 @@ function unparse_url($parsedUrl)
     return "$scheme$user$pass$host$port$path$query$fragment";
 }
 
+/**
+ * Removes undesired query parameters and fragments
+ *
+ * @param string url Url to be cleaned
+ *
+ * @return string the string representation of this URL after cleanup
+ */
+function cleanup_url($url)
+{
+  $obj_url = new Url($url);
+  return $obj_url->cleanup();
+}
+
+/**
+ * Get URL scheme.
+ *
+ * @param string url Url for which the scheme is requested
+ *
+ * @return mixed the URL scheme or false if none is provided.
+ */
+function get_url_scheme($url)
+{
+  $obj_url = new Url($url);
+  return $obj_url->getScheme();
+}
+
 /**
  * URL representation and cleanup utilities
  *
@@ -90,7 +116,7 @@ class Url
     /**
      * Returns a string representation of this URL
      */
-    public function __toString()
+    public function toString()
     {
         return unparse_url($this->parts);
     }
@@ -149,7 +175,7 @@ class Url
     {
         $this->cleanupQuery();
         $this->cleanupFragment();
-        return $this->__toString();
+        return $this->toString();
     }
 
     /**
index e39cff38cbb40321295269820a2cab542e7f17ad..61d92f04d8fd1bc61dde6167bd56096a9efc318e 100755 (executable)
--- a/index.php
+++ b/index.php
@@ -1454,12 +1454,11 @@ function renderPage()
 
     // -------- User want to post a new link: Display link edit form.
     if (isset($_GET['post'])) {
-        $url = new Url($_GET['post']);
-        $url->cleanup();
+        $url = cleanup_url($_GET['post']);
 
         $link_is_new = false;
         // Check if URL is not already in database (in this case, we will edit the existing link)
-        $link = $LINKSDB->getLinkFromUrl((string)$url);
+        $link = $LINKSDB->getLinkFromUrl($url);
         if (!$link)
         {
             $link_is_new = true;
@@ -1471,7 +1470,7 @@ function renderPage()
             $tags = (empty($_GET['tags']) ? '' : $_GET['tags'] );
             $private = (!empty($_GET['private']) && $_GET['private'] === "1" ? 1 : 0);
             // If this is an HTTP(S) link, we try go get the page to extract the title (otherwise we will to straight to the edit form.)
-            if (empty($title) && strpos($url->getScheme(), 'http') !== false) {
+            if (empty($title) && strpos(get_url_scheme($url), 'http') !== false) {
                 // Short timeout to keep the application responsive
                 list($headers, $data) = get_http_url($url, 4);
                 // FIXME: Decode charset according to specified in either 1) HTTP response headers or 2) <head> in html
@@ -1505,7 +1504,7 @@ function renderPage()
             $link = array(
                 'linkdate' => $linkdate,
                 'title' => $title,
-                'url' => (string)$url,
+                'url' => $url,
                 'description' => $description,
                 'tags' => $tags,
                 'private' => $private
diff --git a/tests/Url/CleanupUrlTest.php b/tests/Url/CleanupUrlTest.php
new file mode 100644 (file)
index 0000000..ba9a043
--- /dev/null
@@ -0,0 +1,76 @@
+<?php
+/**
+ * Unitary tests for cleanup_url()
+ */
+
+require_once 'application/Url.php';
+
+class CleanupUrlTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * Clean empty UrlThanks for building nothing
+     */
+    public function testCleanupUrlEmpty()
+    {
+        $this->assertEquals('', cleanup_url(''));
+    }
+
+    /**
+     * Clean an already cleaned Url
+     */
+    public function testCleanupUrlAlreadyClean()
+    {
+        $ref = 'http://domain.tld:3000';
+        $this->assertEquals($ref, cleanup_url($ref));
+        $ref = $ref.'/path/to/dir/';
+        $this->assertEquals($ref, cleanup_url($ref));
+    }
+
+    /**
+     * Clean Url needing cleaning
+     */
+    public function testCleanupUrlNeedClean()
+    {
+        $ref = 'http://domain.tld:3000';
+        $this->assertEquals($ref, cleanup_url($ref.'#tk.rss_all'));
+        $this->assertEquals($ref, cleanup_url($ref.'#xtor=RSS-'));
+        $this->assertEquals($ref, cleanup_url($ref.'#xtor=RSS-U3ht0tkc4b'));
+        $this->assertEquals($ref, cleanup_url($ref.'?action_object_map=junk'));
+        $this->assertEquals($ref, cleanup_url($ref.'?action_ref_map=Cr4p!'));
+        $this->assertEquals($ref, cleanup_url($ref.'?action_type_map=g4R84g3'));
+
+        $this->assertEquals($ref, cleanup_url($ref.'?fb_stuff=v41u3'));
+        $this->assertEquals($ref, cleanup_url($ref.'?fb=71m3w4573'));
+
+        $this->assertEquals($ref, cleanup_url($ref.'?utm_campaign=zomg'));
+        $this->assertEquals($ref, cleanup_url($ref.'?utm_medium=numnum'));
+        $this->assertEquals($ref, cleanup_url($ref.'?utm_source=c0d3'));
+        $this->assertEquals($ref, cleanup_url($ref.'?utm_term=1n4l'));
+
+        $this->assertEquals($ref, cleanup_url($ref.'?xtor=some-url'));
+        $this->assertEquals($ref, cleanup_url($ref.'?xtor=some-url&fb=som3th1ng'));
+        $this->assertEquals($ref, cleanup_url(
+            $ref.'?fb=stuff&utm_campaign=zomg&utm_medium=numnum&utm_source=c0d3'
+        ));
+        $this->assertEquals($ref, cleanup_url(
+            $ref.'?xtor=some-url&fb=som3th1ng#tk.rss_all'
+        ));
+
+        // ditch annoying query params and fragment, keep useful params
+        $this->assertEquals(
+            $ref.'?my=stuff&is=kept',
+            cleanup_url(
+                $ref.'?fb=zomg&my=stuff&utm_medium=numnum&is=kept#tk.rss_all'
+            )
+        );
+
+        // ditch annoying query params, keep useful params and fragment
+        $this->assertEquals(
+            $ref.'?my=stuff&is=kept#again',
+            cleanup_url(
+                $ref.'?fb=zomg&my=stuff&utm_medium=numnum&is=kept#again'
+            )
+        );
+    }
+}
+
diff --git a/tests/Url/GetUrlSchemeTest.php b/tests/Url/GetUrlSchemeTest.php
new file mode 100644 (file)
index 0000000..72d80b3
--- /dev/null
@@ -0,0 +1,31 @@
+<?php
+/**
+ * Unitary tests for get_url_scheme()
+ */
+
+require_once 'application/Url.php';
+
+class GetUrlSchemeTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * Get empty scheme string for empty Url
+     */
+    public function testGetUrlSchemeEmpty()
+    {
+        $this->assertEquals('', get_url_scheme(''));
+    }
+
+    /**
+     * Get normal scheme of Url
+     */
+    public function testGetUrlScheme()
+    {
+        $this->assertEquals('http', get_url_scheme('http://domain.tld:3000'));
+        $this->assertEquals('https', get_url_scheme('https://domain.tld:3000'));
+        $this->assertEquals('http', get_url_scheme('domain.tld'));
+        $this->assertEquals('ssh', get_url_scheme('ssh://domain.tld'));
+        $this->assertEquals('ftp', get_url_scheme('ftp://domain.tld'));
+        $this->assertEquals('git', get_url_scheme('git://domain.tld/push?pull=clone#checkout'));
+    }
+}
+
diff --git a/tests/Url/UnparseUrlTest.php b/tests/Url/UnparseUrlTest.php
new file mode 100644 (file)
index 0000000..edde73e
--- /dev/null
@@ -0,0 +1,31 @@
+<?php
+/**
+ * Unpares Url's tests
+ */
+
+require_once 'application/Url.php';
+
+/**
+ * Unitary tests for unparse_url()
+ */
+class UnparseUrlTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * Thanks for building nothing
+     */
+    public function testUnparseEmptyArray()
+    {
+        $this->assertEquals('', unparse_url(array()));
+    }
+
+    /**
+     * Rebuild a full-featured URL
+     */
+    public function testUnparseFull()
+    {
+        $ref = 'http://username:password@hostname:9090/path'
+              .'?arg1=value1&arg2=value2#anchor';
+        $this->assertEquals($ref, unparse_url(parse_url($ref)));
+    }
+}
+
similarity index 85%
rename from tests/UrlTest.php
rename to tests/Url/UrlTest.php
index c848e88e8c0cf6c2e4a7bd5eaf5eafcea687a30f..e498d79e8ed8dbf9057ce88c04fd1e98143a5408 100755 (executable)
@@ -5,30 +5,6 @@
 
 require_once 'application/Url.php';
 
-/**
- * Unitary tests for unparse_url()
- */
-class UnparseUrlTest extends PHPUnit_Framework_TestCase
-{
-    /**
-     * Thanks for building nothing
-     */
-    public function testUnparseEmptyArray()
-    {
-        $this->assertEquals('', unparse_url(array()));
-    }
-
-    /**
-     * Rebuild a full-featured URL
-     */
-    public function testUnparseFull()
-    {
-        $ref = 'http://username:password@hostname:9090/path'
-              .'?arg1=value1&arg2=value2#anchor';
-        $this->assertEquals($ref, unparse_url(parse_url($ref)));
-    }
-}
-
 /**
  * Unitary tests for URL utilities
  */
@@ -44,7 +20,7 @@ class UrlTest extends PHPUnit_Framework_TestCase
     {
         $url = new Url(self::$baseUrl.$query.$fragment);
         $url->cleanup();
-        $this->assertEquals(self::$baseUrl, $url->__toString());
+        $this->assertEquals(self::$baseUrl, $url->toString());
     }
 
     /**
@@ -52,7 +28,8 @@ class UrlTest extends PHPUnit_Framework_TestCase
      */
     public function testEmptyConstruct()
     {
-        $this->assertEquals('', new Url(''));
+        $url = new Url('');
+        $this->assertEquals('', $url->toString());
     }
 
     /**
@@ -62,7 +39,8 @@ class UrlTest extends PHPUnit_Framework_TestCase
     {
         $ref = 'http://username:password@hostname:9090/path'
               .'?arg1=value1&arg2=value2#anchor';
-        $this->assertEquals($ref, new Url($ref));
+        $url = new Url($ref);
+        $this->assertEquals($ref, $url->toString());
     }
 
     /**