diff --git a/CHANGELOG.txt b/CHANGELOG.txt index c14ff44e66ff8ab04a85d82e90677f3c685c1759..1926c9c674c6c6ca8ceb3d568fb7dadad3eb0c60 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -3,6 +3,8 @@ Feeds 6.x xxxxxxxxxxxxxxxxxxxxxx -------------------------------- +- #913672 andrewlevine: Break out CSV Parser into submethods so it is more + easily overridable - #853974 snoldak924, alex_b: Fix XSS vulnerabilities in module. - #887846 ekes: Make FeedsSimplePieEnclosure (un)serialization safe. - #908582 XiaN Vizjereij, alex_b: Fix "Cannot use object of type stdClass as diff --git a/plugins/FeedsCSVParser.inc b/plugins/FeedsCSVParser.inc index 7780d701149ea961d14748bfff3678a7c3c90201..ab3961bc9c0d10157cd885f2c4017b98e75cd022 100644 --- a/plugins/FeedsCSVParser.inc +++ b/plugins/FeedsCSVParser.inc @@ -19,25 +19,53 @@ class FeedsCSVParser extends FeedsParser { $delimiter = $source_config['delimiter'] == 'TAB' ? "\t" : $source_config['delimiter']; $parser->setDelimiter($delimiter); - // Get first line and use it for column names, convert them to lower case. + $header = $this->parseHeader($parser, $iterator); + if (!header) { + return; + } + $parser->setColumnNames($header); + + // Populate batch. + $batch->setItems($this->parseItems($parser, $iterator)); + } + + /** + * Get first line and use it for column names, convert them to lower case. + * Be aware that the $parser and iterator objects can be modified in this + * function since they are passed in by reference + * + * @param ParserCSV $parser + * @param ParserCSVIterator $iterator + * @return + * An array of lower-cased column names to use as keys for the parsed items. + */ + protected function parseHeader(ParserCSV $parser, ParserCSVIterator $iterator) { $parser->setLineLimit(1); $rows = $parser->parse($iterator); if (!count($rows)) { - return; + return FALSE; } $header = array_shift($rows); foreach ($header as $i => $title) { $header[$i] = trim(drupal_strtolower($title)); } - $parser->setColumnNames($header); + return $header; + } + /** + * Parse all of the items from the CSV. + * + * @param ParserCSV $parser + * @param ParserCSVIterator $iterator + * @return + * An array of rows of the CSV keyed by the column names previously set + */ + protected function parseItems(ParserCSV $parser, ParserCSVIterator $iterator) { // Set line limit to 0 and start byte to last position and parse rest. $parser->setLineLimit(0); $parser->setStartByte($parser->lastLinePos()); $rows = $parser->parse($iterator); - - // Populate batch. - $batch->setItems($rows); + return $rows; } /**