summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatt Beale <matt@heyratfans.co.uk>2015-10-12 09:29:56 +0100
committervagrant <vagrant@homestead>2015-10-13 07:19:31 +0000
commitbfdc19f44a9fcbbd439ac937dc61b41f30e0e892 (patch)
tree1d49e6ba0f2e565c9c0a9a12cb63bb731fa18b64
parent1336fd426f5822f9b703fcc68fe24273a726f40c (diff)
downloadcsv-bfdc19f44a9fcbbd439ac937dc61b41f30e0e892.zip
csv-bfdc19f44a9fcbbd439ac937dc61b41f30e0e892.tar.gz
csv-bfdc19f44a9fcbbd439ac937dc61b41f30e0e892.tar.bz2
Don't trim $filter_name in sanitizeStreamFilter - Fixes filters which pass newline character as an argument.
-rw-r--r--examples/lib/FilterReplace.php47
-rw-r--r--src/Modifier/StreamFilter.php4
-rw-r--r--test/StreamFilterTest.php11
-rw-r--r--test/newline.csv2
4 files changed, 60 insertions, 4 deletions
diff --git a/examples/lib/FilterReplace.php b/examples/lib/FilterReplace.php
new file mode 100644
index 0000000..962555c
--- /dev/null
+++ b/examples/lib/FilterReplace.php
@@ -0,0 +1,47 @@
+<?php
+
+namespace lib;
+
+use php_user_filter;
+
+class FilterReplace extends php_user_filter
+{
+ const FILTER_NAME = 'convert.replace.';
+
+ private $search;
+
+ private $replace;
+
+ public function onCreate()
+ {
+ if( strpos( $this->filtername, self::FILTER_NAME ) !== 0 ){
+ return false;
+ }
+
+ $params = substr( $this->filtername, strlen( self::FILTER_NAME ) );
+
+ if( !preg_match( '/([^:]+):([^$]+)$/', $params, $matches ) ){
+ return false;
+ }
+
+ $this->search = $matches[1];
+ $this->replace = $matches[2];
+
+ return true;
+ }
+
+ public function filter( $in, $out, &$consumed, $closing )
+ {
+ while( $res = stream_bucket_make_writeable( $in ) ){
+
+ $res->data = str_replace( $this->search, $this->replace, $res->data );
+
+ $consumed += $res->datalen;
+
+ /** @noinspection PhpParamsInspection */
+ stream_bucket_append( $out, $res );
+ }
+
+ return PSFS_PASS_ON;
+ }
+}
diff --git a/src/Modifier/StreamFilter.php b/src/Modifier/StreamFilter.php
index 38ddcd6..34b9b14 100644
--- a/src/Modifier/StreamFilter.php
+++ b/src/Modifier/StreamFilter.php
@@ -203,9 +203,7 @@ trait StreamFilter
protected function sanitizeStreamFilter($filter_name)
{
$this->assertStreamable();
- $filter_name = (string) $filter_name;
-
- return trim($filter_name);
+ return (string) $filter_name;
}
/**
diff --git a/test/StreamFilterTest.php b/test/StreamFilterTest.php
index 647e7ae..7af1c54 100644
--- a/test/StreamFilterTest.php
+++ b/test/StreamFilterTest.php
@@ -4,6 +4,7 @@ namespace League\Csv\test;
use League\Csv\Reader;
use League\Csv\Writer;
+use lib\FilterReplace;
use PHPUnit_Framework_TestCase;
use SplFileObject;
use SplTempFileObject;
@@ -113,11 +114,19 @@ class StreamFilterTest extends PHPUnit_Framework_TestCase
$this->assertFalse($csv->getIterator()->getRealPath());
}
-
public function testGetFilterPathWithAllStream()
{
$filter = 'php://filter/string.toupper/resource='.__DIR__.'/foo.csv';
$csv = Reader::createFromPath($filter);
$this->assertFalse($csv->getIterator()->getRealPath());
}
+
+ public function testSetStreamFilterWriterNewLine()
+ {
+ stream_filter_register(FilterReplace::FILTER_NAME.'*', '\lib\FilterReplace');
+ $csv = Writer::createFromPath(__DIR__.'/newline.csv');
+ $csv->appendStreamFilter(FilterReplace::FILTER_NAME."\r\n:\n");
+ $this->assertTrue($csv->hasStreamFilter(FilterReplace::FILTER_NAME."\r\n:\n"));
+ $csv->insertOne([1, 'two', 3, "new\r\nline"]);
+ }
}
diff --git a/test/newline.csv b/test/newline.csv
new file mode 100644
index 0000000..a9da13c
--- /dev/null
+++ b/test/newline.csv
@@ -0,0 +1,2 @@
+1,two,3,"new
+line"