Fixes #325 - Shaarli does not recognize saved links
PHP doesn't seem to autoconvert objects to strings when they're use as array indexes.
Fixes regression introduced in d9d776af19
This commit is contained in:
parent
d7efade5d6
commit
9e1724f192
3 changed files with 73 additions and 35 deletions
16
application/Url.php
Normal file → Executable file
16
application/Url.php
Normal file → Executable file
|
@ -81,6 +81,10 @@ class Url
|
||||||
public function __construct($url)
|
public function __construct($url)
|
||||||
{
|
{
|
||||||
$this->parts = parse_url($url);
|
$this->parts = parse_url($url);
|
||||||
|
|
||||||
|
if (!empty($url) && empty($this->parts['scheme'])) {
|
||||||
|
$this->parts['scheme'] = 'http';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -147,4 +151,16 @@ public function cleanup()
|
||||||
$this->cleanupFragment();
|
$this->cleanupFragment();
|
||||||
return $this->__toString();
|
return $this->__toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get URL scheme.
|
||||||
|
*
|
||||||
|
* @return string the URL scheme or false if none is provided.
|
||||||
|
*/
|
||||||
|
public function getScheme() {
|
||||||
|
if (!isset($this->parts['scheme'])) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return $this->parts['scheme'];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
48
index.php
48
index.php
|
@ -1485,51 +1485,57 @@ function renderPage()
|
||||||
$url->cleanup();
|
$url->cleanup();
|
||||||
|
|
||||||
$link_is_new = false;
|
$link_is_new = false;
|
||||||
$link = $LINKSDB->getLinkFromUrl($url); // Check if URL is not already in database (in this case, we will edit the existing link)
|
// Check if URL is not already in database (in this case, we will edit the existing link)
|
||||||
|
$link = $LINKSDB->getLinkFromUrl((string)$url);
|
||||||
if (!$link)
|
if (!$link)
|
||||||
{
|
{
|
||||||
$link_is_new = true; // This is a new link
|
$link_is_new = true;
|
||||||
$linkdate = strval(date('Ymd_His'));
|
$linkdate = strval(date('Ymd_His'));
|
||||||
$title = (empty($_GET['title']) ? '' : $_GET['title'] ); // Get title if it was provided in URL (by the bookmarklet).
|
// Get title if it was provided in URL (by the bookmarklet).
|
||||||
$description = (empty($_GET['description']) ? '' : $_GET['description']); // Get description if it was provided in URL (by the bookmarklet). [Bronco added that]
|
$title = (empty($_GET['title']) ? '' : $_GET['title'] );
|
||||||
$tags = (empty($_GET['tags']) ? '' : $_GET['tags'] ); // Get tags if it was provided in URL
|
// Get description if it was provided in URL (by the bookmarklet). [Bronco added that]
|
||||||
$private = (!empty($_GET['private']) && $_GET['private'] === "1" ? 1 : 0); // Get private if it was provided in URL
|
$description = (empty($_GET['description']) ? '' : $_GET['description']);
|
||||||
if (($url!='') && parse_url($url,PHP_URL_SCHEME)=='') $url = 'http://'.$url;
|
$tags = (empty($_GET['tags']) ? '' : $_GET['tags'] );
|
||||||
|
$private = (!empty($_GET['private']) && $_GET['private'] === "1" ? 1 : 0);
|
||||||
// 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.)
|
// 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.)
|
||||||
if (empty($title) && parse_url($url,PHP_URL_SCHEME)=='http')
|
if (empty($title) && $url->getScheme() == 'http') {
|
||||||
{
|
|
||||||
list($status,$headers,$data) = getHTTP($url,4); // Short timeout to keep the application responsive.
|
list($status,$headers,$data) = getHTTP($url,4); // Short timeout to keep the application responsive.
|
||||||
// FIXME: Decode charset according to specified in either 1) HTTP response headers or 2) <head> in html
|
// FIXME: Decode charset according to specified in either 1) HTTP response headers or 2) <head> in html
|
||||||
if (strpos($status,'200 OK')!==false)
|
if (strpos($status,'200 OK')!==false) {
|
||||||
{
|
|
||||||
// Look for charset in html header.
|
// Look for charset in html header.
|
||||||
preg_match('#<meta .*charset=.*>#Usi', $data, $meta);
|
preg_match('#<meta .*charset=.*>#Usi', $data, $meta);
|
||||||
|
|
||||||
// If found, extract encoding.
|
// If found, extract encoding.
|
||||||
if (!empty($meta[0]))
|
if (!empty($meta[0])) {
|
||||||
{
|
|
||||||
// Get encoding specified in header.
|
// Get encoding specified in header.
|
||||||
preg_match('#charset="?(.*)"#si', $meta[0], $enc);
|
preg_match('#charset="?(.*)"#si', $meta[0], $enc);
|
||||||
// If charset not found, use utf-8.
|
// If charset not found, use utf-8.
|
||||||
$html_charset = (!empty($enc[1])) ? strtolower($enc[1]) : 'utf-8';
|
$html_charset = (!empty($enc[1])) ? strtolower($enc[1]) : 'utf-8';
|
||||||
}
|
}
|
||||||
else { $html_charset = 'utf-8'; }
|
else {
|
||||||
|
$html_charset = 'utf-8';
|
||||||
|
}
|
||||||
|
|
||||||
// Extract title
|
// Extract title
|
||||||
$title = html_extract_title($data);
|
$title = html_extract_title($data);
|
||||||
if (!empty($title))
|
if (!empty($title)) {
|
||||||
{
|
|
||||||
// Re-encode title in utf-8 if necessary.
|
// Re-encode title in utf-8 if necessary.
|
||||||
$title = ($html_charset == 'iso-8859-1') ? utf8_encode($title) : $title;
|
$title = ($html_charset == 'iso-8859-1') ? utf8_encode($title) : $title;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ($url=='') // In case of empty URL, this is just a text (with a link that points to itself)
|
if ($url == '') {
|
||||||
{
|
$url = '?' . smallHash($linkdate);
|
||||||
$url='?'.smallHash($linkdate);
|
$title = 'Note: ';
|
||||||
$title='Note: ';
|
|
||||||
}
|
}
|
||||||
$link = array('linkdate'=>$linkdate,'title'=>$title,'url'=>$url,'description'=>$description,'tags'=>$tags,'private'=>$private);
|
$link = array(
|
||||||
|
'linkdate' => $linkdate,
|
||||||
|
'title' => $title,
|
||||||
|
'url' => (string)$url,
|
||||||
|
'description' => $description,
|
||||||
|
'tags' => $tags,
|
||||||
|
'private' => $private
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
$PAGE = new pageBuilder;
|
$PAGE = new pageBuilder;
|
||||||
|
|
16
tests/UrlTest.php
Normal file → Executable file
16
tests/UrlTest.php
Normal file → Executable file
|
@ -151,4 +151,20 @@ public function testCleanupMixedContent()
|
||||||
$url->cleanup()
|
$url->cleanup()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test default http scheme.
|
||||||
|
*/
|
||||||
|
public function testDefaultScheme() {
|
||||||
|
$url = new Url(self::$baseUrl);
|
||||||
|
$this->assertEquals('http', $url->getScheme());
|
||||||
|
$url = new Url('domain.tld');
|
||||||
|
$this->assertEquals('http', $url->getScheme());
|
||||||
|
$url = new Url('ssh://domain.tld');
|
||||||
|
$this->assertEquals('ssh', $url->getScheme());
|
||||||
|
$url = new Url('ftp://domain.tld');
|
||||||
|
$this->assertEquals('ftp', $url->getScheme());
|
||||||
|
$url = new Url('git://domain.tld/push?pull=clone#checkout');
|
||||||
|
$this->assertEquals('git', $url->getScheme());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue