diff options
-rwxr-xr-x[-rw-r--r--] | application/Url.php | 16 | ||||
-rwxr-xr-x | index.php | 82 | ||||
-rwxr-xr-x[-rw-r--r--] | tests/UrlTest.php | 16 |
3 files changed, 76 insertions, 38 deletions
diff --git a/application/Url.php b/application/Url.php index 23356f39..02a4395d 100644..100755 --- a/application/Url.php +++ b/application/Url.php | |||
@@ -81,6 +81,10 @@ class Url | |||
81 | public function __construct($url) | 81 | public function __construct($url) |
82 | { | 82 | { |
83 | $this->parts = parse_url($url); | 83 | $this->parts = parse_url($url); |
84 | |||
85 | if (!empty($url) && empty($this->parts['scheme'])) { | ||
86 | $this->parts['scheme'] = 'http'; | ||
87 | } | ||
84 | } | 88 | } |
85 | 89 | ||
86 | /** | 90 | /** |
@@ -147,4 +151,16 @@ class Url | |||
147 | $this->cleanupFragment(); | 151 | $this->cleanupFragment(); |
148 | return $this->__toString(); | 152 | return $this->__toString(); |
149 | } | 153 | } |
154 | |||
155 | /** | ||
156 | * Get URL scheme. | ||
157 | * | ||
158 | * @return string the URL scheme or false if none is provided. | ||
159 | */ | ||
160 | public function getScheme() { | ||
161 | if (!isset($this->parts['scheme'])) { | ||
162 | return false; | ||
163 | } | ||
164 | return $this->parts['scheme']; | ||
165 | } | ||
150 | } | 166 | } |
@@ -1500,51 +1500,57 @@ function renderPage() | |||
1500 | $url->cleanup(); | 1500 | $url->cleanup(); |
1501 | 1501 | ||
1502 | $link_is_new = false; | 1502 | $link_is_new = false; |
1503 | $link = $LINKSDB->getLinkFromUrl($url); // Check if URL is not already in database (in this case, we will edit the existing link) | 1503 | // Check if URL is not already in database (in this case, we will edit the existing link) |
1504 | $link = $LINKSDB->getLinkFromUrl((string)$url); | ||
1504 | if (!$link) | 1505 | if (!$link) |
1505 | { | 1506 | { |
1506 | $link_is_new = true; // This is a new link | 1507 | $link_is_new = true; |
1507 | $linkdate = strval(date('Ymd_His')); | 1508 | $linkdate = strval(date('Ymd_His')); |
1508 | $title = (empty($_GET['title']) ? '' : $_GET['title'] ); // Get title if it was provided in URL (by the bookmarklet). | 1509 | // Get title if it was provided in URL (by the bookmarklet). |
1509 | $description = (empty($_GET['description']) ? '' : $_GET['description']); // Get description if it was provided in URL (by the bookmarklet). [Bronco added that] | 1510 | $title = (empty($_GET['title']) ? '' : $_GET['title'] ); |
1510 | $tags = (empty($_GET['tags']) ? '' : $_GET['tags'] ); // Get tags if it was provided in URL | 1511 | // Get description if it was provided in URL (by the bookmarklet). [Bronco added that] |
1511 | $private = (!empty($_GET['private']) && $_GET['private'] === "1" ? 1 : 0); // Get private if it was provided in URL | 1512 | $description = (empty($_GET['description']) ? '' : $_GET['description']); |
1512 | if (($url!='') && parse_url($url,PHP_URL_SCHEME)=='') $url = 'http://'.$url; | 1513 | $tags = (empty($_GET['tags']) ? '' : $_GET['tags'] ); |
1513 | // If this is an HTTP link, we try go get the page to extract the title (otherwise we will to straight to the edit form.) | 1514 | $private = (!empty($_GET['private']) && $_GET['private'] === "1" ? 1 : 0); |
1514 | if (empty($title) && parse_url($url,PHP_URL_SCHEME)=='http') | 1515 | // 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.) |
1515 | { | 1516 | if (empty($title) && strpos($url->getScheme(), 'http') !== false) { |
1516 | list($status,$headers,$data) = getHTTP($url,4); // Short timeout to keep the application responsive. | 1517 | list($status,$headers,$data) = getHTTP($url,4); // Short timeout to keep the application responsive. |
1517 | // FIXME: Decode charset according to specified in either 1) HTTP response headers or 2) <head> in html | 1518 | // FIXME: Decode charset according to specified in either 1) HTTP response headers or 2) <head> in html |
1518 | if (strpos($status,'200 OK')!==false) | 1519 | if (strpos($status,'200 OK')!==false) { |
1519 | { | 1520 | // Look for charset in html header. |
1520 | // Look for charset in html header. | 1521 | preg_match('#<meta .*charset=.*>#Usi', $data, $meta); |
1521 | preg_match('#<meta .*charset=.*>#Usi', $data, $meta); | 1522 | |
1522 | 1523 | // If found, extract encoding. | |
1523 | // If found, extract encoding. | 1524 | if (!empty($meta[0])) { |
1524 | if (!empty($meta[0])) | 1525 | // Get encoding specified in header. |
1525 | { | 1526 | preg_match('#charset="?(.*)"#si', $meta[0], $enc); |
1526 | // Get encoding specified in header. | 1527 | // If charset not found, use utf-8. |
1527 | preg_match('#charset="?(.*)"#si', $meta[0], $enc); | 1528 | $html_charset = (!empty($enc[1])) ? strtolower($enc[1]) : 'utf-8'; |
1528 | // If charset not found, use utf-8. | 1529 | } |
1529 | $html_charset = (!empty($enc[1])) ? strtolower($enc[1]) : 'utf-8'; | 1530 | else { |
1530 | } | 1531 | $html_charset = 'utf-8'; |
1531 | else { $html_charset = 'utf-8'; } | 1532 | } |
1532 | 1533 | ||
1533 | // Extract title | 1534 | // Extract title |
1534 | $title = html_extract_title($data); | 1535 | $title = html_extract_title($data); |
1535 | if (!empty($title)) | 1536 | if (!empty($title)) { |
1536 | { | 1537 | // Re-encode title in utf-8 if necessary. |
1537 | // Re-encode title in utf-8 if necessary. | 1538 | $title = ($html_charset == 'iso-8859-1') ? utf8_encode($title) : $title; |
1538 | $title = ($html_charset == 'iso-8859-1') ? utf8_encode($title) : $title; | 1539 | } |
1539 | } | 1540 | } |
1540 | } | ||
1541 | } | 1541 | } |
1542 | if ($url=='') // In case of empty URL, this is just a text (with a link that points to itself) | 1542 | if ($url == '') { |
1543 | { | 1543 | $url = '?' . smallHash($linkdate); |
1544 | $url='?'.smallHash($linkdate); | 1544 | $title = 'Note: '; |
1545 | $title='Note: '; | ||
1546 | } | 1545 | } |
1547 | $link = array('linkdate'=>$linkdate,'title'=>$title,'url'=>$url,'description'=>$description,'tags'=>$tags,'private'=>$private); | 1546 | $link = array( |
1547 | 'linkdate' => $linkdate, | ||
1548 | 'title' => $title, | ||
1549 | 'url' => (string)$url, | ||
1550 | 'description' => $description, | ||
1551 | 'tags' => $tags, | ||
1552 | 'private' => $private | ||
1553 | ); | ||
1548 | } | 1554 | } |
1549 | 1555 | ||
1550 | $PAGE = new pageBuilder; | 1556 | $PAGE = new pageBuilder; |
diff --git a/tests/UrlTest.php b/tests/UrlTest.php index a39630f1..c848e88e 100644..100755 --- a/tests/UrlTest.php +++ b/tests/UrlTest.php | |||
@@ -151,4 +151,20 @@ class UrlTest extends PHPUnit_Framework_TestCase | |||
151 | $url->cleanup() | 151 | $url->cleanup() |
152 | ); | 152 | ); |
153 | } | 153 | } |
154 | |||
155 | /** | ||
156 | * Test default http scheme. | ||
157 | */ | ||
158 | public function testDefaultScheme() { | ||
159 | $url = new Url(self::$baseUrl); | ||
160 | $this->assertEquals('http', $url->getScheme()); | ||
161 | $url = new Url('domain.tld'); | ||
162 | $this->assertEquals('http', $url->getScheme()); | ||
163 | $url = new Url('ssh://domain.tld'); | ||
164 | $this->assertEquals('ssh', $url->getScheme()); | ||
165 | $url = new Url('ftp://domain.tld'); | ||
166 | $this->assertEquals('ftp', $url->getScheme()); | ||
167 | $url = new Url('git://domain.tld/push?pull=clone#checkout'); | ||
168 | $this->assertEquals('git', $url->getScheme()); | ||
169 | } | ||
154 | } | 170 | } |