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'];
 		}