diff --git a/src/Header/AbstractAddressList.php b/src/Header/AbstractAddressList.php index 3a9d12bd..eb84702a 100644 --- a/src/Header/AbstractAddressList.php +++ b/src/Header/AbstractAddressList.php @@ -42,31 +42,44 @@ abstract class AbstractAddressList implements HeaderInterface public static function fromString($headerLine) { list($fieldName, $fieldValue) = GenericHeader::splitHeaderLine($headerLine); - $decodedValue = HeaderWrap::mimeDecodeValue($fieldValue); - $wasEncoded = ($decodedValue !== $fieldValue); - $fieldValue = $decodedValue; - if (strtolower($fieldName) !== static::$type) { throw new Exception\InvalidArgumentException(sprintf( - 'Invalid header line for "%s" string', - __CLASS__ - )); - } - $header = new static(); - if ($wasEncoded) { - $header->setEncoding('UTF-8'); + 'Invalid header line for "%s" string', + __CLASS__ + )); } + // split value on "," $fieldValue = str_replace(Headers::FOLDING, ' ', $fieldValue); $fieldValue = preg_replace('/[^:]+:([^;]*);/', '$1,', $fieldValue); - $values = str_getcsv($fieldValue, ','); + $values = str_getcsv($fieldValue, ','); + + $wasEncoded = false; array_walk( $values, - function (&$value) { - $value = trim($value); + function (&$value) use (&$wasEncoded) { + $decodedValue = HeaderWrap::mimeDecodeValue($value); + $wasEncoded = $wasEncoded || ($decodedValue !== $value); + $value = trim($decodedValue); $value = self::stripComments($value); + $value = preg_replace( + [ + '#(?setEncoding('UTF-8'); + } + $values = array_filter($values); $addressList = $header->getAddressList(); diff --git a/test/Header/AddressListHeaderTest.php b/test/Header/AddressListHeaderTest.php index 7705f8ee..74f42055 100644 --- a/test/Header/AddressListHeaderTest.php +++ b/test/Header/AddressListHeaderTest.php @@ -210,4 +210,38 @@ public function getAddressListsWithGroup() ['To: friends: john@example.com; enemies: john@example.net, bart@example.net;', 3, 'john@example.net'], ]; } + + public function specialCharHeaderProvider() + { + return [ + [ + "To: =?UTF-8?B?dGVzdCxsYWJlbA==?= , john2@example.com", + ['john@example.com' => 'test,label', 'john2@example.com' => null], + 'UTF-8' + ], + [ + 'To: "TEST\",QUOTE" , john2@example.com', + ['john@example.com' => 'TEST",QUOTE', 'john2@example.com' => null], + 'ASCII' + ] + ]; + } + + /** + * @dataProvider specialCharHeaderProvider + */ + public function testDeserializationFromSpecialCharString($headerLine, $expected, $encoding) + { + $header = To::fromString($headerLine); + + $expectedTo = new To(); + $addressList = $expectedTo->getAddressList(); + $addressList->addMany($expected); + $expectedTo->setEncoding($encoding); + $this->assertEquals($expectedTo, $header); + foreach ($expected as $k => $v) { + $this->assertTrue($addressList->has($k)); + $this->assertEquals($addressList->get($k)->getName(), $v); + } + } }