From 73f65c8fbadbdd2098448e77b6d3f0464ad8613e Mon Sep 17 00:00:00 2001 From: Bernhard Posselt Date: Tue, 27 Jan 2015 09:29:09 +0100 Subject: update picofeed --- vendor/fguillot/picofeed | 1 + .../picofeed/lib/PicoFeed/Client/Client.php | 588 ------------------ .../lib/PicoFeed/Client/ClientException.php | 16 - .../fguillot/picofeed/lib/PicoFeed/Client/Curl.php | 327 ---------- .../picofeed/lib/PicoFeed/Client/Grabber.php | 414 ------------- .../picofeed/lib/PicoFeed/Client/HttpHeaders.php | 43 -- .../Client/InvalidCertificateException.php | 13 - .../lib/PicoFeed/Client/InvalidUrlException.php | 13 - .../lib/PicoFeed/Client/MaxRedirectException.php | 13 - .../lib/PicoFeed/Client/MaxSizeException.php | 13 - .../picofeed/lib/PicoFeed/Client/Stream.php | 170 ------ .../lib/PicoFeed/Client/TimeoutException.php | 13 - .../fguillot/picofeed/lib/PicoFeed/Client/Url.php | 268 --------- .../picofeed/lib/PicoFeed/Config/Config.php | 94 --- .../picofeed/lib/PicoFeed/Encoding/Encoding.php | 167 ------ .../picofeed/lib/PicoFeed/Filter/Attribute.php | 658 --------------------- .../picofeed/lib/PicoFeed/Filter/Filter.php | 131 ---- .../fguillot/picofeed/lib/PicoFeed/Filter/Html.php | 203 ------- .../fguillot/picofeed/lib/PicoFeed/Filter/Tag.php | 173 ------ .../picofeed/lib/PicoFeed/Logging/Logger.php | 95 --- .../fguillot/picofeed/lib/PicoFeed/Parser/Atom.php | 324 ---------- .../fguillot/picofeed/lib/PicoFeed/Parser/Feed.php | 219 ------- .../fguillot/picofeed/lib/PicoFeed/Parser/Item.php | 231 -------- .../lib/PicoFeed/Parser/MalformedXmlException.php | 13 - .../picofeed/lib/PicoFeed/Parser/Parser.php | 635 -------------------- .../lib/PicoFeed/Parser/ParserException.php | 16 - .../picofeed/lib/PicoFeed/Parser/Rss10.php | 77 --- .../picofeed/lib/PicoFeed/Parser/Rss20.php | 287 --------- .../picofeed/lib/PicoFeed/Parser/Rss91.php | 13 - .../picofeed/lib/PicoFeed/Parser/Rss92.php | 13 - .../picofeed/lib/PicoFeed/Parser/XmlParser.php | 257 -------- .../picofeed/lib/PicoFeed/PicoFeedException.php | 15 - .../picofeed/lib/PicoFeed/Reader/Favicon.php | 208 ------- .../picofeed/lib/PicoFeed/Reader/Reader.php | 211 ------- .../lib/PicoFeed/Reader/ReaderException.php | 16 - .../Reader/SubscriptionNotFoundException.php | 13 - .../Reader/UnsupportedFeedFormatException.php | 13 - .../lib/PicoFeed/Rules/.blog.lemonde.fr.php | 10 - .../lib/PicoFeed/Rules/.blogs.nytimes.com.php | 11 - .../picofeed/lib/PicoFeed/Rules/.igen.fr.php | 9 - .../picofeed/lib/PicoFeed/Rules/.nytimes.com.php | 8 - .../picofeed/lib/PicoFeed/Rules/.phoronix.com.php | 9 - .../picofeed/lib/PicoFeed/Rules/.slate.com.php | 16 - .../lib/PicoFeed/Rules/.theguardian.com.php | 10 - .../picofeed/lib/PicoFeed/Rules/.wikipedia.org.php | 25 - .../picofeed/lib/PicoFeed/Rules/.wired.com.php | 19 - .../picofeed/lib/PicoFeed/Rules/.wsj.com.php | 11 - .../picofeed/lib/PicoFeed/Rules/01net.com.php | 15 - .../picofeed/lib/PicoFeed/Rules/blog.fefe.de.php | 9 - .../picofeed/lib/PicoFeed/Rules/consomac.fr.php | 9 - .../lib/PicoFeed/Rules/degroupnews.com.php | 10 - .../lib/PicoFeed/Rules/distrowatch.com.php | 9 - .../picofeed/lib/PicoFeed/Rules/dozodomo.com.php | 11 - .../lib/PicoFeed/Rules/fastcodesign.com.php | 9 - .../lib/PicoFeed/Rules/fastcoexist.com.php | 9 - .../lib/PicoFeed/Rules/fastcompany.com.php | 9 - .../picofeed/lib/PicoFeed/Rules/ffworld.com.php | 9 - .../picofeed/lib/PicoFeed/Rules/github.com.php | 10 - .../picofeed/lib/PicoFeed/Rules/golem.de.php | 8 - .../picofeed/lib/PicoFeed/Rules/heise.de.php | 7 - .../lib/PicoFeed/Rules/huffingtonpost.com.php | 9 - .../picofeed/lib/PicoFeed/Rules/ing.dk.php | 8 - .../lib/PicoFeed/Rules/journaldugeek.com.php | 10 - .../picofeed/lib/PicoFeed/Rules/kanpai.fr.php | 9 - .../lib/PicoFeed/Rules/karriere.jobfinder.dk.php | 8 - .../picofeed/lib/PicoFeed/Rules/lejapon.fr.php | 14 - .../lib/PicoFeed/Rules/lesjoiesducode.fr.php | 9 - .../picofeed/lib/PicoFeed/Rules/lifehacker.com.php | 14 - .../fguillot/picofeed/lib/PicoFeed/Rules/lists.php | 9 - .../picofeed/lib/PicoFeed/Rules/macg.co.php | 9 - .../picofeed/lib/PicoFeed/Rules/medium.com.php | 9 - .../lib/PicoFeed/Rules/monwindowsphone.com.php | 9 - .../lib/PicoFeed/Rules/openrightsgroup.org.php | 16 - .../picofeed/lib/PicoFeed/Rules/pastebin.com.php | 9 - .../lib/PicoFeed/Rules/plus.google.com.php | 7 - .../lib/PicoFeed/Rules/rue89.feedsportal.com.php | 9 - .../picofeed/lib/PicoFeed/Rules/sitepoint.com.php | 9 - .../lib/PicoFeed/Rules/smallhousebliss.com.php | 17 - .../picofeed/lib/PicoFeed/Rules/spiegel.de.php | 7 - .../picofeed/lib/PicoFeed/Rules/techcrunch.com.php | 13 - .../picofeed/lib/PicoFeed/Rules/treehugger.com.php | 10 - .../picofeed/lib/PicoFeed/Rules/undeadly.org.php | 11 - .../picofeed/lib/PicoFeed/Rules/version2.dk.php | 8 - .../picofeed/lib/PicoFeed/Rules/www.bbc.co.uk.php | 22 - .../picofeed/lib/PicoFeed/Rules/www.bdgest.com.php | 11 - .../lib/PicoFeed/Rules/www.businessweek.com.php | 11 - .../picofeed/lib/PicoFeed/Rules/www.cnn.com.php | 22 - .../lib/PicoFeed/Rules/www.egscomics.com.php | 8 - .../picofeed/lib/PicoFeed/Rules/www.forbes.com.php | 16 - .../lib/PicoFeed/Rules/www.futura-sciences.com.php | 15 - .../picofeed/lib/PicoFeed/Rules/www.lemonde.fr.php | 9 - .../picofeed/lib/PicoFeed/Rules/www.lepoint.fr.php | 16 - .../lib/PicoFeed/Rules/www.mac4ever.com.php | 9 - .../lib/PicoFeed/Rules/www.nextinpact.com.php | 9 - .../picofeed/lib/PicoFeed/Rules/www.npr.org.php | 15 - .../lib/PicoFeed/Rules/www.numerama.com.php | 11 - .../lib/PicoFeed/Rules/www.pcinpact.com.php | 9 - .../lib/PicoFeed/Rules/www.pseudo-sciences.org.php | 12 - .../picofeed/lib/PicoFeed/Rules/www.slate.fr.php | 17 - .../lib/PicoFeed/Rules/www.universfreebox.com.php | 11 - .../picofeed/lib/PicoFeed/Serialization/Export.php | 132 ----- .../picofeed/lib/PicoFeed/Serialization/Import.php | 171 ------ .../picofeed/lib/PicoFeed/Syndication/Atom.php | 220 ------- .../picofeed/lib/PicoFeed/Syndication/Rss20.php | 207 ------- .../picofeed/lib/PicoFeed/Syndication/Writer.php | 104 ---- 105 files changed, 1 insertion(+), 7515 deletions(-) create mode 160000 vendor/fguillot/picofeed delete mode 100644 vendor/fguillot/picofeed/lib/PicoFeed/Client/Client.php delete mode 100644 vendor/fguillot/picofeed/lib/PicoFeed/Client/ClientException.php delete mode 100644 vendor/fguillot/picofeed/lib/PicoFeed/Client/Curl.php delete mode 100644 vendor/fguillot/picofeed/lib/PicoFeed/Client/Grabber.php delete mode 100644 vendor/fguillot/picofeed/lib/PicoFeed/Client/HttpHeaders.php delete mode 100644 vendor/fguillot/picofeed/lib/PicoFeed/Client/InvalidCertificateException.php delete mode 100644 vendor/fguillot/picofeed/lib/PicoFeed/Client/InvalidUrlException.php delete mode 100644 vendor/fguillot/picofeed/lib/PicoFeed/Client/MaxRedirectException.php delete mode 100644 vendor/fguillot/picofeed/lib/PicoFeed/Client/MaxSizeException.php delete mode 100644 vendor/fguillot/picofeed/lib/PicoFeed/Client/Stream.php delete mode 100644 vendor/fguillot/picofeed/lib/PicoFeed/Client/TimeoutException.php delete mode 100644 vendor/fguillot/picofeed/lib/PicoFeed/Client/Url.php delete mode 100644 vendor/fguillot/picofeed/lib/PicoFeed/Config/Config.php delete mode 100644 vendor/fguillot/picofeed/lib/PicoFeed/Encoding/Encoding.php delete mode 100644 vendor/fguillot/picofeed/lib/PicoFeed/Filter/Attribute.php delete mode 100644 vendor/fguillot/picofeed/lib/PicoFeed/Filter/Filter.php delete mode 100644 vendor/fguillot/picofeed/lib/PicoFeed/Filter/Html.php delete mode 100644 vendor/fguillot/picofeed/lib/PicoFeed/Filter/Tag.php delete mode 100644 vendor/fguillot/picofeed/lib/PicoFeed/Logging/Logger.php delete mode 100644 vendor/fguillot/picofeed/lib/PicoFeed/Parser/Atom.php delete mode 100644 vendor/fguillot/picofeed/lib/PicoFeed/Parser/Feed.php delete mode 100644 vendor/fguillot/picofeed/lib/PicoFeed/Parser/Item.php delete mode 100644 vendor/fguillot/picofeed/lib/PicoFeed/Parser/MalformedXmlException.php delete mode 100644 vendor/fguillot/picofeed/lib/PicoFeed/Parser/Parser.php delete mode 100644 vendor/fguillot/picofeed/lib/PicoFeed/Parser/ParserException.php delete mode 100644 vendor/fguillot/picofeed/lib/PicoFeed/Parser/Rss10.php delete mode 100644 vendor/fguillot/picofeed/lib/PicoFeed/Parser/Rss20.php delete mode 100644 vendor/fguillot/picofeed/lib/PicoFeed/Parser/Rss91.php delete mode 100644 vendor/fguillot/picofeed/lib/PicoFeed/Parser/Rss92.php delete mode 100644 vendor/fguillot/picofeed/lib/PicoFeed/Parser/XmlParser.php delete mode 100644 vendor/fguillot/picofeed/lib/PicoFeed/PicoFeedException.php delete mode 100644 vendor/fguillot/picofeed/lib/PicoFeed/Reader/Favicon.php delete mode 100644 vendor/fguillot/picofeed/lib/PicoFeed/Reader/Reader.php delete mode 100644 vendor/fguillot/picofeed/lib/PicoFeed/Reader/ReaderException.php delete mode 100644 vendor/fguillot/picofeed/lib/PicoFeed/Reader/SubscriptionNotFoundException.php delete mode 100644 vendor/fguillot/picofeed/lib/PicoFeed/Reader/UnsupportedFeedFormatException.php delete mode 100644 vendor/fguillot/picofeed/lib/PicoFeed/Rules/.blog.lemonde.fr.php delete mode 100644 vendor/fguillot/picofeed/lib/PicoFeed/Rules/.blogs.nytimes.com.php delete mode 100644 vendor/fguillot/picofeed/lib/PicoFeed/Rules/.igen.fr.php delete mode 100644 vendor/fguillot/picofeed/lib/PicoFeed/Rules/.nytimes.com.php delete mode 100644 vendor/fguillot/picofeed/lib/PicoFeed/Rules/.phoronix.com.php delete mode 100644 vendor/fguillot/picofeed/lib/PicoFeed/Rules/.slate.com.php delete mode 100644 vendor/fguillot/picofeed/lib/PicoFeed/Rules/.theguardian.com.php delete mode 100644 vendor/fguillot/picofeed/lib/PicoFeed/Rules/.wikipedia.org.php delete mode 100644 vendor/fguillot/picofeed/lib/PicoFeed/Rules/.wired.com.php delete mode 100644 vendor/fguillot/picofeed/lib/PicoFeed/Rules/.wsj.com.php delete mode 100644 vendor/fguillot/picofeed/lib/PicoFeed/Rules/01net.com.php delete mode 100644 vendor/fguillot/picofeed/lib/PicoFeed/Rules/blog.fefe.de.php delete mode 100644 vendor/fguillot/picofeed/lib/PicoFeed/Rules/consomac.fr.php delete mode 100644 vendor/fguillot/picofeed/lib/PicoFeed/Rules/degroupnews.com.php delete mode 100644 vendor/fguillot/picofeed/lib/PicoFeed/Rules/distrowatch.com.php delete mode 100644 vendor/fguillot/picofeed/lib/PicoFeed/Rules/dozodomo.com.php delete mode 100644 vendor/fguillot/picofeed/lib/PicoFeed/Rules/fastcodesign.com.php delete mode 100644 vendor/fguillot/picofeed/lib/PicoFeed/Rules/fastcoexist.com.php delete mode 100644 vendor/fguillot/picofeed/lib/PicoFeed/Rules/fastcompany.com.php delete mode 100644 vendor/fguillot/picofeed/lib/PicoFeed/Rules/ffworld.com.php delete mode 100644 vendor/fguillot/picofeed/lib/PicoFeed/Rules/github.com.php delete mode 100644 vendor/fguillot/picofeed/lib/PicoFeed/Rules/golem.de.php delete mode 100644 vendor/fguillot/picofeed/lib/PicoFeed/Rules/heise.de.php delete mode 100644 vendor/fguillot/picofeed/lib/PicoFeed/Rules/huffingtonpost.com.php delete mode 100644 vendor/fguillot/picofeed/lib/PicoFeed/Rules/ing.dk.php delete mode 100644 vendor/fguillot/picofeed/lib/PicoFeed/Rules/journaldugeek.com.php delete mode 100644 vendor/fguillot/picofeed/lib/PicoFeed/Rules/kanpai.fr.php delete mode 100644 vendor/fguillot/picofeed/lib/PicoFeed/Rules/karriere.jobfinder.dk.php delete mode 100644 vendor/fguillot/picofeed/lib/PicoFeed/Rules/lejapon.fr.php delete mode 100644 vendor/fguillot/picofeed/lib/PicoFeed/Rules/lesjoiesducode.fr.php delete mode 100644 vendor/fguillot/picofeed/lib/PicoFeed/Rules/lifehacker.com.php delete mode 100644 vendor/fguillot/picofeed/lib/PicoFeed/Rules/lists.php delete mode 100644 vendor/fguillot/picofeed/lib/PicoFeed/Rules/macg.co.php delete mode 100644 vendor/fguillot/picofeed/lib/PicoFeed/Rules/medium.com.php delete mode 100644 vendor/fguillot/picofeed/lib/PicoFeed/Rules/monwindowsphone.com.php delete mode 100644 vendor/fguillot/picofeed/lib/PicoFeed/Rules/openrightsgroup.org.php delete mode 100644 vendor/fguillot/picofeed/lib/PicoFeed/Rules/pastebin.com.php delete mode 100644 vendor/fguillot/picofeed/lib/PicoFeed/Rules/plus.google.com.php delete mode 100644 vendor/fguillot/picofeed/lib/PicoFeed/Rules/rue89.feedsportal.com.php delete mode 100644 vendor/fguillot/picofeed/lib/PicoFeed/Rules/sitepoint.com.php delete mode 100644 vendor/fguillot/picofeed/lib/PicoFeed/Rules/smallhousebliss.com.php delete mode 100644 vendor/fguillot/picofeed/lib/PicoFeed/Rules/spiegel.de.php delete mode 100644 vendor/fguillot/picofeed/lib/PicoFeed/Rules/techcrunch.com.php delete mode 100644 vendor/fguillot/picofeed/lib/PicoFeed/Rules/treehugger.com.php delete mode 100644 vendor/fguillot/picofeed/lib/PicoFeed/Rules/undeadly.org.php delete mode 100644 vendor/fguillot/picofeed/lib/PicoFeed/Rules/version2.dk.php delete mode 100644 vendor/fguillot/picofeed/lib/PicoFeed/Rules/www.bbc.co.uk.php delete mode 100644 vendor/fguillot/picofeed/lib/PicoFeed/Rules/www.bdgest.com.php delete mode 100644 vendor/fguillot/picofeed/lib/PicoFeed/Rules/www.businessweek.com.php delete mode 100644 vendor/fguillot/picofeed/lib/PicoFeed/Rules/www.cnn.com.php delete mode 100644 vendor/fguillot/picofeed/lib/PicoFeed/Rules/www.egscomics.com.php delete mode 100644 vendor/fguillot/picofeed/lib/PicoFeed/Rules/www.forbes.com.php delete mode 100644 vendor/fguillot/picofeed/lib/PicoFeed/Rules/www.futura-sciences.com.php delete mode 100644 vendor/fguillot/picofeed/lib/PicoFeed/Rules/www.lemonde.fr.php delete mode 100644 vendor/fguillot/picofeed/lib/PicoFeed/Rules/www.lepoint.fr.php delete mode 100644 vendor/fguillot/picofeed/lib/PicoFeed/Rules/www.mac4ever.com.php delete mode 100644 vendor/fguillot/picofeed/lib/PicoFeed/Rules/www.nextinpact.com.php delete mode 100644 vendor/fguillot/picofeed/lib/PicoFeed/Rules/www.npr.org.php delete mode 100644 vendor/fguillot/picofeed/lib/PicoFeed/Rules/www.numerama.com.php delete mode 100644 vendor/fguillot/picofeed/lib/PicoFeed/Rules/www.pcinpact.com.php delete mode 100644 vendor/fguillot/picofeed/lib/PicoFeed/Rules/www.pseudo-sciences.org.php delete mode 100644 vendor/fguillot/picofeed/lib/PicoFeed/Rules/www.slate.fr.php delete mode 100644 vendor/fguillot/picofeed/lib/PicoFeed/Rules/www.universfreebox.com.php delete mode 100644 vendor/fguillot/picofeed/lib/PicoFeed/Serialization/Export.php delete mode 100644 vendor/fguillot/picofeed/lib/PicoFeed/Serialization/Import.php delete mode 100644 vendor/fguillot/picofeed/lib/PicoFeed/Syndication/Atom.php delete mode 100644 vendor/fguillot/picofeed/lib/PicoFeed/Syndication/Rss20.php delete mode 100644 vendor/fguillot/picofeed/lib/PicoFeed/Syndication/Writer.php (limited to 'vendor/fguillot/picofeed/lib/PicoFeed') diff --git a/vendor/fguillot/picofeed b/vendor/fguillot/picofeed new file mode 160000 index 000000000..0a1d0d395 --- /dev/null +++ b/vendor/fguillot/picofeed @@ -0,0 +1 @@ +Subproject commit 0a1d0d3950f7f047dc8fb1d80aa6296e15f306d0 diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Client/Client.php b/vendor/fguillot/picofeed/lib/PicoFeed/Client/Client.php deleted file mode 100644 index 602416e42..000000000 --- a/vendor/fguillot/picofeed/lib/PicoFeed/Client/Client.php +++ /dev/null @@ -1,588 +0,0 @@ -url = $url; - } - - Logger::setMessage(get_called_class().' Fetch URL: '.$this->url); - Logger::setMessage(get_called_class().' Etag provided: '.$this->etag); - Logger::setMessage(get_called_class().' Last-Modified provided: '.$this->last_modified); - - $response = $this->doRequest(); - - $this->handleNotModifiedResponse($response); - $this->handleNotFoundResponse($response); - $this->handleNormalResponse($response); - - return $this; - } - - /** - * Handle not modified response - * - * @access public - * @param array $response Client response - */ - public function handleNotModifiedResponse(array $response) - { - if ($response['status'] == 304) { - $this->is_modified = false; - } - else if ($response['status'] == 200) { - $this->is_modified = $this->hasBeenModified($response, $this->etag, $this->last_modified); - $this->etag = $this->getHeader($response, 'ETag'); - $this->last_modified = $this->getHeader($response, 'Last-Modified'); - } - - if ($this->is_modified === false) { - Logger::setMessage(get_called_class().' Resource not modified'); - } - } - - /** - * Handle not found response - * - * @access public - * @param array $response Client response - */ - public function handleNotFoundResponse(array $response) - { - if ($response['status'] == 404) { - throw new InvalidUrlException('Resource not found'); - } - } - - /** - * Handle normal response - * - * @access public - * @param array $response Client response - */ - public function handleNormalResponse(array $response) - { - if ($response['status'] == 200) { - $this->content = $response['body']; - $this->content_type = $this->findContentType($response); - $this->encoding = $this->findCharset(); - } - } - - /** - * Check if a request has been modified according to the parameters - * - * @access public - * @param array $response - * @param string $etag - * @param string $lastModified - * @return boolean - */ - private function hasBeenModified($response, $etag, $lastModified) - { - $headers = array( - 'Etag' => $etag, - 'Last-Modified' => $lastModified - ); - - // Compare the values for each header that is present - $presentCacheHeaderCount = 0; - foreach ($headers as $key => $value) { - if (isset($response['headers'][$key])) { - if ($response['headers'][$key] !== $value) { - return true; - } - $presentCacheHeaderCount++; - } - } - - // If at least one header is present and the values match, the response - // was not modified - if ($presentCacheHeaderCount > 0) { - return false; - } - - return true; - } - - /** - * Find content type from response headers - * - * @access public - * @param array $response Client response - * @return string - */ - public function findContentType(array $response) - { - return strtolower($this->getHeader($response, 'Content-Type')); - } - - /** - * Find charset from response headers - * - * @access public - * @return string - */ - public function findCharset() - { - $result = explode('charset=', $this->content_type); - return isset($result[1]) ? $result[1] : ''; - } - - /** - * Get header value from a client response - * - * @access public - * @param array $response Client response - * @param string $header Header name - * @return string - */ - public function getHeader(array $response, $header) - { - return isset($response['headers'][$header]) ? $response['headers'][$header] : ''; - } - - /** - * Parse HTTP headers - * - * @access public - * @param array $lines List of headers - * @return array - */ - public function parseHeaders(array $lines) - { - $status = 200; - $headers = array(); - - foreach ($lines as $line) { - - if (strpos($line, 'HTTP') === 0) { - $status = (int) substr($line, 9, 3); - } - else if (strpos($line, ':') !== false) { - - @list($name, $value) = explode(': ', $line); - if ($value) $headers[trim($name)] = trim($value); - } - } - - Logger::setMessage(get_called_class().' HTTP status code: '.$status); - - foreach ($headers as $name => $value) { - Logger::setMessage(get_called_class().' HTTP header: '.$name.' => '.$value); - } - - return array($status, new HttpHeaders($headers)); - } - - /** - * Set the Last-Modified HTTP header - * - * @access public - * @param string $last_modified Header value - * @return \PicoFeed\Client\Client - */ - public function setLastModified($last_modified) - { - $this->last_modified = $last_modified; - return $this; - } - - /** - * Get the value of the Last-Modified HTTP header - * - * @access public - * @return string - */ - public function getLastModified() - { - return $this->last_modified; - } - - /** - * Set the value of the Etag HTTP header - * - * @access public - * @param string $etag Etag HTTP header value - * @return \PicoFeed\Client\Client - */ - public function setEtag($etag) - { - $this->etag = $etag; - return $this; - } - - /** - * Get the Etag HTTP header value - * - * @access public - * @return string - */ - public function getEtag() - { - return $this->etag; - } - - /** - * Get the final url value - * - * @access public - * @return string - */ - public function getUrl() - { - return $this->url; - } - - /** - * Set the url - * - * @access public - * @return string - * @return \PicoFeed\Client\Client - */ - public function setUrl($url) - { - $this->url = $url; - return $this; - } - - /** - * Get the body of the HTTP response - * - * @access public - * @return string - */ - public function getContent() - { - return $this->content; - } - - /** - * Get the content type value from HTTP headers - * - * @access public - * @return string - */ - public function getContentType() - { - return $this->content_type; - } - - /** - * Get the encoding value from HTTP headers - * - * @access public - * @return string - */ - public function getEncoding() - { - return $this->encoding; - } - - /** - * Return true if the remote resource has changed - * - * @access public - * @return bool - */ - public function isModified() - { - return $this->is_modified; - } - - /** - * Set connection timeout - * - * @access public - * @param integer $timeout Connection timeout - * @return \PicoFeed\Client\Client - */ - public function setTimeout($timeout) - { - $this->timeout = $timeout ?: $this->timeout; - return $this; - } - - /** - * Set a custom user agent - * - * @access public - * @param string $user_agent User Agent - * @return \PicoFeed\Client\Client - */ - public function setUserAgent($user_agent) - { - $this->user_agent = $user_agent ?: $this->user_agent; - return $this; - } - - /** - * Set the mximum number of HTTP redirections - * - * @access public - * @param integer $max Maximum - * @return \PicoFeed\Client\Client - */ - public function setMaxRedirections($max) - { - $this->max_redirects = $max ?: $this->max_redirects; - return $this; - } - - /** - * Set the maximum size of the HTTP body - * - * @access public - * @param integer $max Maximum - * @return \PicoFeed\Client\Client - */ - public function setMaxBodySize($max) - { - $this->max_body_size = $max ?: $this->max_body_size; - return $this; - } - - /** - * Set the proxy hostname - * - * @access public - * @param string $hostname Proxy hostname - * @return \PicoFeed\Client\Client - */ - public function setProxyHostname($hostname) - { - $this->proxy_hostname = $hostname ?: $this->proxy_hostname; - return $this; - } - - /** - * Set the proxy port - * - * @access public - * @param integer $port Proxy port - * @return \PicoFeed\Client\Client - */ - public function setProxyPort($port) - { - $this->proxy_port = $port ?: $this->proxy_port; - return $this; - } - - /** - * Set the proxy username - * - * @access public - * @param string $username Proxy username - * @return \PicoFeed\Client\Client - */ - public function setProxyUsername($username) - { - $this->proxy_username = $username ?: $this->proxy_username; - return $this; - } - - /** - * Set the proxy password - * - * @access public - * @param string $password Password - * @return \PicoFeed\Client\Client - */ - public function setProxyPassword($password) - { - $this->proxy_password = $password ?: $this->proxy_password; - return $this; - } - - /** - * Set config object - * - * @access public - * @param \PicoFeed\Config\Config $config Config instance - * @return \PicoFeed\Client\Client - */ - public function setConfig($config) - { - if ($config !== null) { - $this->setTimeout($config->getGrabberTimeout()); - $this->setUserAgent($config->getGrabberUserAgent()); - $this->setMaxRedirections($config->getMaxRedirections()); - $this->setMaxBodySize($config->getMaxBodySize()); - $this->setProxyHostname($config->getProxyHostname()); - $this->setProxyPort($config->getProxyPort()); - $this->setProxyUsername($config->getProxyUsername()); - $this->setProxyPassword($config->getProxyPassword()); - } - - return $this; - } -} diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Client/ClientException.php b/vendor/fguillot/picofeed/lib/PicoFeed/Client/ClientException.php deleted file mode 100644 index 0e27452ed..000000000 --- a/vendor/fguillot/picofeed/lib/PicoFeed/Client/ClientException.php +++ /dev/null @@ -1,16 +0,0 @@ -body_length += $length; - - if ($this->body_length > $this->max_body_size) { - return -1; - } - - $this->body .= $buffer; - - return $length; - } - - /** - * cURL callback to read HTTP headers - * - * @access public - * @param resource $ch cURL handler - * @param string $buffer Header line - * @return integer Length of the buffer - */ - public function readHeaders($ch, $buffer) - { - $length = strlen($buffer); - - if ($buffer === "\r\n") { - $this->headers_counter++; - } - else { - - if (! isset($this->headers[$this->headers_counter])) { - $this->headers[$this->headers_counter] = ''; - } - - $this->headers[$this->headers_counter] .= $buffer; - } - - return $length; - } - - /** - * Prepare HTTP headers - * - * @access private - * @return string[] - */ - private function prepareHeaders() - { - $headers = array( - 'Connection: close', - 'User-Agent: '.$this->user_agent, - ); - - if ($this->etag) { - $headers[] = 'If-None-Match: '.$this->etag; - } - - if ($this->last_modified) { - $headers[] = 'If-Modified-Since: '.$this->last_modified; - } - - return $headers; - } - - /** - * Prepare curl proxy context - * - * @access private - * @return resource $ch - */ - private function prepareProxyContext($ch) - { - if ($this->proxy_hostname) { - - Logger::setMessage(get_called_class().' Proxy: '.$this->proxy_hostname.':'.$this->proxy_port); - - curl_setopt($ch, CURLOPT_PROXYPORT, $this->proxy_port); - curl_setopt($ch, CURLOPT_PROXYTYPE, 'HTTP'); - curl_setopt($ch, CURLOPT_PROXY, $this->proxy_hostname); - - if ($this->proxy_username) { - Logger::setMessage(get_called_class().' Proxy credentials: Yes'); - curl_setopt($ch, CURLOPT_PROXYUSERPWD, $this->proxy_username.':'.$this->proxy_password); - } - else { - Logger::setMessage(get_called_class().' Proxy credentials: No'); - } - } - - return $ch; - } - - /** - * Prepare curl context - * - * @access private - * @return resource - */ - private function prepareContext() - { - $ch = curl_init(); - - curl_setopt($ch, CURLOPT_URL, $this->url); - curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); - curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $this->timeout); - curl_setopt($ch, CURLOPT_HTTPHEADER, $this->prepareHeaders()); - curl_setopt($ch, CURLOPT_FOLLOWLOCATION, ini_get('open_basedir') === ''); - curl_setopt($ch, CURLOPT_MAXREDIRS, $this->max_redirects); - curl_setopt($ch, CURLOPT_ENCODING, ''); - curl_setopt($ch, CURLOPT_WRITEFUNCTION, array($this, 'readBody')); - curl_setopt($ch, CURLOPT_HEADERFUNCTION, array($this, 'readHeaders')); - curl_setopt($ch, CURLOPT_COOKIEJAR, 'php://memory'); - curl_setopt($ch, CURLOPT_COOKIEFILE, 'php://memory'); - - $ch = $this->prepareProxyContext($ch); - - return $ch; - } - - /** - * Execute curl context - * - * @access private - */ - private function executeContext() - { - $ch = $this->prepareContext(); - curl_exec($ch); - - Logger::setMessage(get_called_class().' cURL total time: '.curl_getinfo($ch, CURLINFO_TOTAL_TIME)); - Logger::setMessage(get_called_class().' cURL dns lookup time: '.curl_getinfo($ch, CURLINFO_NAMELOOKUP_TIME)); - Logger::setMessage(get_called_class().' cURL connect time: '.curl_getinfo($ch, CURLINFO_CONNECT_TIME)); - Logger::setMessage(get_called_class().' cURL speed download: '.curl_getinfo($ch, CURLINFO_SPEED_DOWNLOAD)); - Logger::setMessage(get_called_class().' cURL effective url: '.curl_getinfo($ch, CURLINFO_EFFECTIVE_URL)); - - $curl_errno = curl_errno($ch); - - if ($curl_errno) { - Logger::setMessage(get_called_class().' cURL error: '.curl_error($ch)); - curl_close($ch); - - $this->handleError($curl_errno); - } - - // Update the url if there where redirects - $this->url = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL); - - curl_close($ch); - } - - /** - * Do the HTTP request - * - * @access public - * @param bool $follow_location Flag used when there is an open_basedir restriction - * @return array HTTP response ['body' => ..., 'status' => ..., 'headers' => ...] - */ - public function doRequest($follow_location = true) - { - $this->executeContext(); - - list($status, $headers) = $this->parseHeaders(explode("\r\n", $this->headers[$this->headers_counter - 1])); - - // When restricted with open_basedir - if ($this->needToHandleRedirection($follow_location, $status)) { - return $this->handleRedirection($headers['Location']); - } - - return array( - 'status' => $status, - 'body' => $this->body, - 'headers' => $headers - ); - } - - /** - * Check if the redirection have to be handled manually - * - * @access private - * @param boolean $follow_location Flag - * @param integer $status HTTP status code - * @return boolean - */ - private function needToHandleRedirection($follow_location, $status) - { - return $follow_location && ini_get('open_basedir') !== '' && ($status == 301 || $status == 302); - } - - /** - * Handle manually redirections when there is an open base dir restriction - * - * @access private - * @param string $location Redirected URL - * @return array - */ - private function handleRedirection($location) - { - $nb_redirects = 0; - $result = array(); - $this->url = $location; - $this->body = ''; - $this->body_length = 0; - $this->headers = array(); - $this->headers_counter = 0; - - while (true) { - - $nb_redirects++; - - if ($nb_redirects >= $this->max_redirects) { - throw new MaxRedirectException('Maximum number of redirections reached'); - } - - $result = $this->doRequest(false); - - if ($result['status'] == 301 || $result['status'] == 302) { - $this->url = $result['headers']['Location']; - $this->body = ''; - $this->body_length = 0; - $this->headers = array(); - $this->headers_counter = 0; - } - else { - break; - } - } - - return $result; - } - - /** - * Handle cURL errors (throw individual exceptions) - * - * We don't use constants because they are not necessary always available - * (depends of the version of libcurl linked to php) - * - * @see http://curl.haxx.se/libcurl/c/libcurl-errors.html - * @access private - * @param integer $errno cURL error code - */ - private function handleError($errno) - { - switch ($errno) { - case 78: // CURLE_REMOTE_FILE_NOT_FOUND - throw new InvalidUrlException('Resource not found'); - case 6: // CURLE_COULDNT_RESOLVE_HOST - throw new InvalidUrlException('Unable to resolve hostname'); - case 7: // CURLE_COULDNT_CONNECT - throw new InvalidUrlException('Unable to connect to the remote host'); - case 28: // CURLE_OPERATION_TIMEDOUT - throw new TimeoutException('Operation timeout'); - case 35: // CURLE_SSL_CONNECT_ERROR - case 51: // CURLE_PEER_FAILED_VERIFICATION - case 58: // CURLE_SSL_CERTPROBLEM - case 60: // CURLE_SSL_CACERT - case 59: // CURLE_SSL_CIPHER - case 64: // CURLE_USE_SSL_FAILED - case 66: // CURLE_SSL_ENGINE_INITFAILED - case 77: // CURLE_SSL_CACERT_BADFILE - case 83: // CURLE_SSL_ISSUER_ERROR - throw new InvalidCertificateException('Invalid SSL certificate'); - case 47: // CURLE_TOO_MANY_REDIRECTS - throw new MaxRedirectException('Maximum number of redirections reached'); - case 63: // CURLE_FILESIZE_EXCEEDED - throw new MaxSizeException('Maximum response size exceeded'); - default: - throw new InvalidUrlException('Unable to fetch the URL'); - } - } -} diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Client/Grabber.php b/vendor/fguillot/picofeed/lib/PicoFeed/Client/Grabber.php deleted file mode 100644 index 1bca05664..000000000 --- a/vendor/fguillot/picofeed/lib/PicoFeed/Client/Grabber.php +++ /dev/null @@ -1,414 +0,0 @@ -url = $url; - $this->html = $html; - $this->encoding = $encoding; - } - - /** - * Set config object - * - * @access public - * @param \PicoFeed\Config\Config $config Config instance - * @return Grabber - */ - public function setConfig($config) - { - $this->config = $config; - return $this; - } - - /** - * Get relevant content - * - * @access public - * @return string - */ - public function getContent() - { - return $this->content; - } - - /** - * Get raw content (unfiltered) - * - * @access public - * @return string - */ - public function getRawContent() - { - return $this->html; - } - - /** - * Get filtered relevant content - * - * @access public - * @return string - */ - public function getFilteredContent() - { - $filter = Filter::html($this->content, $this->url); - $filter->setConfig($this->config); - return $filter->execute(); - } - - /** - * Parse the HTML content - * - * @access public - * @return bool - */ - public function parse() - { - if ($this->html) { - - Logger::setMessage(get_called_class().' Fix encoding'); - Logger::setMessage(get_called_class().': HTTP Encoding "'.$this->encoding.'"'); - - $this->html = Encoding::convert($this->html, $this->encoding); - $this->html = Filter::stripHeadTags($this->html); - - Logger::setMessage(get_called_class().' Content length: '.strlen($this->html).' bytes'); - $rules = $this->getRules(); - - if (is_array($rules)) { - Logger::setMessage(get_called_class().' Parse content with rules'); - $this->parseContentWithRules($rules); - } - else { - Logger::setMessage(get_called_class().' Parse content with candidates'); - $this->parseContentWithCandidates(); - } - } - else { - Logger::setMessage(get_called_class().' No content fetched'); - } - - Logger::setMessage(get_called_class().' Content length: '.strlen($this->content).' bytes'); - Logger::setMessage(get_called_class().' Grabber done'); - - return $this->content !== ''; - } - - /** - * Download the HTML content - * - * @access public - * @return HTML content - */ - public function download() - { - $client = Client::getInstance(); - $client->setConfig($this->config); - $client->execute($this->url); - - $this->url = $client->getUrl(); - $this->html = $client->getContent(); - $this->encoding = $client->getEncoding(); - - return $this->html; - } - - /** - * Try to find a predefined rule - * - * @access public - * @return mixed - */ - public function getRules() - { - $hostname = parse_url($this->url, PHP_URL_HOST); - - if ($hostname === false) { - return false; - } - - $files = array($hostname); - - if (substr($hostname, 0, 4) == 'www.') { - $files[] = substr($hostname, 4); - } - - if (($pos = strpos($hostname, '.')) !== false) { - $files[] = substr($hostname, $pos); - $files[] = substr($hostname, $pos + 1); - $files[] = substr($hostname, 0, $pos); - } - - foreach ($files as $file) { - - $filename = __DIR__.'/../Rules/'.$file.'.php'; - - if (file_exists($filename)) { - Logger::setMessage(get_called_class().' Load rule: '.$file); - return include $filename; - } - } - - return false; - } - - /** - * Get the relevant content with predefined rules - * - * @access public - * @param array $rules Rules - */ - public function parseContentWithRules(array $rules) - { - // Logger::setMessage($this->html); - $dom = XmlParser::getHtmlDocument(''.$this->html); - $xpath = new DOMXPath($dom); - - if (isset($rules['strip']) && is_array($rules['strip'])) { - - foreach ($rules['strip'] as $pattern) { - - $nodes = $xpath->query($pattern); - - if ($nodes !== false && $nodes->length > 0) { - foreach ($nodes as $node) { - $node->parentNode->removeChild($node); - } - } - } - } - - if (isset($rules['body']) && is_array($rules['body'])) { - - foreach ($rules['body'] as $pattern) { - - $nodes = $xpath->query($pattern); - - if ($nodes !== false && $nodes->length > 0) { - foreach ($nodes as $node) { - $this->content .= $dom->saveXML($node); - } - } - } - } - } - - /** - * Get the relevant content with the list of potential attributes - * - * @access public - */ - public function parseContentWithCandidates() - { - $dom = XmlParser::getHtmlDocument(''.$this->html); - $xpath = new DOMXPath($dom); - - // Try to lookup in each tag - foreach ($this->candidatesAttributes as $candidate) { - - Logger::setMessage(get_called_class().' Try this candidate: "'.$candidate.'"'); - - $nodes = $xpath->query('//*[(contains(@class, "'.$candidate.'") or @id="'.$candidate.'") and not (contains(@class, "nav") or contains(@class, "page"))]'); - - if ($nodes !== false && $nodes->length > 0) { - $this->content = $dom->saveXML($nodes->item(0)); - Logger::setMessage(get_called_class().' Find candidate "'.$candidate.'" ('.strlen($this->content).' bytes)'); - break; - } - } - - // Try to fetch
- if (! $this->content) { - - $nodes = $xpath->query('//article'); - - if ($nodes !== false && $nodes->length > 0) { - $this->content = $dom->saveXML($nodes->item(0)); - Logger::setMessage(get_called_class().' Find
tag ('.strlen($this->content).' bytes)'); - } - } - - if (strlen($this->content) < 50) { - Logger::setMessage(get_called_class().' No enought content fetched, get the full body'); - $this->content = $dom->saveXML($dom->firstChild); - } - - Logger::setMessage(get_called_class().' Strip garbage'); - $this->stripGarbage(); - } - - /** - * Strip useless tags - * - * @access public - */ - public function stripGarbage() - { - $dom = XmlParser::getDomDocument($this->content); - - if ($dom !== false) { - - $xpath = new DOMXPath($dom); - - foreach ($this->stripTags as $tag) { - - $nodes = $xpath->query('//'.$tag); - - if ($nodes !== false && $nodes->length > 0) { - Logger::setMessage(get_called_class().' Strip tag: "'.$tag.'"'); - foreach ($nodes as $node) { - $node->parentNode->removeChild($node); - } - } - } - - foreach ($this->stripAttributes as $attribute) { - - $nodes = $xpath->query('//*[contains(@class, "'.$attribute.'") or contains(@id, "'.$attribute.'")]'); - - if ($nodes !== false && $nodes->length > 0) { - Logger::setMessage(get_called_class().' Strip attribute: "'.$attribute.'"'); - foreach ($nodes as $node) { - $node->parentNode->removeChild($node); - } - } - } - - $this->content = $dom->saveXML($dom->documentElement); - } - } -} diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Client/HttpHeaders.php b/vendor/fguillot/picofeed/lib/PicoFeed/Client/HttpHeaders.php deleted file mode 100644 index 4453a7871..000000000 --- a/vendor/fguillot/picofeed/lib/PicoFeed/Client/HttpHeaders.php +++ /dev/null @@ -1,43 +0,0 @@ - $value) { - $this->headers[strtolower($key)] = $value; - } - } - - public function offsetGet($offset) - { - return $this->headers[strtolower($offset)]; - } - - public function offsetSet($offset, $value) - { - $this->headers[strtolower($offset)] = $value; - } - - public function offsetExists($offset) - { - return isset($this->headers[strtolower($offset)]); - } - - public function offsetUnset($offset) - { - unset($this->headers[strtolower($offset)]); - } -} diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Client/InvalidCertificateException.php b/vendor/fguillot/picofeed/lib/PicoFeed/Client/InvalidCertificateException.php deleted file mode 100644 index ece3f303f..000000000 --- a/vendor/fguillot/picofeed/lib/PicoFeed/Client/InvalidCertificateException.php +++ /dev/null @@ -1,13 +0,0 @@ -user_agent, - ); - - if (function_exists('gzdecode')) { - $headers[] = 'Accept-Encoding: gzip'; - } - - if ($this->etag) { - $headers[] = 'If-None-Match: '.$this->etag; - } - - if ($this->last_modified) { - $headers[] = 'If-Modified-Since: '.$this->last_modified; - } - - if ($this->proxy_username) { - $headers[] = 'Proxy-Authorization: Basic '.base64_encode($this->proxy_username.':'.$this->proxy_password); - } - - return $headers; - } - - /** - * Prepare stream context - * - * @access private - * @return array - */ - private function prepareContext() - { - $context = array( - 'http' => array( - 'method' => 'GET', - 'protocol_version' => 1.1, - 'timeout' => $this->timeout, - 'max_redirects' => $this->max_redirects, - ) - ); - - if ($this->proxy_hostname) { - - Logger::setMessage(get_called_class().' Proxy: '.$this->proxy_hostname.':'.$this->proxy_port); - - $context['http']['proxy'] = 'tcp://'.$this->proxy_hostname.':'.$this->proxy_port; - $context['http']['request_fulluri'] = true; - - if ($this->proxy_username) { - Logger::setMessage(get_called_class().' Proxy credentials: Yes'); - } - else { - Logger::setMessage(get_called_class().' Proxy credentials: No'); - } - } - - $context['http']['header'] = implode("\r\n", $this->prepareHeaders()); - - return $context; - } - - /** - * Do the HTTP request - * - * @access public - * @return array HTTP response ['body' => ..., 'status' => ..., 'headers' => ...] - */ - public function doRequest() - { - // Create context - $context = stream_context_create($this->prepareContext()); - - // Make HTTP request - $stream = @fopen($this->url, 'r', false, $context); - if (! is_resource($stream)) { - throw new InvalidUrlException('Unable to establish a connection'); - } - - // Get the entire body until the max size - $body = stream_get_contents($stream, $this->max_body_size + 1); - - // If the body size is too large abort everything - if (strlen($body) > $this->max_body_size) { - throw new MaxSizeException('Content size too large'); - } - - // Get HTTP headers response - $metadata = stream_get_meta_data($stream); - - if ($metadata['timed_out']) { - throw new TimeoutException('Operation timeout'); - } - - list($status, $headers) = $this->parseHeaders($metadata['wrapper_data']); - - fclose($stream); - - return array( - 'status' => $status, - 'body' => $this->decodeBody($body, $headers), - 'headers' => $headers - ); - } - - /** - * Decode body response according to the HTTP headers - * - * @access public - * @param string $body Raw body - * @param HttpHeaders $headers HTTP headers - * @return string - */ - public function decodeBody($body, HttpHeaders $headers) - { - if (isset($headers['Transfer-Encoding']) && $headers['Transfer-Encoding'] === 'chunked') { - $body = $this->decodeChunked($body); - } - - if (isset($headers['Content-Encoding']) && $headers['Content-Encoding'] === 'gzip') { - $body = @gzdecode($body); - } - - return $body; - } - - /** - * Decode a chunked body - * - * @access public - * @param string $str Raw body - * @return string Decoded body - */ - public function decodeChunked($str) - { - for ($result = ''; ! empty($str); $str = trim($str)) { - - // Get the chunk length - $pos = strpos($str, "\r\n"); - $len = hexdec(substr($str, 0, $pos)); - - // Append the chunk to the result - $result .= substr($str, $pos + 2, $len); - $str = substr($str, $pos + 2 + $len); - } - - return $result; - } -} diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Client/TimeoutException.php b/vendor/fguillot/picofeed/lib/PicoFeed/Client/TimeoutException.php deleted file mode 100644 index 6ba5cbee2..000000000 --- a/vendor/fguillot/picofeed/lib/PicoFeed/Client/TimeoutException.php +++ /dev/null @@ -1,13 +0,0 @@ -url = $url; - $this->components = parse_url($url) ?: array(); - - // Issue with PHP < 5.4.7 and protocol relative url - if (version_compare(PHP_VERSION, '5.4.7', '<') && $this->isProtocolRelative()) { - $pos = strpos($this->components['path'], '/', 2); - - if ($pos === false) { - $pos = strlen($this->components['path']); - } - - $this->components['host'] = substr($this->components['path'], 2, $pos - 2); - $this->components['path'] = substr($this->components['path'], $pos); - } - } - - /** - * Shortcut method to get an absolute url from relative url - * - * @static - * @access public - * @param string $item_url Unknown url (can be relative or not) - * @param mixed $website_url Website url - * @return string - */ - public static function resolve($item_url, $website_url) - { - $link = new Url($item_url); - $website = is_string($website_url) ? new Url($website_url) : $website_url; - - if ($link->isRelativeUrl()) { - - if ($link->isRelativePath()) { - return $link->getAbsoluteUrl($website->getAbsoluteUrl()); - } - - return $link->getAbsoluteUrl($website->getBaseUrl()); - } - else if ($link->isProtocolRelative()) { - $link->setScheme($website->getScheme()); - } - - return $link->getAbsoluteUrl(); - } - - /** - * Shortcut method to get a base url - * - * @static - * @access public - * @param string $url - * @return string - */ - public static function base($url) - { - $link = new Url($url); - return $link->getBaseUrl(); - } - - /** - * Get the base URL - * - * @access public - * @param string $suffix Add a suffix to the url - * @return string - */ - public function getBaseUrl($suffix = '') - { - return $this->hasHost() ? $this->getScheme('://').$this->getHost().$this->getPort(':').$suffix : ''; - } - - /** - * Get the absolute URL - * - * @access public - * @param string $base_url Use this url as base url - * @return string - */ - public function getAbsoluteUrl($base_url = '') - { - if ($base_url) { - $base = new Url($base_url); - $url = $base->getAbsoluteUrl().substr($this->getFullPath(), 1); - } - else { - $url = $this->hasHost() ? $this->getBaseUrl().$this->getFullPath() : ''; - } - - return $url; - } - - /** - * Return true if the url is relative - * - * @access public - * @return boolean - */ - public function isRelativeUrl() - { - return ! $this->hasScheme() && ! $this->isProtocolRelative(); - } - - /** - * Return true if the path is relative - * - * @access public - * @return boolean - */ - public function isRelativePath() - { - $path = $this->getPath(); - return empty($path) || $path{0} !== '/'; - } - - /** - * Get the path - * - * @access public - * @return string - */ - public function getPath() - { - return empty($this->components['path']) ? '' : $this->components['path']; - } - - /** - * Get the full path (path + querystring + fragment) - * - * @access public - * @return string - */ - public function getFullPath() - { - $path = $this->isRelativePath() ? '/' : ''; - $path .= $this->getPath(); - $path .= empty($this->components['query']) ? '' : '?'.$this->components['query']; - $path .= empty($this->components['fragment']) ? '' : '#'.$this->components['fragment']; - - return $path; - } - - /** - * Get the hostname - * - * @access public - * @return string - */ - public function getHost() - { - return empty($this->components['host']) ? '' : $this->components['host']; - } - - /** - * Return true if the url has a hostname - * - * @access public - * @return boole