Skip to content
This repository has been archived by the owner on Feb 21, 2020. It is now read-only.

Commit

Permalink
Drop dependency on zendframework/zend-loader
Browse files Browse the repository at this point in the history
  • Loading branch information
xgin committed Nov 20, 2019
1 parent 398bc5a commit 2eb04e8
Show file tree
Hide file tree
Showing 5 changed files with 170 additions and 109 deletions.
1 change: 0 additions & 1 deletion composer.json
Expand Up @@ -18,7 +18,6 @@
"require": {
"php": "^5.6 || ^7.0",
"ext-iconv": "*",
"zendframework/zend-loader": "^2.5",
"zendframework/zend-mime": "^2.5",
"zendframework/zend-stdlib": "^2.7 || ^3.0",
"zendframework/zend-validator": "^2.10.2",
Expand Down
90 changes: 59 additions & 31 deletions src/Header/HeaderLoader.php
Expand Up @@ -7,39 +7,67 @@

namespace Zend\Mail\Header;

use Zend\Loader\PluginClassLoader;

/**
* Plugin Class Loader implementation for HTTP headers
*/
class HeaderLoader extends PluginClassLoader
class HeaderLoader
{
/**
* @var array Pre-aliased Header plugins
* @var array Pre-aliased Header classes
*/
protected $plugins = [
'bcc' => 'Zend\Mail\Header\Bcc',
'cc' => 'Zend\Mail\Header\Cc',
'contenttype' => 'Zend\Mail\Header\ContentType',
'content_type' => 'Zend\Mail\Header\ContentType',
'content-type' => 'Zend\Mail\Header\ContentType',
'contenttransferencoding' => 'Zend\Mail\Header\ContentTransferEncoding',
'content_transfer_encoding' => 'Zend\Mail\Header\ContentTransferEncoding',
'content-transfer-encoding' => 'Zend\Mail\Header\ContentTransferEncoding',
'date' => 'Zend\Mail\Header\Date',
'from' => 'Zend\Mail\Header\From',
'in-reply-to' => 'Zend\Mail\Header\InReplyTo',
'message-id' => 'Zend\Mail\Header\MessageId',
'mimeversion' => 'Zend\Mail\Header\MimeVersion',
'mime_version' => 'Zend\Mail\Header\MimeVersion',
'mime-version' => 'Zend\Mail\Header\MimeVersion',
'received' => 'Zend\Mail\Header\Received',
'references' => 'Zend\Mail\Header\References',
'replyto' => 'Zend\Mail\Header\ReplyTo',
'reply_to' => 'Zend\Mail\Header\ReplyTo',
'reply-to' => 'Zend\Mail\Header\ReplyTo',
'sender' => 'Zend\Mail\Header\Sender',
'subject' => 'Zend\Mail\Header\Subject',
'to' => 'Zend\Mail\Header\To',
private $headerClassMap = [
'bcc' => Bcc::class,
'cc' => Cc::class,
'contenttype' => ContentType::class,
'content_type' => ContentType::class,
'content-type' => ContentType::class,
'contenttransferencoding' => ContentTransferEncoding::class,
'content_transfer_encoding' => ContentTransferEncoding::class,
'content-transfer-encoding' => ContentTransferEncoding::class,
'date' => Date::class,
'from' => From::class,
'message-id' => MessageId::class,
'mimeversion' => MimeVersion::class,
'mime_version' => MimeVersion::class,
'mime-version' => MimeVersion::class,
'received' => Received::class,
'replyto' => ReplyTo::class,
'reply_to' => ReplyTo::class,
'reply-to' => ReplyTo::class,
'sender' => Sender::class,
'subject' => Subject::class,
'to' => To::class,
];

/**
* @param string $name
* @param string|null $default
* @return string|null
*/
public function get($name, $default = null)
{
$name = $this->normalizeName($name);
return isset($this->headerClassMap[$name]) ? $this->headerClassMap[$name] : $default;
}

/**
* @param string $name
* @return bool
*/
public function has($name)
{
return isset($this->headerClassMap[$this->normalizeName($name)]);
}

public function add($name, $class)
{
$this->headerClassMap[$this->normalizeName($name)] = $class;
}

public function remove($name)
{
unset($this->headerClassMap[$this->normalizeName($name)]);
}

private function normalizeName($name)
{
return strtolower($name);
}
}
55 changes: 16 additions & 39 deletions src/Headers.php
Expand Up @@ -11,9 +11,6 @@
use Countable;
use Iterator;
use Traversable;
use Zend\Loader\PluginClassLocator;
use Zend\Mail\Header\GenericHeader;
use Zend\Mail\Header\HeaderInterface;

/**
* Basic mail headers collection functionality
Expand All @@ -29,9 +26,9 @@ class Headers implements Countable, Iterator
const FOLDING = "\r\n ";

/**
* @var \Zend\Loader\PluginClassLoader
* @var Header\HeaderLoader
*/
protected $pluginClassLoader = null;
protected $headerLoader;

/**
* @var array key names for $headers array
Expand Down Expand Up @@ -117,31 +114,6 @@ public static function fromString($string, $EOL = self::EOL)
return $headers;
}

/**
* Set an alternate implementation for the PluginClassLoader
*
* @param PluginClassLocator $pluginClassLoader
* @return Headers
*/
public function setPluginClassLoader(PluginClassLocator $pluginClassLoader)
{
$this->pluginClassLoader = $pluginClassLoader;
return $this;
}

/**
* Return an instance of a PluginClassLocator, lazyload and inject map if necessary
*
* @return PluginClassLocator
*/
public function getPluginClassLoader()
{
if ($this->pluginClassLoader === null) {
$this->pluginClassLoader = new Header\HeaderLoader();
}
return $this->pluginClassLoader;
}

/**
* Set the header encoding
*
Expand Down Expand Up @@ -356,7 +328,6 @@ public function next()
{
next($this->headers);
}

/**
* Return the current key for this object as an iterator
*
Expand Down Expand Up @@ -385,7 +356,6 @@ public function rewind()
{
reset($this->headers);
}

/**
* Return the current value for this iterator, lazy loading it if need be
*
Expand Down Expand Up @@ -478,9 +448,7 @@ public function forceLoading()
public function loadHeader($headerLine)
{
list($name, ) = Header\GenericHeader::splitHeaderLine($headerLine);

/** @var HeaderInterface $class */
$class = $this->getPluginClassLoader()->load($name) ?: Header\GenericHeader::class;
$class = $this->resolveHeaderClass($name);
return $class::fromString($headerLine);
}

Expand All @@ -493,10 +461,7 @@ protected function lazyLoadHeader($index)
$current = $this->headers[$index];

$key = $this->headersKeys[$index];

/** @var GenericHeader $class */
$class = ($this->getPluginClassLoader()->load($key)) ?: 'Zend\Mail\Header\GenericHeader';

$class = $this->resolveHeaderClass($key);
$encoding = $current->getEncoding();
$headers = $class::fromString($current->toString());
if (is_array($headers)) {
Expand Down Expand Up @@ -527,4 +492,16 @@ protected function normalizeFieldName($fieldName)
{
return str_replace(['-', '_', ' ', '.'], '', strtolower($fieldName));
}

/**
* @param string $key
* @return string
*/
private function resolveHeaderClass($key)
{
if ($this->headerLoader === null) {
$this->headerLoader = new Header\HeaderLoader();
}
return $this->headerLoader->get($key, Header\GenericHeader::class);
}
}
94 changes: 94 additions & 0 deletions test/Header/HeaderLoaderTest.php
@@ -0,0 +1,94 @@
<?php
/**
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2018 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
namespace ZendTest\Mail\Header;

use PHPUnit\Framework\TestCase;
use Zend\Mail\Header;

class HeaderLoaderTest extends TestCase
{
/**
* @var Header\HeaderLoader
*/
private $headerLoader;
public function setUp()
{
$this->headerLoader = new Header\HeaderLoader();
}
public function provideHeaderNames()
{
return [
'with existing name' => ['to', Header\To::class],
'with non-existent name' => ['foo', null],
'with default value' => ['foo', Header\GenericHeader::class, Header\GenericHeader::class],
];
}
/**
* @param $name
* @param $expected
* @param $default
* @dataProvider provideHeaderNames
*/
public function testHeaderIsProperlyLoaded($name, $expected, $default = null)
{
$this->assertEquals($expected, $this->headerLoader->get($name, $default));
}
public function testHeaderExistenceIsProperlyChecked()
{
$this->assertTrue($this->headerLoader->has('to'));
$this->assertTrue($this->headerLoader->has('To'));
$this->assertTrue($this->headerLoader->has('Reply_to'));
$this->assertTrue($this->headerLoader->has('SUBJECT'));
$this->assertFalse($this->headerLoader->has('foo'));
$this->assertFalse($this->headerLoader->has('bar'));
}
public function testHeaderCanBeAdded()
{
$this->assertFalse($this->headerLoader->has('foo'));
$this->headerLoader->add('foo', Header\GenericHeader::class);
$this->assertTrue($this->headerLoader->has('foo'));
}
public function testHeaderCanBeRemoved()
{
$this->assertTrue($this->headerLoader->has('to'));
$this->headerLoader->remove('to');
$this->assertFalse($this->headerLoader->has('to'));
}
public static function expectedHeaders()
{
return [
['bcc', Header\Bcc::class],
['cc', Header\Cc::class],
['contenttype', Header\ContentType::class],
['content_type', Header\ContentType::class],
['content-type', Header\ContentType::class],
['date', Header\Date::class],
['from', Header\From::class],
['mimeversion', Header\MimeVersion::class],
['mime_version', Header\MimeVersion::class],
['mime-version', Header\MimeVersion::class],
['received', Header\Received::class],
['replyto', Header\ReplyTo::class],
['reply_to', Header\ReplyTo::class],
['reply-to', Header\ReplyTo::class],
['sender', Header\Sender::class],
['subject', Header\Subject::class],
['to', Header\To::class],
];
}
/**
* @dataProvider expectedHeaders
* @param $name
* @param $class
*/
public function testDefaultHeadersMapResolvesProperHeader($name, $class)
{
$this->assertEquals($class, $this->headerLoader->get($name));
}
}
39 changes: 1 addition & 38 deletions test/HeadersTest.php
Expand Up @@ -97,10 +97,7 @@ public function testHeadersFromStringFactoryCreatesMultipleObjects()
public function testHeadersFromStringMultiHeaderWillAggregateLazyLoadedHeaders()
{
$headers = new Mail\Headers();
/* @var $pcl \Zend\Loader\PluginClassLoader */
$pcl = $headers->getPluginClassLoader();
$pcl->registerPlugin('foo', 'Zend\Mail\Header\GenericMultiHeader');
$headers->addHeaderLine('foo: bar1,bar2,bar3');
$headers->addHeaderLine('foo', ['bar1@domain.com', 'bar2@domain.com', 'bar3@domain.com']);
$headers->forceLoading();
$this->assertEquals(3, $headers->count());
}
Expand Down Expand Up @@ -354,40 +351,6 @@ public function testToArrayFormatEncoded()
$this->assertEquals($expected, $array);
}

