/**
* 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)
{
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
*
/**
* Returns a string representation of this URL
*/
- public function __toString()
+ public function toString()
{
return unparse_url($this->parts);
}
{
$this->cleanupQuery();
$this->cleanupFragment();
- return $this->__toString();
+ return $this->toString();
}
/**
// -------- 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;
$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
$link = array(
'linkdate' => $linkdate,
'title' => $title,
- 'url' => (string)$url,
+ 'url' => $url,
'description' => $description,
'tags' => $tags,
'private' => $private
--- /dev/null
+<?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'
+ )
+ );
+ }
+}
+
--- /dev/null
+<?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'));
+ }
+}
+
--- /dev/null
+<?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)));
+ }
+}
+
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
*/
{
$url = new Url(self::$baseUrl.$query.$fragment);
$url->cleanup();
- $this->assertEquals(self::$baseUrl, $url->__toString());
+ $this->assertEquals(self::$baseUrl, $url->toString());
}
/**
*/
public function testEmptyConstruct()
{
- $this->assertEquals('', new Url(''));
+ $url = new Url('');
+ $this->assertEquals('', $url->toString());
}
/**
{
$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());
}
/**