nginxsonarrradarrplexorganizrdashboardbookmarkapplication-dashboardmuximuxlandingpagestartpagelandinghtpcserverhomepagesabnzbdheimdallembycouchpotatonzbget
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
274 lines
11 KiB
274 lines
11 KiB
<?php
|
|
|
|
/*
|
|
* This file is part of the Symfony package.
|
|
*
|
|
* (c) Fabien Potencier <fabien@symfony.com>
|
|
*
|
|
* For the full copyright and license information, please view the LICENSE
|
|
* file that was distributed with this source code.
|
|
*/
|
|
|
|
namespace Symfony\Component\Mime\Tests\Header;
|
|
|
|
use PHPUnit\Framework\TestCase;
|
|
use Symfony\Component\Mime\Header\ParameterizedHeader;
|
|
|
|
class ParameterizedHeaderTest extends TestCase
|
|
{
|
|
private $charset = 'utf-8';
|
|
private $lang = 'en-us';
|
|
|
|
public function testValueIsReturnedVerbatim()
|
|
{
|
|
$header = new ParameterizedHeader('Content-Type', 'text/plain');
|
|
$this->assertEquals('text/plain', $header->getValue());
|
|
}
|
|
|
|
public function testParametersAreAppended()
|
|
{
|
|
/* -- RFC 2045, 5.1
|
|
parameter := attribute "=" value
|
|
|
|
attribute := token
|
|
; Matching of attributes
|
|
; is ALWAYS case-insensitive.
|
|
|
|
value := token / quoted-string
|
|
|
|
token := 1*<any (US-ASCII) CHAR except SPACE, CTLs,
|
|
or tspecials>
|
|
|
|
tspecials := "(" / ")" / "<" / ">" / "@" /
|
|
"," / ";" / ":" / "\" / <">
|
|
"/" / "[" / "]" / "?" / "="
|
|
; Must be in quoted-string,
|
|
; to use within parameter values
|
|
*/
|
|
|
|
$header = new ParameterizedHeader('Content-Type', 'text/plain');
|
|
$header->setParameters(['charset' => 'utf-8']);
|
|
$this->assertEquals('text/plain; charset=utf-8', $header->getBodyAsString());
|
|
}
|
|
|
|
public function testSpaceInParamResultsInQuotedString()
|
|
{
|
|
$header = new ParameterizedHeader('Content-Type', 'attachment');
|
|
$header->setParameters(['filename' => 'my file.txt']);
|
|
$this->assertEquals('attachment; filename="my file.txt"', $header->getBodyAsString());
|
|
}
|
|
|
|
public function testLongParamsAreBrokenIntoMultipleAttributeStrings()
|
|
{
|
|
/* -- RFC 2231, 3.
|
|
The asterisk character ("*") followed
|
|
by a decimal count is employed to indicate that multiple parameters
|
|
are being used to encapsulate a single parameter value. The count
|
|
starts at 0 and increments by 1 for each subsequent section of the
|
|
parameter value. Decimal values are used and neither leading zeroes
|
|
nor gaps in the sequence are allowed.
|
|
|
|
The original parameter value is recovered by concatenating the
|
|
various sections of the parameter, in order. For example, the
|
|
content-type field
|
|
|
|
Content-Type: message/external-body; access-type=URL;
|
|
URL*0="ftp://";
|
|
URL*1="cs.utk.edu/pub/moore/bulk-mailer/bulk-mailer.tar"
|
|
|
|
is semantically identical to
|
|
|
|
Content-Type: message/external-body; access-type=URL;
|
|
URL="ftp://cs.utk.edu/pub/moore/bulk-mailer/bulk-mailer.tar"
|
|
|
|
Note that quotes around parameter values are part of the value
|
|
syntax; they are NOT part of the value itself. Furthermore, it is
|
|
explicitly permitted to have a mixture of quoted and unquoted
|
|
continuation fields.
|
|
*/
|
|
|
|
$value = str_repeat('a', 180);
|
|
|
|
$header = new ParameterizedHeader('Content-Disposition', 'attachment');
|
|
$header->setParameters(['filename' => $value]);
|
|
$this->assertEquals(
|
|
'attachment; '.
|
|
'filename*0*=utf-8\'\''.str_repeat('a', 60).";\r\n ".
|
|
'filename*1*='.str_repeat('a', 60).";\r\n ".
|
|
'filename*2*='.str_repeat('a', 60),
|
|
$header->getBodyAsString()
|
|
);
|
|
}
|
|
|
|
public function testEncodedParamDataIncludesCharsetAndLanguage()
|
|
{
|
|
/* -- RFC 2231, 4.
|
|
Asterisks ("*") are reused to provide the indicator that language and
|
|
character set information is present and encoding is being used. A
|
|
single quote ("'") is used to delimit the character set and language
|
|
information at the beginning of the parameter value. Percent signs
|
|
("%") are used as the encoding flag, which agrees with RFC 2047.
|
|
|
|
Specifically, an asterisk at the end of a parameter name acts as an
|
|
indicator that character set and language information may appear at
|
|
the beginning of the parameter value. A single quote is used to
|
|
separate the character set, language, and actual value information in
|
|
the parameter value string, and an percent sign is used to flag
|
|
octets encoded in hexadecimal. For example:
|
|
|
|
Content-Type: application/x-stuff;
|
|
title*=us-ascii'en-us'This%20is%20%2A%2A%2Afun%2A%2A%2A
|
|
|
|
Note that it is perfectly permissible to leave either the character
|
|
set or language field blank. Note also that the single quote
|
|
delimiters MUST be present even when one of the field values is
|
|
omitted.
|
|
*/
|
|
|
|
$value = str_repeat('a', 20).pack('C', 0x8F).str_repeat('a', 10);
|
|
$header = new ParameterizedHeader('Content-Disposition', 'attachment');
|
|
$header->setCharset('iso-8859-1');
|
|
$header->setValue('attachment');
|
|
$header->setParameters(['filename' => $value]);
|
|
$header->setLanguage($this->lang);
|
|
$this->assertEquals(
|
|
'attachment; filename*='.$header->getCharset()."'".$this->lang."'".
|
|
str_repeat('a', 20).'%8F'.str_repeat('a', 10),
|
|
$header->getBodyAsString()
|
|
);
|
|
}
|
|
|
|
public function testMultipleEncodedParamLinesAreFormattedCorrectly()
|
|
{
|
|
/* -- RFC 2231, 4.1.
|
|
Character set and language information may be combined with the
|
|
parameter continuation mechanism. For example:
|
|
|
|
Content-Type: application/x-stuff
|
|
title*0*=us-ascii'en'This%20is%20even%20more%20
|
|
title*1*=%2A%2A%2Afun%2A%2A%2A%20
|
|
title*2="isn't it!"
|
|
|
|
Note that:
|
|
|
|
(1) Language and character set information only appear at
|
|
the beginning of a given parameter value.
|
|
|
|
(2) Continuations do not provide a facility for using more
|
|
than one character set or language in the same
|
|
parameter value.
|
|
|
|
(3) A value presented using multiple continuations may
|
|
contain a mixture of encoded and unencoded segments.
|
|
|
|
(4) The first segment of a continuation MUST be encoded if
|
|
language and character set information are given.
|
|
|
|
(5) If the first segment of a continued parameter value is
|
|
encoded the language and character set field delimiters
|
|
MUST be present even when the fields are left blank.
|
|
*/
|
|
|
|
$value = str_repeat('a', 20).pack('C', 0x8F).str_repeat('a', 60);
|
|
$header = new ParameterizedHeader('Content-Disposition', 'attachment');
|
|
$header->setValue('attachment');
|
|
$header->setCharset('utf-6');
|
|
$header->setParameters(['filename' => $value]);
|
|
$header->setLanguage($this->lang);
|
|
$this->assertEquals(
|
|
'attachment; filename*0*='.$header->getCharset()."'".$this->lang."'".
|
|
str_repeat('a', 20).'%8F'.str_repeat('a', 23).";\r\n ".
|
|
'filename*1*='.str_repeat('a', 37),
|
|
$header->getBodyAsString()
|
|
);
|
|
}
|
|
|
|
public function testToString()
|
|
{
|
|
$header = new ParameterizedHeader('Content-Type', 'text/html');
|
|
$header->setParameters(['charset' => 'utf-8']);
|
|
$this->assertEquals('Content-Type: text/html; charset=utf-8', $header->toString());
|
|
}
|
|
|
|
public function testValueCanBeEncodedIfNonAscii()
|
|
{
|
|
$value = 'fo'.pack('C', 0x8F).'bar';
|
|
$header = new ParameterizedHeader('X-Foo', $value);
|
|
$header->setCharset('iso-8859-1');
|
|
$header->setParameters(['lookslike' => 'foobar']);
|
|
$this->assertEquals('X-Foo: =?'.$header->getCharset().'?Q?fo=8Fbar?=; lookslike=foobar', $header->toString());
|
|
}
|
|
|
|
public function testValueAndParamCanBeEncodedIfNonAscii()
|
|
{
|
|
$value = 'fo'.pack('C', 0x8F).'bar';
|
|
$header = new ParameterizedHeader('X-Foo', $value);
|
|
$header->setCharset('iso-8859-1');
|
|
$header->setParameters(['says' => $value]);
|
|
$this->assertEquals('X-Foo: =?'.$header->getCharset().'?Q?fo=8Fbar?=; says="=?'.$header->getCharset().'?Q?fo=8Fbar?="', $header->toString());
|
|
}
|
|
|
|
public function testParamsAreEncodedWithEncodedWordsIfNoParamEncoderSet()
|
|
{
|
|
$value = 'fo'.pack('C', 0x8F).'bar';
|
|
$header = new ParameterizedHeader('X-Foo', 'bar');
|
|
$header->setCharset('iso-8859-1');
|
|
$header->setParameters(['says' => $value]);
|
|
$this->assertEquals('X-Foo: bar; says="=?'.$header->getCharset().'?Q?fo=8Fbar?="', $header->toString());
|
|
}
|
|
|
|
public function testLanguageInformationAppearsInEncodedWords()
|
|
{
|
|
/* -- RFC 2231, 5.
|
|
5. Language specification in Encoded Words
|
|
|
|
RFC 2047 provides support for non-US-ASCII character sets in RFC 822
|
|
message header comments, phrases, and any unstructured text field.
|
|
This is done by defining an encoded word construct which can appear
|
|
in any of these places. Given that these are fields intended for
|
|
display, it is sometimes necessary to associate language information
|
|
with encoded words as well as just the character set. This
|
|
specification extends the definition of an encoded word to allow the
|
|
inclusion of such information. This is simply done by suffixing the
|
|
character set specification with an asterisk followed by the language
|
|
tag. For example:
|
|
|
|
From: =?US-ASCII*EN?Q?Keith_Moore?= <moore@cs.utk.edu>
|
|
*/
|
|
|
|
$value = 'fo'.pack('C', 0x8F).'bar';
|
|
$header = new ParameterizedHeader('X-Foo', $value);
|
|
$header->setCharset('iso-8859-1');
|
|
$header->setLanguage('en');
|
|
$header->setParameters(['says' => $value]);
|
|
$this->assertEquals('X-Foo: =?'.$header->getCharset().'*en?Q?fo=8Fbar?=; says="=?'.$header->getCharset().'*en?Q?fo=8Fbar?="', $header->toString());
|
|
}
|
|
|
|
public function testSetBody()
|
|
{
|
|
$header = new ParameterizedHeader('Content-Type', 'text/html');
|
|
$header->setBody('text/plain');
|
|
$this->assertEquals('text/plain', $header->getValue());
|
|
}
|
|
|
|
public function testGetBody()
|
|
{
|
|
$header = new ParameterizedHeader('Content-Type', 'text/plain');
|
|
$this->assertEquals('text/plain', $header->getBody());
|
|
}
|
|
|
|
public function testSetParameter()
|
|
{
|
|
$header = new ParameterizedHeader('Content-Type', 'text/html');
|
|
$header->setParameters(['charset' => 'utf-8', 'delsp' => 'yes']);
|
|
$header->setParameter('delsp', 'no');
|
|
$this->assertEquals(['charset' => 'utf-8', 'delsp' => 'no'], $header->getParameters());
|
|
}
|
|
|
|
public function testGetParameter()
|
|
{
|
|
$header = new ParameterizedHeader('Content-Type', 'text/html');
|
|
$header->setParameters(['charset' => 'utf-8', 'delsp' => 'yes']);
|
|
$this->assertEquals('utf-8', $header->getParameter('charset'));
|
|
}
|
|
}
|
|
|