radarrplexorganizrnginxsonarrdashboardsabnzbdheimdallembycouchpotatonzbgetbookmarkapplication-dashboardmuximuxlandingpagestartpagelandinghtpcserverhomepage
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.
129 lines
4.1 KiB
129 lines
4.1 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\Encoder;
|
|
|
|
use PHPUnit\Framework\TestCase;
|
|
use Symfony\Component\Mime\Encoder\Rfc2231Encoder;
|
|
|
|
class Rfc2231EncoderTest extends TestCase
|
|
{
|
|
private $rfc2045Token = '/^[\x21\x23-\x27\x2A\x2B\x2D\x2E\x30-\x39\x41-\x5A\x5E-\x7E]+$/D';
|
|
|
|
/* --
|
|
This algorithm is described in RFC 2231, but is barely touched upon except
|
|
for mentioning bytes can be represented as their octet values (e.g. %20 for
|
|
the SPACE character).
|
|
|
|
The tests here focus on how to use that representation to always generate text
|
|
which matches RFC 2045's definition of "token".
|
|
*/
|
|
|
|
public function testEncodingAsciiCharactersProducesValidToken()
|
|
{
|
|
$string = '';
|
|
foreach (range(0x00, 0x7F) as $octet) {
|
|
$char = pack('C', $octet);
|
|
$string .= $char;
|
|
}
|
|
$encoder = new Rfc2231Encoder();
|
|
$encoded = $encoder->encodeString($string);
|
|
|
|
foreach (explode("\r\n", $encoded) as $line) {
|
|
$this->assertRegExp($this->rfc2045Token, $line, 'Encoder should always return a valid RFC 2045 token.');
|
|
}
|
|
}
|
|
|
|
public function testEncodingNonAsciiCharactersProducesValidToken()
|
|
{
|
|
$string = '';
|
|
foreach (range(0x80, 0xFF) as $octet) {
|
|
$char = pack('C', $octet);
|
|
$string .= $char;
|
|
}
|
|
$encoder = new Rfc2231Encoder();
|
|
$encoded = $encoder->encodeString($string);
|
|
|
|
foreach (explode("\r\n", $encoded) as $line) {
|
|
$this->assertRegExp($this->rfc2045Token, $line, 'Encoder should always return a valid RFC 2045 token.');
|
|
}
|
|
}
|
|
|
|
public function testMaximumLineLengthCanBeSet()
|
|
{
|
|
$string = '';
|
|
for ($x = 0; $x < 200; ++$x) {
|
|
$char = 'a';
|
|
$string .= $char;
|
|
}
|
|
$encoder = new Rfc2231Encoder();
|
|
$encoded = $encoder->encodeString($string, 'utf-8', 0, 75);
|
|
|
|
// 72 here and not 75 as we read 4 chars at a time
|
|
$this->assertEquals(
|
|
str_repeat('a', 72)."\r\n".
|
|
str_repeat('a', 72)."\r\n".
|
|
str_repeat('a', 56),
|
|
$encoded,
|
|
'Lines should be wrapped at each 72 characters'
|
|
);
|
|
}
|
|
|
|
public function testFirstLineCanHaveShorterLength()
|
|
{
|
|
$string = '';
|
|
for ($x = 0; $x < 200; ++$x) {
|
|
$char = 'a';
|
|
$string .= $char;
|
|
}
|
|
$encoder = new Rfc2231Encoder();
|
|
$encoded = $encoder->encodeString($string, 'utf-8', 24, 72);
|
|
|
|
$this->assertEquals(
|
|
str_repeat('a', 48)."\r\n".
|
|
str_repeat('a', 72)."\r\n".
|
|
str_repeat('a', 72)."\r\n".
|
|
str_repeat('a', 8),
|
|
$encoded,
|
|
'First line should be 24 bytes shorter than the others.'
|
|
);
|
|
}
|
|
|
|
public function testEncodingAndDecodingSamples()
|
|
{
|
|
$dir = realpath(__DIR__.'/../Fixtures/samples/charsets');
|
|
$sampleFp = opendir($dir);
|
|
while (false !== $encoding = readdir($sampleFp)) {
|
|
if ('.' == substr($encoding, 0, 1)) {
|
|
continue;
|
|
}
|
|
|
|
$encoder = new Rfc2231Encoder();
|
|
if (is_dir($dir.'/'.$encoding)) {
|
|
$fileFp = opendir($dir.'/'.$encoding);
|
|
while (false !== $sampleFile = readdir($fileFp)) {
|
|
if ('.' == substr($sampleFile, 0, 1)) {
|
|
continue;
|
|
}
|
|
|
|
$text = file_get_contents($dir.'/'.$encoding.'/'.$sampleFile);
|
|
$encodedText = $encoder->encodeString($text, $encoding);
|
|
$this->assertEquals(
|
|
urldecode(implode('', explode("\r\n", $encodedText))), $text,
|
|
'Encoded string should decode back to original string for sample '.$dir.'/'.$encoding.'/'.$sampleFile
|
|
);
|
|
}
|
|
closedir($fileFp);
|
|
}
|
|
}
|
|
closedir($sampleFp);
|
|
}
|
|
}
|
|
|