Skip to content

Commit

Permalink
Merge pull request #2986 from frankforte/custom-headers
Browse files Browse the repository at this point in the history
Improvements for `clearCustomHeader` and `replaceCustomerHeader`
  • Loading branch information
Synchro committed Nov 25, 2023
2 parents 677ff5b + 8a91dd6 commit d5615bf
Show file tree
Hide file tree
Showing 2 changed files with 70 additions and 5 deletions.
48 changes: 44 additions & 4 deletions src/PHPMailer.php
Original file line number Diff line number Diff line change
Expand Up @@ -4101,24 +4101,63 @@ public function clearCustomHeaders()
}

/**
* Clear a specific custom header.
* Clear a specific custom header by name or name and value.
* $name value can be overloaded to contain
* both header name and value (name:value).
*
* @param string $name Custom header name
* @param string|null $value Header value
*
* @return bool True if a header was replaced successfully
*/
public function clearCustomHeader($name)
public function clearCustomHeader($name, $value = null)
{
if (null === $value && strpos($name, ':') !== false) {
//Value passed in as name:value
list($name, $value) = explode(':', $name, 2);
}
$name = trim($name);
$value = (null === $value) ? null : trim($value);

foreach ($this->CustomHeader as $k => $pair) {
if ($pair[0] == $name) {
unset($this->CustomHeader[$k]);
// We remove the header if the value is not provided or it matches.
if (null === $value || $pair[1] == $value) {
unset($this->CustomHeader[$k]);
}
}
}

return true;
}

/**
* Replace a custom header.
* $name value can be overloaded to contain
* both header name and value (name:value).
*
* @param string $name Custom header name
* @param string|null $value Header value
*
* @return bool True if a header was replaced successfully
* @throws Exception
*/
public function replaceCustomHeader($name, $value)
public function replaceCustomHeader($name, $value = null)
{
if (null === $value && strpos($name, ':') !== false) {
//Value passed in as name:value
list($name, $value) = explode(':', $name, 2);
}
$name = trim($name);
$value = (null === $value) ? '' : trim($value);

$replaced = false;
foreach ($this->CustomHeader as $k => $pair) {
if ($pair[0] == $name) {
if ($replaced) {
unset($this->CustomHeader[$k]);
continue;
}
if (strpbrk($name . $value, "\r\n") !== false) {
if ($this->exceptions) {
throw new Exception($this->lang('invalid_header'));
Expand All @@ -4127,6 +4166,7 @@ public function replaceCustomHeader($name, $value)
return false;
}
$this->CustomHeader[$k] = [$name, $value];
$replaced = true;
}
}

Expand Down
27 changes: 26 additions & 1 deletion test/PHPMailer/CustomHeaderTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -197,8 +197,10 @@ public function dataAddCustomHeaderInvalid()
*/
public function testClearCustomHeader()
{
// make sure 'foo' is cleared, even if there is more than one header set.
$this->Mail->addCustomHeader('foo', 'bar');
self::assertSame([['foo', 'bar']], $this->Mail->getCustomHeaders());
$this->Mail->addCustomHeader('foo', 'baz');
self::assertSame([['foo', 'bar'], ['foo', 'baz']], $this->Mail->getCustomHeaders());

$this->Mail->clearCustomHeader('foo');

Expand All @@ -207,6 +209,29 @@ public function testClearCustomHeader()
self::assertEmpty($cleared);
}

/**
* Test removing previously set custom header value.
*
* @covers \PHPMailer\PHPMailer\PHPMailer::clearCustomHeader
*/
public function testClearCustomHeaderValue()
{
// Test clearing 'name', 'value'
$this->Mail->addCustomHeader('foo', 'bar');
$this->Mail->addCustomHeader('foo', 'baz');
self::assertSame([['foo', 'bar'], ['foo', 'baz']], $this->Mail->getCustomHeaders());

$this->Mail->clearCustomHeader('foo', 'bar');
self::assertSame([['foo', 'baz']], array_values($this->Mail->getCustomHeaders()));

// Test clearing 'name: value'
$this->Mail->addCustomHeader('foo', 'bar');
self::assertSame([['foo', 'baz'], ['foo', 'bar']], array_values($this->Mail->getCustomHeaders()));

$this->Mail->clearCustomHeader('foo: bar');
self::assertSame([['foo', 'baz']], array_values($this->Mail->getCustomHeaders()));
}

/**
* Test removing previously set custom headers.
*
Expand Down

0 comments on commit d5615bf

Please sign in to comment.