public static function expectedHeaders()
{
return [
['bcc', 'Zend\Mail\Header\Bcc'],
['cc', 'Zend\Mail\Header\Cc'],
['contenttype', 'Zend\Mail\Header\ContentType'],
['content_type', 'Zend\Mail\Header\ContentType'],
['content-type', 'Zend\Mail\Header\ContentType'],
['date', 'Zend\Mail\Header\Date'],
['from', 'Zend\Mail\Header\From'],
['mimeversion', 'Zend\Mail\Header\MimeVersion'],
['mime_version', 'Zend\Mail\Header\MimeVersion'],
['mime-version', 'Zend\Mail\Header\MimeVersion'],
['received', 'Zend\Mail\Header\Received'],
['replyto', 'Zend\Mail\Header\ReplyTo'],
['reply_to', 'Zend\Mail\Header\ReplyTo'],
['reply-to', 'Zend\Mail\Header\ReplyTo'],
['sender', 'Zend\Mail\Header\Sender'],
['subject', 'Zend\Mail\Header\Subject'],
['to', 'Zend\Mail\Header\To'],
];
}

/**
* @dataProvider expectedHeaders
*/
public function testDefaultPluginLoaderIsSeededWithHeaders($plugin, $class)
{
$headers = new Mail\Headers();
$loader = $headers->getPluginClassLoader();
$test = $loader->load($plugin);
$this->assertEquals($class, $test);
}

public function testClone()
{
$headers = new Mail\Headers();
Expand Down

0 comments on commit 2eb04e8

Please sign in to comment.