Browse Source

[fetch] add Last-Modified header usage

Signed-off-by: r4sas <r4sas@i2pmail.org>
master
R4SAS 3 years ago
parent
commit
90cc56a14c
Signed by: r4sas
GPG Key ID: 66F6C87B98EBCFE2
  1. 22
      fetch.php
  2. 29
      import.php
  3. 10
      lib/utils.php
  4. 1
      sql/database.sql

22
fetch.php

@ -18,11 +18,14 @@ $aContext = array(
); );
$STH = $pdo->query ("SELECT `name`, `url`, `etag` FROM `subscriptions` WHERE `active` = 1"); $STH = $pdo->query ("SELECT `name`, `url`, `modified`, `etag` FROM `subscriptions` WHERE `active` = 1");
$lists = $STH->fetchAll(PDO::FETCH_ASSOC); $lists = $STH->fetchAll(PDO::FETCH_ASSOC);
foreach ($lists as $list) { foreach ($lists as $list) {
echo "Processing " . $list['name'] . " subscription..." . PHP_EOL; echo "Processing " . $list['name'] . " subscription...";
if (!empty($list['modified']))
$aContext['http']['header'] = 'If-Modified-Since: ' . $list['modified'] . '\r\n';
if (!empty($list['etag'])) if (!empty($list['etag']))
$aContext['http']['header'] = 'If-None-Match: ' . $list['etag'] . '\r\n'; $aContext['http']['header'] = 'If-None-Match: ' . $list['etag'] . '\r\n';
@ -34,19 +37,20 @@ foreach ($lists as $list) {
$f_meta = stream_get_meta_data($f); $f_meta = stream_get_meta_data($f);
if (strpos($f_meta['wrapper_data'][0], "200") === false) { if (strpos($f_meta['wrapper_data'][0], "200") === false) {
echo " no changes." . PHP_EOL;
continue; continue;
} }
$etagHeader = array_filter($f_meta['wrapper_data'], function($el) { $lastmod = $util->getResponseHeader("Last-Modified", $f_meta['wrapper_data']);
return (strpos($el, "ETag") !== false); $etag = $util->getResponseHeader("Etag", $f_meta['wrapper_data']);
});
if ($etagHeader) { if (!empty($lastmod) || !empty($etag)) {
$etag = substr($etagHeader[array_keys($etagHeader)[0]], 6); $pdo->exec("UPDATE `subscriptions` SET " . (!empty($lastmod) ? ("`modified` = '" . $lastmod . "' ") : "") . (!empty($etag) ? ("`etag` = '" . $etag . "' ") : "") . "WHERE `name` = '" . $list['name'] . "'");
var_dump($etag);
$pdo->exec("UPDATE `subscriptions` SET `etag` = '" . $etag . "' WHERE `name` = '" . $list['name'] . "'");
} }
// reset line
echo " fetching updated list." . PHP_EOL;
while (($buffer = fgets($f, 4096)) !== false) { while (($buffer = fgets($f, 4096)) !== false) {
$domain = ""; $domain = "";
$record = $util->parseHostRecord($buffer); $record = $util->parseHostRecord($buffer);

29
import.php

@ -16,30 +16,24 @@ if ($f) {
$STH->bindParam('base64', $base64); $STH->bindParam('base64', $base64);
$STH->bindParam('base32', $base32); $STH->bindParam('base32', $base32);
while (($buffer = fgets($f, 4096)) !== false) while (($buffer = fgets($f, 4096)) !== false) {
{
$domain = ""; $domain = "";
$record = $util->parseHostRecord($buffer); $record = $util->parseHostRecord($buffer);
if (!$util->isValidAddress($record['host'], $error)) if (!$util->isValidAddress($record['host'], $error)) {
{
echo "Error while validating " . $record['host'] . ": " . $error . PHP_EOL; echo "Error while validating " . $record['host'] . ": " . $error . PHP_EOL;
continue; continue;
}
else } else {
{ if($util->isPunycodeDomain($record['host'])) {
if($util->isPunycodeDomain($record['host']))
{
$domain = idn_to_utf8($record['host']); $domain = idn_to_utf8($record['host']);
}
else } else {
{
$domain = $record['host']; $domain = $record['host'];
} }
} }
if (!$util->isValidBase64($record['b64'])) if (!$util->isValidBase64($record['b64'])) {
{
echo "Error while validating " . $record['host'] . ": incorrect base64: " . $record['b64'] . PHP_EOL; echo "Error while validating " . $record['host'] . ": incorrect base64: " . $record['b64'] . PHP_EOL;
continue; continue;
} }
@ -49,13 +43,12 @@ if ($f) {
$STH->execute(); $STH->execute();
} }
if (!feof($f))
{ if (!feof($f)) {
echo "Error: fgets() ended earlier than needed" . PHP_EOL; echo "Error: fgets() ended earlier than needed" . PHP_EOL;
} }
if (!$pdo->commit()) if (!$pdo->commit()) {
{
echo "Error while saving records to database"; echo "Error while saving records to database";
} }

10
lib/utils.php

@ -261,4 +261,14 @@ class Utils {
return $record; return $record;
} }
public static function getResponseHeader($header, $response) {
foreach ($response as $key => $r) {
// Match the header name up to ':', compare lower case
if (stripos($r, $header . ':') === 0) {
list($headername, $headervalue) = explode(":", $r, 2);
return trim($headervalue);
}
}
}
} }

1
database.sql → sql/database.sql

@ -22,6 +22,7 @@ CREATE TABLE `hosts` (
CREATE TABLE `subscriptions` ( CREATE TABLE `subscriptions` (
`name` varchar(67) NOT NULL, `name` varchar(67) NOT NULL,
`url` varchar(256) NOT NULL, `url` varchar(256) NOT NULL,
`modified` char(30) NOT NULL DEFAULT '',
`etag` varchar(64) NOT NULL DEFAULT '', `etag` varchar(64) NOT NULL DEFAULT '',
`active` tinyint(1) NOT NULL DEFAULT 0 `active` tinyint(1) NOT NULL DEFAULT 0
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
Loading…
Cancel
Save