X-Git-Url: http://git.polytechnique.org/?a=blobdiff_plain;f=banana%2Fnntpcore.inc.php;h=4b8e9c026f745a1c2aa5359cb762f887892f9e7b;hb=4769d001ccbeda28e61fc49240b629e348de03cb;hp=4fbe0221f6d6e059d587dbacee801e6414731bbd;hpb=598a1c538cde55ef90fcacd7d09d36e025f64dee;p=banana.git diff --git a/banana/nntpcore.inc.php b/banana/nntpcore.inc.php index 4fbe022..4b8e9c0 100644 --- a/banana/nntpcore.inc.php +++ b/banana/nntpcore.inc.php @@ -29,6 +29,7 @@ class BananaNNTPCore /** debug mode */ private $debug = false; + private $bt = array(); /** constructor * @param $host STRING NNTP host @@ -49,7 +50,7 @@ class BananaNNTPCore } $this->checkState(); - $this->posting = ($this->lastresultcode == '200'); + $this->posting = ($this->lastresultcode == '200'); if ($reader && $this->posting) { $this->execLine('MODE READER'); $this->posting = ($this->lastresultcode == '200'); @@ -78,7 +79,20 @@ class BananaNNTPCore public function lastError() { - return $this->lasterrortext; + if (!is_utf8($this->lasterrortext)) { + return utf8_encode($this->lasterrortext); + } else { + return $this->lasterrortext; + } + } + + public function backtrace() + { + if ($this->debug) { + return $this->bt; + } else { + return null; + } } # Socket functions @@ -88,29 +102,20 @@ class BananaNNTPCore */ private function getLine() { - return rtrim(fgets($this->ns, 1200)); + return rtrim(@fgets($this->ns, 1200), "\r\n"); } /** fetch data (and on delimitor) * @param STRING $delim string indicating and of transmission */ - private function fetchResult($callback = null) + private function &fetchResult() { $array = Array(); while (($result = $this->getLine()) != '.') { - if (!is_null($callback)) { - list($key, $result) = call_user_func($callback, $result); - if (is_null($result)) { - continue; - } - if (is_null($key)) { - $array[] = $result; - } else { - $array[$key] = $result; - } - } else { - $array[] = $result; - } + $array[] = $result; + } + if ($this->debug && $this->bt) { + $this->bt[count($this->bt) - 1]['response'] = count($array); } return $array; } @@ -126,9 +131,9 @@ class BananaNNTPCore } if ($this->debug) { $db_line = preg_replace('/PASS .*/', 'PASS *******', $line); - echo $db_line; + $this->bt[] = array('action' => $db_line, 'time' => microtime(true)); } - return fputs($this->ns, $line, strlen($line)); + return @fputs($this->ns, $line, strlen($line)); } /** put a message (multiline) @@ -139,6 +144,7 @@ class BananaNNTPCore $message = join("\n", $_message); } if ($message) { + $message = preg_replace("/(^|\n)\./", '\1..', $message); $this->putLine("$message\r\n", false); } return $this->execLine('.'); @@ -162,11 +168,15 @@ class BananaNNTPCore private function checkState($strict = true) { $result = $this->getLine(); - if ($this->debug) { - echo "$result\n"; - } $this->lastresultcode = substr($result, 0, 3); $this->lastresulttext = substr($result, 4); + if ($this->debug && $this->bt) { + $trace =& $this->bt[count($this->bt) - 1]; + $trace['time'] = microtime(true) - $trace['time']; + $trace['code'] = $this->lastresultcode; + $trace['message'] = $this->lastresulttext; + $trace['response'] = 0; + } $c = $this->lastresultcode{0}; if ($c == '2' || (($c == '1' || $c == '3') && !$strict)) { return true; @@ -334,7 +344,7 @@ class BananaNNTPCore $groups = array(); foreach ($list as $result) { list($group, $last, $first, $p) = explode(' ', $result, 4); - if (!is_null(Banana::$boxpattern) || preg_match('@' . Banana::$boxpattern . '@i', $group)) { + if (!Banana::$boxpattern || preg_match('@' . Banana::$boxpattern . '@i', $group)) { $groups[$group] = array(intval($last), intval($first), $p); } } @@ -453,10 +463,10 @@ class BananaNNTPCore if (!$this->execLine("XGTITLE $pattern ")) { return false; } - $array = $this->fetchResult(); + $array =& $this->fetchResult(); $groups = array(); - foreach ($array as $result) { - list($group, $desc) = split("[ \t]", $result, 2); + foreach ($array as &$result) { + @list($group, $desc) = split("[ \t]", $result, 2); $groups[$group] = $desc; } return $groups; @@ -477,7 +487,7 @@ class BananaNNTPCore if (!$this->execLine("XHDR $hdr $range ")) { return false; } - $array = $this->fetchResult(); + $array =& $this->fetchResult(); $headers = array(); foreach ($array as &$result) { @list($head, $value) = explode(' ', $result, 2); @@ -497,7 +507,7 @@ class BananaNNTPCore if (!$this->execLine("XPAT $hdr $range $pat")) { return false; } - $array = $this->fetchResult(); + $array =& $this->fetchResult(); $headers = array(); foreach ($array as &$result) { list($head, $value) = explode(' ', $result, 2);