Skip to content

Commit 06cab9d

Browse files
samsonasikweierophinney
authored andcommittedJul 28, 2020
Fixes #39 Fixes #40 remove laminas-loader dependency
Signed-off-by: Abdul Malik Ikhsan <samsonasik@gmail.com>
1 parent 28df66a commit 06cab9d

File tree

5 files changed

+156
-72
lines changed

5 files changed

+156
-72
lines changed
 

‎composer.json

-1
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@
3131
"require": {
3232
"php": "^5.6 || ^7.0",
3333
"ext-iconv": "*",
34-
"laminas/laminas-loader": "^2.5",
3534
"laminas/laminas-mime": "^2.5",
3635
"laminas/laminas-stdlib": "^2.7 || ^3.0",
3736
"laminas/laminas-validator": "^2.10.2",

‎src/Header/HeaderLoader.php

+36-3
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,10 @@
88

99
namespace Laminas\Mail\Header;
1010

11-
use Laminas\Loader\PluginClassLoader;
12-
1311
/**
1412
* Plugin Class Loader implementation for HTTP headers
1513
*/
16-
class HeaderLoader extends PluginClassLoader
14+
class HeaderLoader
1715
{
1816
/**
1917
* @var array Pre-aliased Header plugins
@@ -46,4 +44,39 @@ class HeaderLoader extends PluginClassLoader
4644
'subject' => Subject::class,
4745
'to' => To::class,
4846
];
47+
48+
/**
49+
* @param string $name
50+
* @param string|null $default
51+
* @return string|null
52+
*/
53+
public function get($name, $default = null)
54+
{
55+
$name = $this->normalizeName($name);
56+
return isset($this->headerClassMap[$name]) ? $this->headerClassMap[$name] : $default;
57+
}
58+
59+
/**
60+
* @param string $name
61+
* @return bool
62+
*/
63+
public function has($name)
64+
{
65+
return isset($this->headerClassMap[$this->normalizeName($name)]);
66+
}
67+
68+
public function add($name, $class)
69+
{
70+
$this->headerClassMap[$this->normalizeName($name)] = $class;
71+
}
72+
73+
public function remove($name)
74+
{
75+
unset($this->headerClassMap[$this->normalizeName($name)]);
76+
}
77+
78+
private function normalizeName($name)
79+
{
80+
return strtolower($name);
81+
}
4982
}

‎src/Headers.php

+17-30
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
use ArrayIterator;
1212
use Countable;
1313
use Iterator;
14-
use Laminas\Loader\PluginClassLocator;
1514
use Laminas\Mail\Header\GenericHeader;
1615
use Laminas\Mail\Header\HeaderInterface;
1716
use Traversable;
@@ -30,9 +29,9 @@ class Headers implements Countable, Iterator
3029
const FOLDING = "\r\n ";
3130

3231
/**
33-
* @var \Laminas\Loader\PluginClassLoader
32+
* @var Header\HeaderLoader
3433
*/
35-
protected $pluginClassLoader = null;
34+
protected $headerLoader = null;
3635

3736
/**
3837
* @var array key names for $headers array
@@ -118,31 +117,6 @@ public static function fromString($string, $EOL = self::EOL)
118117
return $headers;
119118
}
120119

121-
/**
122-
* Set an alternate implementation for the PluginClassLoader
123-
*
124-
* @param PluginClassLocator $pluginClassLoader
125-
* @return Headers
126-
*/
127-
public function setPluginClassLoader(PluginClassLocator $pluginClassLoader)
128-
{
129-
$this->pluginClassLoader = $pluginClassLoader;
130-
return $this;
131-
}
132-
133-
/**
134-
* Return an instance of a PluginClassLocator, lazyload and inject map if necessary
135-
*
136-
* @return PluginClassLocator
137-
*/
138-
public function getPluginClassLoader()
139-
{
140-
if ($this->pluginClassLoader === null) {
141-
$this->pluginClassLoader = new Header\HeaderLoader();
142-
}
143-
return $this->pluginClassLoader;
144-
}
145-
146120
/**
147121
* Set the header encoding
148122
*
@@ -481,7 +455,7 @@ public function loadHeader($headerLine)
481455
list($name, ) = Header\GenericHeader::splitHeaderLine($headerLine);
482456

483457
/** @var HeaderInterface $class */
484-
$class = $this->getPluginClassLoader()->load($name) ?: Header\GenericHeader::class;
458+
$class = $this->resolveHeaderClass($name);
485459
return $class::fromString($headerLine);
486460
}
487461

