Mercurial > hg > pnewss
diff fetchnews.php @ 12:7917bd536187 draft
Added hook for new articles, detect send/write failures, fixed handling of multiline headers, add Date header if it doesn't exist, add option to disable peers, fixes for synchronization with INN, added streaming mode support, small fixes
author | Ivo Smits <Ivo@UCIS.nl> |
---|---|
date | Wed, 12 Jun 2013 22:22:07 +0200 |
parents | e0807e0b1a67 |
children | cccd73f72bf6 |
line wrap: on
line diff
--- a/fetchnews.php Sat Jun 18 15:59:11 2011 +0200 +++ b/fetchnews.php Wed Jun 12 22:22:07 2013 +0200 @@ -29,6 +29,7 @@ require_once './common.php'; foreach ($db->evalAllAssoc('SELECT * FROM `peers`') as $peer) { + if (!$peer['enabled']) continue; $socket = stream_socket_client($peer['address']); if ($socket === FALSE) { print("Could not connect to peer $peer[address]\n"); @@ -40,6 +41,38 @@ } else if ($code == 201) { $peer['post'] = 0; } else die("Error code $code from $peer[address]\n"); + while ($peer['post'] == 2) { + if ($peer['lastposted'] === NULL) { + $articles = $db->evalAllAssoc('SELECT * FROM `messages` ORDER BY `id` ASC LIMIT 10'); + } else { + $articles = $db->evalAllAssoc('SELECT * FROM `messages` WHERE `id` > ? ORDER BY `id` ASC LIMIT 10', $peer['lastposted']); + } + if (!count($articles)) break; + foreach ($articles as $article) { + nntp_writeline($socket, 'IHAVE <'.$article['messageid'].'>'); + $line = nntp_readline($socket); + $code = strtok($line, " \t"); + if ($code == 435) { //Duplicate + } else if ($code == 335) { //Please send + foreach (explode("\r\n", $article['header']) as $line) nntp_writeline_data($socket, $line); + nntp_writeline($socket, ''); + foreach (explode("\r\n", $article['body']) as $line) nntp_writeline_data($socket, $line); + nntp_writeline($socket, '.'); + $line = nntp_readline($socket); + $code = strtok($line, " \t"); + if ($code != 240 && $code != 235) print("Article $article[messageid] was not accepted ($code)\n"); + if ($article['id'] > $peer['lastposted']) $peer['lastposted'] = $article['id']; + } else { + print("IHAVE rejected by remote server, falling back to POST\n"); + $peer['post'] = 1; + break; + } + if ($article['id'] > $peer['lastposted']) $peer['lastposted'] = $article['id']; + } + $db->update('UPDATE `peers` SET `lastposted` = ? WHERE `id` = ?', array($peer['lastposted'], $peer['id'])); + } + nntp_writeline($socket, 'MODE READER'); + $line = nntp_readline($socket); foreach ($db->evalAllAssoc('SELECT * FROM `peergroups` WHERE `peer` = ?', $peer['id']) as $peergroup) { $group = $db->evalRowAssoc('SELECT * FROM `groups` WHERE `id` = ?', $peergroup['group']); nntp_writeline($socket, 'GROUP '.$group['name']); @@ -88,36 +121,25 @@ $db->update('UPDATE `peergroups` SET `low` = ?, `high` = ? WHERE `peer` = ? AND `group` = ?', array($low, $high, $peergroup['peer'], $peergroup['group'])); } } - while ($peer['post']) { + while ($peer['post'] == 1) { if ($peer['lastposted'] === NULL) { - $articles = $db->evalAllAssoc('SELECT * FROM `messages` LIMIT 10'); + $articles = $db->evalAllAssoc('SELECT * FROM `messages` ORDER BY `id` ASC LIMIT 5'); } else { - $articles = $db->evalAllAssoc('SELECT * FROM `messages` WHERE `id` > ? LIMIT 10', $peer['lastposted']); + $articles = $db->evalAllAssoc('SELECT * FROM `messages` WHERE `id` > ? ORDER BY `id` ASC LIMIT 5', $peer['lastposted']); } if (!count($articles)) break; foreach ($articles as $article) { - $dopost = FALSE; - if ($peer['post'] == 2) { - nntp_writeline($socket, 'IHAVE <'.$article['messageid'].'>'); + nntp_writeline($socket, 'STAT <'.$article['messageid'].'>'); + $line = nntp_readline($socket); + $code = strtok($line, " \t"); + if ($code == 501) { //Argument error + print("STAT rejected by remote server, skipping message\n"); + } elseif ($code == 223) { //Exists + } elseif ($code == 430) { //Not found + nntp_writeline($socket, 'POST'); $line = nntp_readline($socket); $code = strtok($line, " \t"); - if ($code == 335) $dopost = TRUE; - elseif ($code != 435) $peer['post'] = 1; - } - if ($peer['post'] != 2) { - nntp_writeline($socket, 'STAT <'.$article['messageid'].'>'); - $line = nntp_readline($socket); - $code = strtok($line, " \t"); - if ($code == 430) $dopost = TRUE; - elseif ($code != 223) die("Error code $code from $peer[address]\n"); - if ($dopost) { - nntp_writeline($socket, 'POST'); - $line = nntp_readline($socket); - $code = strtok($line, " \t"); - if ($code != 340) die("Error code $code from $peer[address]\n"); - } - } - if ($dopost) { + if ($code != 340) die("Error code $code from $peer[address]\n"); foreach (explode("\r\n", $article['header']) as $line) nntp_writeline_data($socket, $line); nntp_writeline($socket, ''); foreach (explode("\r\n", $article['body']) as $line) nntp_writeline_data($socket, $line); @@ -125,6 +147,8 @@ $line = nntp_readline($socket); $code = strtok($line, " \t"); if ($code != 240 && $code != 235) print("Article $article[messageid] was not accepted ($code)\n"); + } else { + die("Error code $code from $peer[address]\n"); } if ($article['id'] > $peer['lastposted']) $peer['lastposted'] = $article['id']; }