Add support for Expires and Cache-Control headers
This commit is contained in:
parent
2a9fd5fb62
commit
fe614579ac
@ -13,6 +13,7 @@ Version 1.2.0 (unreleased)
|
|||||||
* Add support for Wallabag service
|
* Add support for Wallabag service
|
||||||
* Show last parsing error message in user interface
|
* Show last parsing error message in user interface
|
||||||
* Disable automatically a feed after too many failures
|
* Disable automatically a feed after too many failures
|
||||||
|
* Add support for Expires and Cache-Control headers (HTTP cache)
|
||||||
* Add unit tests
|
* Add unit tests
|
||||||
|
|
||||||
Migration procedure from 1.1.x to 1.2.0:
|
Migration procedure from 1.1.x to 1.2.0:
|
||||||
|
@ -71,6 +71,7 @@ function create_feed($user_id, $url, $download_content = false, $rtl = false, $c
|
|||||||
$feed,
|
$feed,
|
||||||
$resource->getEtag(),
|
$resource->getEtag(),
|
||||||
$resource->getLastModified(),
|
$resource->getLastModified(),
|
||||||
|
$resource->getExpiration()->getTimestamp(),
|
||||||
$rtl,
|
$rtl,
|
||||||
$download_content,
|
$download_content,
|
||||||
$cloak_referrer
|
$cloak_referrer
|
||||||
@ -120,6 +121,7 @@ function update_feed($user_id, $feed_id)
|
|||||||
'etag' => $resource->getEtag(),
|
'etag' => $resource->getEtag(),
|
||||||
'last_modified' => $resource->getLastModified(),
|
'last_modified' => $resource->getLastModified(),
|
||||||
'last_checked' => time(),
|
'last_checked' => time(),
|
||||||
|
'expiration' => $resource->getExpiration()->getTimestamp(),
|
||||||
'parsing_error' => 0,
|
'parsing_error' => 0,
|
||||||
'parsing_error_message' => '',
|
'parsing_error_message' => '',
|
||||||
));
|
));
|
||||||
@ -135,7 +137,7 @@ function update_feed($user_id, $feed_id)
|
|||||||
|
|
||||||
function update_feeds($user_id, $limit = null)
|
function update_feeds($user_id, $limit = null)
|
||||||
{
|
{
|
||||||
foreach (Model\Feed\get_feed_ids($user_id, $limit) as $feed_id) {
|
foreach (Model\Feed\get_feed_ids_to_refresh($user_id, $limit) as $feed_id) {
|
||||||
update_feed($user_id, $feed_id);
|
update_feed($user_id, $feed_id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -6,13 +6,14 @@ use Miniflux\Model\Favicon;
|
|||||||
use Miniflux\Model\Item;
|
use Miniflux\Model\Item;
|
||||||
use Miniflux\Model\Group;
|
use Miniflux\Model\Group;
|
||||||
use PicoDb\Database;
|
use PicoDb\Database;
|
||||||
|
use PicoDb\SQLException;
|
||||||
use PicoFeed\Parser\Feed;
|
use PicoFeed\Parser\Feed;
|
||||||
|
|
||||||
const STATUS_ACTIVE = 1;
|
const STATUS_ACTIVE = 1;
|
||||||
const STATUS_INACTIVE = 0;
|
const STATUS_INACTIVE = 0;
|
||||||
const TABLE = 'feeds';
|
const TABLE = 'feeds';
|
||||||
|
|
||||||
function create($user_id, Feed $feed, $etag, $last_modified, $rtl = false, $scraper = false, $cloak_referrer = false)
|
function create($user_id, Feed $feed, $etag, $last_modified, $expiration = 0, $rtl = false, $scraper = false, $cloak_referrer = false)
|
||||||
{
|
{
|
||||||
$db = Database::getInstance('db');
|
$db = Database::getInstance('db');
|
||||||
|
|
||||||
@ -32,6 +33,7 @@ function create($user_id, Feed $feed, $etag, $last_modified, $rtl = false, $scra
|
|||||||
'etag' => $etag,
|
'etag' => $etag,
|
||||||
'last_modified' => $last_modified,
|
'last_modified' => $last_modified,
|
||||||
'last_checked' => time(),
|
'last_checked' => time(),
|
||||||
|
'expiration' => $expiration,
|
||||||
'cloak_referrer' => $cloak_referrer ? 1 : 0,
|
'cloak_referrer' => $cloak_referrer ? 1 : 0,
|
||||||
));
|
));
|
||||||
|
|
||||||
@ -85,12 +87,17 @@ function get_feeds_with_items_count($user_id)
|
|||||||
return $feeds;
|
return $feeds;
|
||||||
}
|
}
|
||||||
|
|
||||||
function get_feed_ids($user_id, $limit = null)
|
function get_feed_ids_to_refresh($user_id, $limit = null, $expiration = 0)
|
||||||
{
|
{
|
||||||
|
if ($expiration === 0) {
|
||||||
|
$expiration = time();
|
||||||
|
}
|
||||||
|
|
||||||
$query = Database::getInstance('db')
|
$query = Database::getInstance('db')
|
||||||
->table(TABLE)
|
->table(TABLE)
|
||||||
->eq('user_id', $user_id)
|
->eq('user_id', $user_id)
|
||||||
->eq('enabled', STATUS_ACTIVE)
|
->eq('enabled', STATUS_ACTIVE)
|
||||||
|
->lte('expiration', $expiration)
|
||||||
->asc('last_checked')
|
->asc('last_checked')
|
||||||
->asc('id');
|
->asc('id');
|
||||||
|
|
||||||
@ -113,29 +120,33 @@ function get_feed($user_id, $feed_id)
|
|||||||
function update_feed($user_id, $feed_id, array $values)
|
function update_feed($user_id, $feed_id, array $values)
|
||||||
{
|
{
|
||||||
$db = Database::getInstance('db');
|
$db = Database::getInstance('db');
|
||||||
$db->startTransaction();
|
|
||||||
|
|
||||||
$feed = $values;
|
try {
|
||||||
unset($feed['id']);
|
$db->startTransaction();
|
||||||
unset($feed['group_name']);
|
|
||||||
unset($feed['feed_group_ids']);
|
|
||||||
|
|
||||||
$result = Database::getInstance('db')
|
$feed = $values;
|
||||||
->table('feeds')
|
unset($feed['id']);
|
||||||
->eq('user_id', $user_id)
|
unset($feed['group_name']);
|
||||||
->eq('id', $feed_id)
|
unset($feed['feed_group_ids']);
|
||||||
->save($feed);
|
|
||||||
|
|
||||||
if ($result) {
|
$result = Database::getInstance('db')
|
||||||
if (isset($values['feed_group_ids']) && isset($values['group_name']) &&
|
->table('feeds')
|
||||||
! Group\update_feed_groups($user_id, $values['id'], $values['feed_group_ids'], $values['group_name'])) {
|
->eq('user_id', $user_id)
|
||||||
$db->cancelTransaction();
|
->eq('id', $feed_id)
|
||||||
return false;
|
->update($feed);
|
||||||
|
|
||||||
|
if ($result) {
|
||||||
|
if (isset($values['feed_group_ids']) && isset($values['group_name']) &&
|
||||||
|
! Group\update_feed_groups($user_id, $values['id'], $values['feed_group_ids'], $values['group_name'])) {
|
||||||
|
$db->cancelTransaction();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$db->closeTransaction();
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
$db->closeTransaction();
|
} catch (SQLException $e) {}
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
$db->cancelTransaction();
|
$db->cancelTransaction();
|
||||||
return false;
|
return false;
|
||||||
|
@ -5,7 +5,12 @@ namespace Miniflux\Schema;
|
|||||||
use PDO;
|
use PDO;
|
||||||
use Miniflux\Helper;
|
use Miniflux\Helper;
|
||||||
|
|
||||||
const VERSION = 2;
|
const VERSION = 3;
|
||||||
|
|
||||||
|
function version_3(PDO $pdo)
|
||||||
|
{
|
||||||
|
$pdo->exec('ALTER TABLE feeds ADD COLUMN expiration BIGINT DEFAULT 0');
|
||||||
|
}
|
||||||
|
|
||||||
function version_2(PDO $pdo)
|
function version_2(PDO $pdo)
|
||||||
{
|
{
|
||||||
|
@ -5,7 +5,12 @@ namespace Miniflux\Schema;
|
|||||||
use PDO;
|
use PDO;
|
||||||
use Miniflux\Helper;
|
use Miniflux\Helper;
|
||||||
|
|
||||||
const VERSION = 2;
|
const VERSION = 3;
|
||||||
|
|
||||||
|
function version_3(PDO $pdo)
|
||||||
|
{
|
||||||
|
$pdo->exec('ALTER TABLE feeds ADD COLUMN expiration INTEGER DEFAULT 0');
|
||||||
|
}
|
||||||
|
|
||||||
function version_2(PDO $pdo)
|
function version_2(PDO $pdo)
|
||||||
{
|
{
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
"fguillot/simple-validator": "v1.0.0",
|
"fguillot/simple-validator": "v1.0.0",
|
||||||
"fguillot/json-rpc": "v1.2.3",
|
"fguillot/json-rpc": "v1.2.3",
|
||||||
"fguillot/picodb": "v1.0.14 ",
|
"fguillot/picodb": "v1.0.14 ",
|
||||||
"fguillot/picofeed": "v0.1.27",
|
"fguillot/picofeed": "v0.1.28",
|
||||||
"pda/pheanstalk": "v3.1.0",
|
"pda/pheanstalk": "v3.1.0",
|
||||||
"ircmaxell/password-compat": "^1.0.4"
|
"ircmaxell/password-compat": "^1.0.4"
|
||||||
},
|
},
|
||||||
|
@ -17,7 +17,7 @@ $limit = get_cli_option('limit', $options);
|
|||||||
$connection = new Pheanstalk(BEANSTALKD_HOST);
|
$connection = new Pheanstalk(BEANSTALKD_HOST);
|
||||||
|
|
||||||
foreach (Model\User\get_all_users() as $user) {
|
foreach (Model\User\get_all_users() as $user) {
|
||||||
foreach (Model\Feed\get_feed_ids($user['id'], $limit) as $feed_id) {
|
foreach (Model\Feed\get_feed_ids_to_refresh($user['id'], $limit) as $feed_id) {
|
||||||
$payload = serialize(array(
|
$payload = serialize(array(
|
||||||
'feed_id' => $feed_id,
|
'feed_id' => $feed_id,
|
||||||
'user_id' => $user['id'],
|
'user_id' => $user['id'],
|
||||||
|
@ -64,13 +64,22 @@ class FeedModelTest extends BaseTest
|
|||||||
$feed->setTitle('Some feed');
|
$feed->setTitle('Some feed');
|
||||||
$feed->setFeedUrl('another feed url');
|
$feed->setFeedUrl('another feed url');
|
||||||
$feed->setSiteUrl('site url');
|
$feed->setSiteUrl('site url');
|
||||||
$this->assertEquals(2, Model\Feed\create(1, $feed, 'etag', 'last modified'));
|
$this->assertEquals(2, Model\Feed\create(1, $feed, 'etag', 'last modified', time()));
|
||||||
|
|
||||||
$feed_ids = Model\Feed\get_feed_ids(1);
|
$feed = new Feed();
|
||||||
$this->assertEquals(array(1, 2), $feed_ids);
|
$feed->setTitle('Some feed');
|
||||||
|
$feed->setFeedUrl('some other feed url');
|
||||||
|
$feed->setSiteUrl('site url');
|
||||||
|
$this->assertEquals(3, Model\Feed\create(1, $feed, 'etag', 'last modified', strtotime('-1 week')));
|
||||||
|
|
||||||
$feed_ids = Model\Feed\get_feed_ids(1, 1);
|
$feed_ids = Model\Feed\get_feed_ids_to_refresh(1);
|
||||||
|
$this->assertEquals(array(1, 2, 3), $feed_ids);
|
||||||
|
|
||||||
|
$feed_ids = Model\Feed\get_feed_ids_to_refresh(1, 1);
|
||||||
$this->assertEquals(array(1), $feed_ids);
|
$this->assertEquals(array(1), $feed_ids);
|
||||||
|
|
||||||
|
$feed_ids = Model\Feed\get_feed_ids_to_refresh(1, null, strtotime('-2 days'));
|
||||||
|
$this->assertEquals(array(1, 3), $feed_ids);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testGetFeedWithItemsCount()
|
public function testGetFeedWithItemsCount()
|
||||||
|
2
vendor/autoload.php
vendored
2
vendor/autoload.php
vendored
@ -4,4 +4,4 @@
|
|||||||
|
|
||||||
require_once __DIR__ . '/composer' . '/autoload_real.php';
|
require_once __DIR__ . '/composer' . '/autoload_real.php';
|
||||||
|
|
||||||
return ComposerAutoloaderInitfd7e8d436e1dc450edc3153ac8bc31b4::getLoader();
|
return ComposerAutoloaderInitfc88bf644a3dc0d30b5792ad2fec7895::getLoader();
|
||||||
|
14
vendor/composer/autoload_real.php
vendored
14
vendor/composer/autoload_real.php
vendored
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
// autoload_real.php @generated by Composer
|
// autoload_real.php @generated by Composer
|
||||||
|
|
||||||
class ComposerAutoloaderInitfd7e8d436e1dc450edc3153ac8bc31b4
|
class ComposerAutoloaderInitfc88bf644a3dc0d30b5792ad2fec7895
|
||||||
{
|
{
|
||||||
private static $loader;
|
private static $loader;
|
||||||
|
|
||||||
@ -19,15 +19,15 @@ class ComposerAutoloaderInitfd7e8d436e1dc450edc3153ac8bc31b4
|
|||||||
return self::$loader;
|
return self::$loader;
|
||||||
}
|
}
|
||||||
|
|
||||||
spl_autoload_register(array('ComposerAutoloaderInitfd7e8d436e1dc450edc3153ac8bc31b4', 'loadClassLoader'), true, true);
|
spl_autoload_register(array('ComposerAutoloaderInitfc88bf644a3dc0d30b5792ad2fec7895', 'loadClassLoader'), true, true);
|
||||||
self::$loader = $loader = new \Composer\Autoload\ClassLoader();
|
self::$loader = $loader = new \Composer\Autoload\ClassLoader();
|
||||||
spl_autoload_unregister(array('ComposerAutoloaderInitfd7e8d436e1dc450edc3153ac8bc31b4', 'loadClassLoader'));
|
spl_autoload_unregister(array('ComposerAutoloaderInitfc88bf644a3dc0d30b5792ad2fec7895', 'loadClassLoader'));
|
||||||
|
|
||||||
$useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION');
|
$useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION');
|
||||||
if ($useStaticLoader) {
|
if ($useStaticLoader) {
|
||||||
require_once __DIR__ . '/autoload_static.php';
|
require_once __DIR__ . '/autoload_static.php';
|
||||||
|
|
||||||
call_user_func(\Composer\Autoload\ComposerStaticInitfd7e8d436e1dc450edc3153ac8bc31b4::getInitializer($loader));
|
call_user_func(\Composer\Autoload\ComposerStaticInitfc88bf644a3dc0d30b5792ad2fec7895::getInitializer($loader));
|
||||||
} else {
|
} else {
|
||||||
$map = require __DIR__ . '/autoload_namespaces.php';
|
$map = require __DIR__ . '/autoload_namespaces.php';
|
||||||
foreach ($map as $namespace => $path) {
|
foreach ($map as $namespace => $path) {
|
||||||
@ -48,19 +48,19 @@ class ComposerAutoloaderInitfd7e8d436e1dc450edc3153ac8bc31b4
|
|||||||
$loader->register(true);
|
$loader->register(true);
|
||||||
|
|
||||||
if ($useStaticLoader) {
|
if ($useStaticLoader) {
|
||||||
$includeFiles = Composer\Autoload\ComposerStaticInitfd7e8d436e1dc450edc3153ac8bc31b4::$files;
|
$includeFiles = Composer\Autoload\ComposerStaticInitfc88bf644a3dc0d30b5792ad2fec7895::$files;
|
||||||
} else {
|
} else {
|
||||||
$includeFiles = require __DIR__ . '/autoload_files.php';
|
$includeFiles = require __DIR__ . '/autoload_files.php';
|
||||||
}
|
}
|
||||||
foreach ($includeFiles as $fileIdentifier => $file) {
|
foreach ($includeFiles as $fileIdentifier => $file) {
|
||||||
composerRequirefd7e8d436e1dc450edc3153ac8bc31b4($fileIdentifier, $file);
|
composerRequirefc88bf644a3dc0d30b5792ad2fec7895($fileIdentifier, $file);
|
||||||
}
|
}
|
||||||
|
|
||||||
return $loader;
|
return $loader;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function composerRequirefd7e8d436e1dc450edc3153ac8bc31b4($fileIdentifier, $file)
|
function composerRequirefc88bf644a3dc0d30b5792ad2fec7895($fileIdentifier, $file)
|
||||||
{
|
{
|
||||||
if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
|
if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
|
||||||
require $file;
|
require $file;
|
||||||
|
10
vendor/composer/autoload_static.php
vendored
10
vendor/composer/autoload_static.php
vendored
@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
namespace Composer\Autoload;
|
namespace Composer\Autoload;
|
||||||
|
|
||||||
class ComposerStaticInitfd7e8d436e1dc450edc3153ac8bc31b4
|
class ComposerStaticInitfc88bf644a3dc0d30b5792ad2fec7895
|
||||||
{
|
{
|
||||||
public static $files = array (
|
public static $files = array (
|
||||||
'e40631d46120a9c38ea139981f8dab26' => __DIR__ . '/..' . '/ircmaxell/password-compat/lib/password.php',
|
'e40631d46120a9c38ea139981f8dab26' => __DIR__ . '/..' . '/ircmaxell/password-compat/lib/password.php',
|
||||||
@ -277,10 +277,10 @@ class ComposerStaticInitfd7e8d436e1dc450edc3153ac8bc31b4
|
|||||||
public static function getInitializer(ClassLoader $loader)
|
public static function getInitializer(ClassLoader $loader)
|
||||||
{
|
{
|
||||||
return \Closure::bind(function () use ($loader) {
|
return \Closure::bind(function () use ($loader) {
|
||||||
$loader->prefixLengthsPsr4 = ComposerStaticInitfd7e8d436e1dc450edc3153ac8bc31b4::$prefixLengthsPsr4;
|
$loader->prefixLengthsPsr4 = ComposerStaticInitfc88bf644a3dc0d30b5792ad2fec7895::$prefixLengthsPsr4;
|
||||||
$loader->prefixDirsPsr4 = ComposerStaticInitfd7e8d436e1dc450edc3153ac8bc31b4::$prefixDirsPsr4;
|
$loader->prefixDirsPsr4 = ComposerStaticInitfc88bf644a3dc0d30b5792ad2fec7895::$prefixDirsPsr4;
|
||||||
$loader->prefixesPsr0 = ComposerStaticInitfd7e8d436e1dc450edc3153ac8bc31b4::$prefixesPsr0;
|
$loader->prefixesPsr0 = ComposerStaticInitfc88bf644a3dc0d30b5792ad2fec7895::$prefixesPsr0;
|
||||||
$loader->classMap = ComposerStaticInitfd7e8d436e1dc450edc3153ac8bc31b4::$classMap;
|
$loader->classMap = ComposerStaticInitfc88bf644a3dc0d30b5792ad2fec7895::$classMap;
|
||||||
|
|
||||||
}, null, ClassLoader::class);
|
}, null, ClassLoader::class);
|
||||||
}
|
}
|
||||||
|
276
vendor/composer/installed.json
vendored
276
vendor/composer/installed.json
vendored
@ -37,6 +37,89 @@
|
|||||||
"description": "Simple validator library",
|
"description": "Simple validator library",
|
||||||
"homepage": "https://github.com/fguillot/simpleValidator"
|
"homepage": "https://github.com/fguillot/simpleValidator"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "fguillot/json-rpc",
|
||||||
|
"version": "v1.2.3",
|
||||||
|
"version_normalized": "1.2.3.0",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/fguillot/JsonRPC.git",
|
||||||
|
"reference": "86dd3cf0724bc495cb31882122e9a3a77b9a2ffc"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/fguillot/JsonRPC/zipball/86dd3cf0724bc495cb31882122e9a3a77b9a2ffc",
|
||||||
|
"reference": "86dd3cf0724bc495cb31882122e9a3a77b9a2ffc",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": ">=5.3.4"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"phpunit/phpunit": "4.8.*"
|
||||||
|
},
|
||||||
|
"time": "2016-12-15 03:00:30",
|
||||||
|
"type": "library",
|
||||||
|
"installation-source": "dist",
|
||||||
|
"autoload": {
|
||||||
|
"psr-0": {
|
||||||
|
"JsonRPC": "src/"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Frédéric Guillot"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Simple Json-RPC client/server library that just works",
|
||||||
|
"homepage": "https://github.com/fguillot/JsonRPC"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "fguillot/picodb",
|
||||||
|
"version": "v1.0.14",
|
||||||
|
"version_normalized": "1.0.14.0",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/fguillot/picoDb.git",
|
||||||
|
"reference": "86a831302ab10af800c83dbe4b3b01c88d5433f1"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/fguillot/picoDb/zipball/86a831302ab10af800c83dbe4b3b01c88d5433f1",
|
||||||
|
"reference": "86a831302ab10af800c83dbe4b3b01c88d5433f1",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": ">=5.3.0"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"phpunit/phpunit": "4.8.*"
|
||||||
|
},
|
||||||
|
"time": "2016-07-16 22:59:59",
|
||||||
|
"type": "library",
|
||||||
|
"installation-source": "dist",
|
||||||
|
"autoload": {
|
||||||
|
"psr-0": {
|
||||||
|
"PicoDb": "lib/"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Frédéric Guillot",
|
||||||
|
"homepage": "https://github.com/fguillot/"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Minimalist database query builder",
|
||||||
|
"homepage": "https://github.com/fguillot/picoDb"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "zendframework/zendxml",
|
"name": "zendframework/zendxml",
|
||||||
"version": "1.0.2",
|
"version": "1.0.2",
|
||||||
@ -84,6 +167,61 @@
|
|||||||
"zf2"
|
"zf2"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "fguillot/picofeed",
|
||||||
|
"version": "v0.1.28",
|
||||||
|
"version_normalized": "0.1.28.0",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/fguillot/picoFeed.git",
|
||||||
|
"reference": "9da506c308bcb40b6fc630f9123466028c03170b"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/fguillot/picoFeed/zipball/9da506c308bcb40b6fc630f9123466028c03170b",
|
||||||
|
"reference": "9da506c308bcb40b6fc630f9123466028c03170b",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"ext-dom": "*",
|
||||||
|
"ext-iconv": "*",
|
||||||
|
"ext-libxml": "*",
|
||||||
|
"ext-simplexml": "*",
|
||||||
|
"ext-xml": "*",
|
||||||
|
"php": ">=5.3.0",
|
||||||
|
"zendframework/zendxml": "^1.0"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"phpdocumentor/reflection-docblock": "2.0.4",
|
||||||
|
"phpunit/phpunit": "4.8.26",
|
||||||
|
"symfony/yaml": "2.8.7"
|
||||||
|
},
|
||||||
|
"suggest": {
|
||||||
|
"ext-curl": "PicoFeed will use cURL if present"
|
||||||
|
},
|
||||||
|
"time": "2016-12-29 00:06:41",
|
||||||
|
"bin": [
|
||||||
|
"picofeed"
|
||||||
|
],
|
||||||
|
"type": "library",
|
||||||
|
"installation-source": "dist",
|
||||||
|
"autoload": {
|
||||||
|
"psr-0": {
|
||||||
|
"PicoFeed": "lib/"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Frédéric Guillot"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Modern library to handle RSS/Atom feeds",
|
||||||
|
"homepage": "https://github.com/fguillot/picoFeed"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "pda/pheanstalk",
|
"name": "pda/pheanstalk",
|
||||||
"version": "v3.1.0",
|
"version": "v3.1.0",
|
||||||
@ -136,48 +274,6 @@
|
|||||||
"beanstalkd"
|
"beanstalkd"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"name": "fguillot/picodb",
|
|
||||||
"version": "v1.0.14",
|
|
||||||
"version_normalized": "1.0.14.0",
|
|
||||||
"source": {
|
|
||||||
"type": "git",
|
|
||||||
"url": "https://github.com/fguillot/picoDb.git",
|
|
||||||
"reference": "86a831302ab10af800c83dbe4b3b01c88d5433f1"
|
|
||||||
},
|
|
||||||
"dist": {
|
|
||||||
"type": "zip",
|
|
||||||
"url": "https://api.github.com/repos/fguillot/picoDb/zipball/86a831302ab10af800c83dbe4b3b01c88d5433f1",
|
|
||||||
"reference": "86a831302ab10af800c83dbe4b3b01c88d5433f1",
|
|
||||||
"shasum": ""
|
|
||||||
},
|
|
||||||
"require": {
|
|
||||||
"php": ">=5.3.0"
|
|
||||||
},
|
|
||||||
"require-dev": {
|
|
||||||
"phpunit/phpunit": "4.8.*"
|
|
||||||
},
|
|
||||||
"time": "2016-07-16 22:59:59",
|
|
||||||
"type": "library",
|
|
||||||
"installation-source": "dist",
|
|
||||||
"autoload": {
|
|
||||||
"psr-0": {
|
|
||||||
"PicoDb": "lib/"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"notification-url": "https://packagist.org/downloads/",
|
|
||||||
"license": [
|
|
||||||
"MIT"
|
|
||||||
],
|
|
||||||
"authors": [
|
|
||||||
{
|
|
||||||
"name": "Frédéric Guillot",
|
|
||||||
"homepage": "https://github.com/fguillot/"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"description": "Minimalist database query builder",
|
|
||||||
"homepage": "https://github.com/fguillot/picoDb"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"name": "ircmaxell/password-compat",
|
"name": "ircmaxell/password-compat",
|
||||||
"version": "v1.0.4",
|
"version": "v1.0.4",
|
||||||
@ -221,101 +317,5 @@
|
|||||||
"hashing",
|
"hashing",
|
||||||
"password"
|
"password"
|
||||||
]
|
]
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "fguillot/json-rpc",
|
|
||||||
"version": "v1.2.3",
|
|
||||||
"version_normalized": "1.2.3.0",
|
|
||||||
"source": {
|
|
||||||
"type": "git",
|
|
||||||
"url": "https://github.com/fguillot/JsonRPC.git",
|
|
||||||
"reference": "86dd3cf0724bc495cb31882122e9a3a77b9a2ffc"
|
|
||||||
},
|
|
||||||
"dist": {
|
|
||||||
"type": "zip",
|
|
||||||
"url": "https://api.github.com/repos/fguillot/JsonRPC/zipball/86dd3cf0724bc495cb31882122e9a3a77b9a2ffc",
|
|
||||||
"reference": "86dd3cf0724bc495cb31882122e9a3a77b9a2ffc",
|
|
||||||
"shasum": ""
|
|
||||||
},
|
|
||||||
"require": {
|
|
||||||
"php": ">=5.3.4"
|
|
||||||
},
|
|
||||||
"require-dev": {
|
|
||||||
"phpunit/phpunit": "4.8.*"
|
|
||||||
},
|
|
||||||
"time": "2016-12-15 03:00:30",
|
|
||||||
"type": "library",
|
|
||||||
"installation-source": "dist",
|
|
||||||
"autoload": {
|
|
||||||
"psr-0": {
|
|
||||||
"JsonRPC": "src/"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"notification-url": "https://packagist.org/downloads/",
|
|
||||||
"license": [
|
|
||||||
"MIT"
|
|
||||||
],
|
|
||||||
"authors": [
|
|
||||||
{
|
|
||||||
"name": "Frédéric Guillot"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"description": "Simple Json-RPC client/server library that just works",
|
|
||||||
"homepage": "https://github.com/fguillot/JsonRPC"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "fguillot/picofeed",
|
|
||||||
"version": "v0.1.27",
|
|
||||||
"version_normalized": "0.1.27.0",
|
|
||||||
"source": {
|
|
||||||
"type": "git",
|
|
||||||
"url": "https://github.com/fguillot/picoFeed.git",
|
|
||||||
"reference": "41924841d3cd0480364ca9bcb90abe095d744457"
|
|
||||||
},
|
|
||||||
"dist": {
|
|
||||||
"type": "zip",
|
|
||||||
"url": "https://api.github.com/repos/fguillot/picoFeed/zipball/41924841d3cd0480364ca9bcb90abe095d744457",
|
|
||||||
"reference": "41924841d3cd0480364ca9bcb90abe095d744457",
|
|
||||||
"shasum": ""
|
|
||||||
},
|
|
||||||
"require": {
|
|
||||||
"ext-dom": "*",
|
|
||||||
"ext-iconv": "*",
|
|
||||||
"ext-libxml": "*",
|
|
||||||
"ext-simplexml": "*",
|
|
||||||
"ext-xml": "*",
|
|
||||||
"php": ">=5.3.0",
|
|
||||||
"zendframework/zendxml": "^1.0"
|
|
||||||
},
|
|
||||||
"require-dev": {
|
|
||||||
"phpdocumentor/reflection-docblock": "2.0.4",
|
|
||||||
"phpunit/phpunit": "4.8.26",
|
|
||||||
"symfony/yaml": "2.8.7"
|
|
||||||
},
|
|
||||||
"suggest": {
|
|
||||||
"ext-curl": "PicoFeed will use cURL if present"
|
|
||||||
},
|
|
||||||
"time": "2016-12-26 22:25:33",
|
|
||||||
"bin": [
|
|
||||||
"picofeed"
|
|
||||||
],
|
|
||||||
"type": "library",
|
|
||||||
"installation-source": "dist",
|
|
||||||
"autoload": {
|
|
||||||
"psr-0": {
|
|
||||||
"PicoFeed": "lib/"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"notification-url": "https://packagist.org/downloads/",
|
|
||||||
"license": [
|
|
||||||
"MIT"
|
|
||||||
],
|
|
||||||
"authors": [
|
|
||||||
{
|
|
||||||
"name": "Frédéric Guillot"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"description": "Modern library to handle RSS/Atom feeds",
|
|
||||||
"homepage": "https://github.com/fguillot/picoFeed"
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
namespace PicoFeed\Client;
|
namespace PicoFeed\Client;
|
||||||
|
|
||||||
|
use DateTime;
|
||||||
use LogicException;
|
use LogicException;
|
||||||
use PicoFeed\Logging\Logger;
|
use PicoFeed\Logging\Logger;
|
||||||
use PicoFeed\Config\Config;
|
use PicoFeed\Config\Config;
|
||||||
@ -55,6 +56,13 @@ abstract class Client
|
|||||||
*/
|
*/
|
||||||
protected $last_modified = '';
|
protected $last_modified = '';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Expiration DateTime
|
||||||
|
*
|
||||||
|
* @var DateTime
|
||||||
|
*/
|
||||||
|
protected $expiration = null;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Proxy hostname.
|
* Proxy hostname.
|
||||||
*
|
*
|
||||||
@ -214,6 +222,9 @@ abstract class Client
|
|||||||
$this->handleErrorResponse($response);
|
$this->handleErrorResponse($response);
|
||||||
$this->handleNormalResponse($response);
|
$this->handleNormalResponse($response);
|
||||||
|
|
||||||
|
$this->expiration = $this->parseExpiration($response['headers']);
|
||||||
|
Logger::setMessage(get_called_class().' Expiration: '.$this->expiration->format(DATE_ISO8601));
|
||||||
|
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -241,6 +252,9 @@ abstract class Client
|
|||||||
* Handle Http Error codes
|
* Handle Http Error codes
|
||||||
*
|
*
|
||||||
* @param array $response Client response
|
* @param array $response Client response
|
||||||
|
* @throws ForbiddenException
|
||||||
|
* @throws InvalidUrlException
|
||||||
|
* @throws UnauthorizedException
|
||||||
*/
|
*/
|
||||||
protected function handleErrorResponse(array $response)
|
protected function handleErrorResponse(array $response)
|
||||||
{
|
{
|
||||||
@ -402,13 +416,12 @@ abstract class Client
|
|||||||
/**
|
/**
|
||||||
* Set the url.
|
* Set the url.
|
||||||
*
|
*
|
||||||
|
* @param $url
|
||||||
* @return string
|
* @return string
|
||||||
* @return \PicoFeed\Client\Client
|
|
||||||
*/
|
*/
|
||||||
public function setUrl($url)
|
public function setUrl($url)
|
||||||
{
|
{
|
||||||
$this->url = $url;
|
$this->url = $url;
|
||||||
|
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -670,4 +683,31 @@ abstract class Client
|
|||||||
{
|
{
|
||||||
return $code == 301 || $code == 302 || $code == 303 || $code == 307;
|
return $code == 301 || $code == 302 || $code == 303 || $code == 307;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function parseExpiration(HttpHeaders $headers)
|
||||||
|
{
|
||||||
|
if (isset($headers['Cache-Control'])) {
|
||||||
|
if (preg_match('/s-maxage=(\d+)/', $headers['Cache-Control'], $matches)) {
|
||||||
|
return new DateTime('+' . $matches[1] . ' seconds');
|
||||||
|
} else if (preg_match('/max-age=(\d+)/', $headers['Cache-Control'], $matches)) {
|
||||||
|
return new DateTime('+' . $matches[1] . ' seconds');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (! empty($headers['Expires'])) {
|
||||||
|
return new DateTime($headers['Expires']);
|
||||||
|
}
|
||||||
|
|
||||||
|
return new DateTime();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get expiration date time from "Expires" or "Cache-Control" headers
|
||||||
|
*
|
||||||
|
* @return DateTime
|
||||||
|
*/
|
||||||
|
public function getExpiration()
|
||||||
|
{
|
||||||
|
return $this->expiration ?: new DateTime();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user