@@ -496,7 +470,7 @@ protected function lazyLoadHeader($index)
496470
$key = $this->headersKeys[$index];
497471

498472
/** @var GenericHeader $class */
499-
$class = ($this->getPluginClassLoader()->load($key)) ?: Header\GenericHeader::class;
473+
$class = $this->resolveHeaderClass($key);
500474

501475
$encoding = $current->getEncoding();
502476
$headers = $class::fromString($current->toString());
@@ -528,4 +502,17 @@ protected function normalizeFieldName($fieldName)
528502
{
529503
return str_replace(['-', '_', ' ', '.'], '', strtolower($fieldName));
530504
}
505+
506+
/**
507+
* @param string $key
508+
* @return string
509+
*/
510+
private function resolveHeaderClass($key)
511+
{
512+
if ($this->headerLoader === null) {
513+
$this->headerLoader = new Header\HeaderLoader();
514+
}
515+
516+
return $this->headerLoader->get($key, Header\GenericHeader::class);
517+
}
531518
}

‎test/Header/HeaderLoaderTest.php

+102
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
<?php
2+
3+
/**
4+
* @see https://github.com/laminas/laminas-mail for the canonical source repository
5+
* @copyright https://github.com/laminas/laminas-mail/blob/master/COPYRIGHT.md
6+
* @license https://github.com/laminas/laminas-mail/blob/master/LICENSE.md New BSD License
7+
*/
8+
9+
namespace LaminasTest\Mail\Header;
10+
11+
use PHPUnit\Framework\TestCase;
12+
use Laminas\Mail\Header;
13+
14+
class HeaderLoaderTest extends TestCase
15+
{
16+
/**
17+
* @var Header\HeaderLoader
18+
*/
19+
private $headerLoader;
20+
21+
public function setUp()
22+
{
23+
$this->headerLoader = new Header\HeaderLoader();
24+
}
25+
26+
public function provideHeaderNames()
27+
{
28+
return [
29+
'with existing name' => ['to', Header\To::class],
30+
'with non-existent name' => ['foo', null],
31+
'with default value' => ['foo', Header\GenericHeader::class, Header\GenericHeader::class],
32+
];
33+
}
34+
35+
/**
36+
* @param $name
37+
* @param $expected
38+
* @param $default
39+
* @dataProvider provideHeaderNames
40+
*/
41+
public function testHeaderIsProperlyLoaded($name, $expected, $default = null)
42+
{
43+
$this->assertEquals($expected, $this->headerLoader->get($name, $default));
44+
}
45+
46+
public function testHeaderExistenceIsProperlyChecked()
47+
{
48+
$this->assertTrue($this->headerLoader->has('to'));
49+
$this->assertTrue($this->headerLoader->has('To'));
50+
$this->assertTrue($this->headerLoader->has('Reply_to'));
51+
$this->assertTrue($this->headerLoader->has('SUBJECT'));
52+
$this->assertFalse($this->headerLoader->has('foo'));
53+
$this->assertFalse($this->headerLoader->has('bar'));
54+
}
55+
56+
public function testHeaderCanBeAdded()
57+
{
58+
$this->assertFalse($this->headerLoader->has('foo'));
59+
$this->headerLoader->add('foo', Header\GenericHeader::class);
60+
$this->assertTrue($this->headerLoader->has('foo'));
61+
}
62+
63+
public function testHeaderCanBeRemoved()
64+
{
65+
$this->assertTrue($this->headerLoader->has('to'));
66+
$this->headerLoader->remove('to');
67+
$this->assertFalse($this->headerLoader->has('to'));
68+
}
69+
70+
public static function expectedHeaders()
71+
{
72+
return [
73+
['bcc', Header\Bcc::class],
74+
['cc', Header\Cc::class],
75+
['contenttype', Header\ContentType::class],
76+
['content_type', Header\ContentType::class],
77+
['content-type', Header\ContentType::class],
78+
['date', Header\Date::class],
79+
['from', Header\From::class],
80+
['mimeversion', Header\MimeVersion::class],
81+
['mime_version', Header\MimeVersion::class],
82+
['mime-version', Header\MimeVersion::class],
83+
['received', Header\Received::class],
84+
['replyto', Header\ReplyTo::class],
85+
['reply_to', Header\ReplyTo::class],
86+
['reply-to', Header\ReplyTo::class],
87+
['sender', Header\Sender::class],
88+
['subject', Header\Subject::class],
89+
['to', Header\To::class],
90+
];
91+
}
92+
93+
/**
94+
* @dataProvider expectedHeaders
95+
* @param $name
96+
* @param $class
97+
*/
98+
public function testDefaultHeadersMapResolvesProperHeader($name, $class)
99+
{
100+
$this->assertEquals($class, $this->headerLoader->get($name));
101+
}
102+
}

