diff --git a/library/Zend/Mail/Header/AbstractAddressList.php b/library/Zend/Mail/Header/AbstractAddressList.php index 6f801933a3c..0a34619e587 100644 --- a/library/Zend/Mail/Header/AbstractAddressList.php +++ b/library/Zend/Mail/Header/AbstractAddressList.php @@ -43,9 +43,7 @@ public static function fromString($headerLine) { $decodedLine = iconv_mime_decode($headerLine, ICONV_MIME_DECODE_CONTINUE_ON_ERROR, 'UTF-8'); // split into name/value - list($fieldName, $fieldValue) = explode(':', $decodedLine, 2); - $fieldName = trim($fieldName); - $fieldValue = trim($fieldValue); + list($fieldName, $fieldValue) = GenericHeader::splitHeaderLine($decodedLine); if (strtolower($fieldName) !== static::$type) { throw new Exception\InvalidArgumentException(sprintf( diff --git a/library/Zend/Mail/Header/ContentType.php b/library/Zend/Mail/Header/ContentType.php index 9ae46b3289b..ab8a373ecf0 100644 --- a/library/Zend/Mail/Header/ContentType.php +++ b/library/Zend/Mail/Header/ContentType.php @@ -26,7 +26,7 @@ class ContentType implements HeaderInterface public static function fromString($headerLine) { $headerLine = iconv_mime_decode($headerLine, ICONV_MIME_DECODE_CONTINUE_ON_ERROR, 'UTF-8'); - list($name, $value) = explode(': ', $headerLine, 2); + list($name, $value) = GenericHeader::splitHeaderLine($headerLine); // check to ensure proper header type for this factory if (strtolower($name) !== 'content-type') { diff --git a/library/Zend/Mail/Header/Date.php b/library/Zend/Mail/Header/Date.php index ff7604e2d7b..2f2cae88d82 100644 --- a/library/Zend/Mail/Header/Date.php +++ b/library/Zend/Mail/Header/Date.php @@ -21,19 +21,23 @@ class Date implements HeaderInterface public static function fromString($headerLine) { - list($name, $value) = explode(': ', $headerLine, 2); + list($name, $value) = GenericHeader::splitHeaderLine($headerLine); // check to ensure proper header type for this factory if (strtolower($name) !== 'date') { throw new Exception\InvalidArgumentException('Invalid header line for Date string'); } - $header = new static(); - $header->value= $value; + $header = new static($value); return $header; } + public function __construct($value) + { + $this->value = $value; + } + public function getFieldName() { return 'Date'; diff --git a/library/Zend/Mail/Header/GenericHeader.php b/library/Zend/Mail/Header/GenericHeader.php index cc48385a67b..8db9d943e1f 100644 --- a/library/Zend/Mail/Header/GenericHeader.php +++ b/library/Zend/Mail/Header/GenericHeader.php @@ -31,17 +31,33 @@ class GenericHeader implements HeaderInterface, UnstructuredInterface public static function fromString($headerLine) { $decodedLine = iconv_mime_decode($headerLine, ICONV_MIME_DECODE_CONTINUE_ON_ERROR, 'UTF-8'); - $parts = explode(':', $decodedLine, 2); - if (count($parts) != 2) { - throw new Exception\InvalidArgumentException('Header must match with the format "name: value"'); - } - $header = new static($parts[0], ltrim($parts[1])); + list($name, $value) = GenericHeader::splitHeaderLine($decodedLine); + $header = new static($name, $value); if ($decodedLine != $headerLine) { $header->setEncoding('UTF-8'); } return $header; } + /** + * Splits the header line in `name` and `value` parts. + * + * @param string $headerLine + * @return string[] `name` in the first index and `value` in the second. + * @throws Exception\InvalidArgumentException If header does not match with the format ``name:value`` + */ + public static function splitHeaderLine($headerLine) + { + $parts = explode(':', $headerLine, 2); + if (count($parts) !== 2) { + throw new Exception\InvalidArgumentException('Header must match with the format "name:value"'); + } + + $parts[1] = ltrim($parts[1]); + + return $parts; + } + /** * Constructor * @@ -76,7 +92,7 @@ public function setFieldName($fieldName) $fieldName = str_replace(' ', '-', ucwords(str_replace(array('_', '-'), ' ', $fieldName))); // Validate what we have - if (!preg_match('/^[\x21-\x39\x3B-\x7E]*$/i', $fieldName)) { + if (!preg_match('/^[\x21-\x39\x3B-\x7E]*$/', $fieldName)) { throw new Exception\InvalidArgumentException( 'Header name must be composed of printable US-ASCII characters, except colon.' ); diff --git a/library/Zend/Mail/Header/GenericMultiHeader.php b/library/Zend/Mail/Header/GenericMultiHeader.php index 2c56d7a904a..a77ba43d531 100644 --- a/library/Zend/Mail/Header/GenericMultiHeader.php +++ b/library/Zend/Mail/Header/GenericMultiHeader.php @@ -17,11 +17,7 @@ class GenericMultiHeader extends GenericHeader implements MultipleHeadersInterfa public static function fromString($headerLine) { $decodedLine = iconv_mime_decode($headerLine, ICONV_MIME_DECODE_CONTINUE_ON_ERROR, 'UTF-8'); - $parts = explode(': ', $decodedLine, 2); - if (count($parts) != 2) { - throw new Exception\InvalidArgumentException('Header must match with the format "name: value"'); - } - list($fieldName, $fieldValue) = $parts; + list($fieldName, $fieldValue) = GenericHeader::splitHeaderLine($decodedLine); if (strpos($fieldValue, ',')) { $headers = array(); diff --git a/library/Zend/Mail/Header/HeaderInterface.php b/library/Zend/Mail/Header/HeaderInterface.php index 5ff0e8d30b4..35803cf9bfa 100644 --- a/library/Zend/Mail/Header/HeaderInterface.php +++ b/library/Zend/Mail/Header/HeaderInterface.php @@ -31,6 +31,8 @@ interface HeaderInterface * * @param string $headerLine * @return self + * @throws Exception\InvalidArgumentException If the header does not match with RFC 2822 definition. + * @see http://tools.ietf.org/html/rfc2822#section-2.2 */ public static function fromString($headerLine); diff --git a/library/Zend/Mail/Header/MessageId.php b/library/Zend/Mail/Header/MessageId.php index a399e2b64cb..27ef7156397 100644 --- a/library/Zend/Mail/Header/MessageId.php +++ b/library/Zend/Mail/Header/MessageId.php @@ -20,7 +20,7 @@ class MessageId implements HeaderInterface public static function fromString($headerLine) { - list($name, $value) = explode(': ', $headerLine, 2); + list($name, $value) = GenericHeader::splitHeaderLine($headerLine); // check to ensure proper header type for this factory if (strtolower($name) !== 'message-id') { diff --git a/library/Zend/Mail/Header/MimeVersion.php b/library/Zend/Mail/Header/MimeVersion.php index 2a98426eb86..52474e4a4fe 100644 --- a/library/Zend/Mail/Header/MimeVersion.php +++ b/library/Zend/Mail/Header/MimeVersion.php @@ -18,7 +18,7 @@ class MimeVersion implements HeaderInterface public static function fromString($headerLine) { - list($name, $value) = explode(': ', $headerLine, 2); + list($name, $value) = GenericHeader::splitHeaderLine($headerLine); // check to ensure proper header type for this factory if (strtolower($name) !== 'mime-version') { @@ -28,7 +28,7 @@ public static function fromString($headerLine) // Check for version, and set if found $header = new static(); if (preg_match('/^(?P\d+\.\d+)$/', $value, $matches)) { - $header->version = $matches['version']; + $header->setVersion($matches['version']); } return $header; diff --git a/library/Zend/Mail/Header/Received.php b/library/Zend/Mail/Header/Received.php index 36b3804522a..5ff26cd8a17 100644 --- a/library/Zend/Mail/Header/Received.php +++ b/library/Zend/Mail/Header/Received.php @@ -23,19 +23,23 @@ class Received implements HeaderInterface, MultipleHeadersInterface public static function fromString($headerLine) { - list($name, $value) = explode(': ', $headerLine, 2); + list($name, $value) = GenericHeader::splitHeaderLine($headerLine); // check to ensure proper header type for this factory if (strtolower($name) !== 'received') { throw new Exception\InvalidArgumentException('Invalid header line for Received string'); } - $header = new static(); - $header->value= $value; + $header = new static($value); return $header; } + public function __construct($value = '') + { + $this->value = $value; + } + public function getFieldName() { return 'Received'; diff --git a/library/Zend/Mail/Header/Sender.php b/library/Zend/Mail/Header/Sender.php index 4dd1be32e8b..20d329e2a88 100644 --- a/library/Zend/Mail/Header/Sender.php +++ b/library/Zend/Mail/Header/Sender.php @@ -28,7 +28,7 @@ class Sender implements HeaderInterface public static function fromString($headerLine) { $decodedLine = iconv_mime_decode($headerLine, ICONV_MIME_DECODE_CONTINUE_ON_ERROR, 'UTF-8'); - list($name, $value) = explode(': ', $decodedLine, 2); + list($name, $value) = GenericHeader::splitHeaderLine($decodedLine); // check to ensure proper header type for this factory if (strtolower($name) !== 'sender') { diff --git a/library/Zend/Mail/Header/Subject.php b/library/Zend/Mail/Header/Subject.php index 8f40d95f978..0a149340814 100644 --- a/library/Zend/Mail/Header/Subject.php +++ b/library/Zend/Mail/Header/Subject.php @@ -26,8 +26,7 @@ class Subject implements UnstructuredInterface public static function fromString($headerLine) { $decodedLine = iconv_mime_decode($headerLine, ICONV_MIME_DECODE_CONTINUE_ON_ERROR, 'UTF-8'); - list($name, $value) = explode(':', $decodedLine, 2); - $value = ltrim($value); + list($name, $value) = GenericHeader::splitHeaderLine($decodedLine); // check to ensure proper header type for this factory if (strtolower($name) !== 'subject') { diff --git a/tests/ZendTest/Mail/HeadersTest.php b/tests/ZendTest/Mail/HeadersTest.php index 2122d12e2ba..0f99a14cbf8 100644 --- a/tests/ZendTest/Mail/HeadersTest.php +++ b/tests/ZendTest/Mail/HeadersTest.php @@ -138,7 +138,10 @@ public function testHeadersAggregatesHeaderThroughAddHeaderLine() public function testHeadersAddHeaderLineThrowsExceptionOnMissingFieldValue() { - $this->setExpectedException('Zend\Mail\Header\Exception\InvalidArgumentException', 'Header must match with the format "name: value"'); + $this->setExpectedException( + 'Zend\Mail\Header\Exception\InvalidArgumentException', + 'Header must match with the format "name:value"' + ); $headers = new Mail\Headers(); $headers->addHeaderLine('Foo'); }