‎test/HeadersTest.php

+1-38
Original file line numberDiff line numberDiff line change
@@ -117,10 +117,7 @@ public function testPluginClassLoaderAccessors()
117117
public function testHeadersFromStringMultiHeaderWillAggregateLazyLoadedHeaders()
118118
{
119119
$headers = new Mail\Headers();
120-
/* @var $pcl \Laminas\Loader\PluginClassLoader */
121-
$pcl = $headers->getPluginClassLoader();
122-
$pcl->registerPlugin('foo', GenericMultiHeader::class);
123-
$headers->addHeaderLine('foo: bar1,bar2,bar3');
120+
$headers->addHeaderLine('foo', ['bar1@domain.com', 'bar2@domain.com', 'bar3@domain.com']);
124121
$headers->forceLoading();
125122
$this->assertEquals(3, $headers->count());
126123
}
@@ -409,40 +406,6 @@ public function testToArrayFormatEncoded()
409406
$this->assertEquals($expected, $array);
410407
}
411408

412-
public static function expectedHeaders()
413-
{
414-
return [
415-
['bcc', Header\Bcc::class],
416-
['cc', Header\Cc::class],
417-
['contenttype', Header\ContentType::class],
418-
['content_type', Header\ContentType::class],
419-
['content-type', Header\ContentType::class],
420-
['date', Header\Date::class],
421-
['from', Header\From::class],
422-
['mimeversion', Header\MimeVersion::class],
423-
['mime_version', Header\MimeVersion::class],
424-
['mime-version', Header\MimeVersion::class],
425-
['received', Header\Received::class],
426-
['replyto', Header\ReplyTo::class],
427-
['reply_to', Header\ReplyTo::class],
428-
['reply-to', Header\ReplyTo::class],
429-
['sender', Header\Sender::class],
430-
['subject', Header\Subject::class],
431-
['to', Header\To::class],
432-
];
433-
}
434-
435-
/**
436-
* @dataProvider expectedHeaders
437-
*/
438-
public function testDefaultPluginLoaderIsSeededWithHeaders($plugin, $class)
439-
{
440-
$headers = new Mail\Headers();
441-
$loader = $headers->getPluginClassLoader();
442-
$test = $loader->load($plugin);
443-
$this->assertEquals($class, $test);
444-
}
445-
446409
public function testClone()
447410
{
448411
$headers = new Mail\Headers();

0 commit comments

Comments
 (0)
Please sign in to comment.