sonarrradarrplexorganizrnginxdashboardlandingpagestartpagelandinghtpcserverhomepagesabnzbdheimdallembycouchpotatonzbgetbookmarkapplication-dashboardmuximux
		
		
		
		
			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.
		
		
		
		
		
			
		
			
				
					
					
						
							213 lines
						
					
					
						
							8.9 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							213 lines
						
					
					
						
							8.9 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\QpEncoder; | |
| 
 | |
| class QpEncoderTest extends TestCase | |
| { | |
|     /* -- RFC 2045, 6.7 -- | |
|     (1)   (General 8bit representation) Any octet, except a CR or | |
|                     LF that is part of a CRLF line break of the canonical | |
|                     (standard) form of the data being encoded, may be | |
|                     represented by an "=" followed by a two digit | |
|                     hexadecimal representation of the octet's value.  The | |
|                     digits of the hexadecimal alphabet, for this purpose, | |
|                     are "0123456789ABCDEF".  Uppercase letters must be | |
|                     used; lowercase letters are not allowed.  Thus, for | |
|                     example, the decimal value 12 (US-ASCII form feed) can | |
|                     be represented by "=0C", and the decimal value 61 (US- | |
|                     ASCII EQUAL SIGN) can be represented by "=3D".  This | |
|                     rule must be followed except when the following rules | |
|                     allow an alternative encoding. | |
|                     */ | |
| 
 | |
|     public function testPermittedCharactersAreNotEncoded() | |
|     { | |
|         /* -- RFC 2045, 6.7 -- | |
|         (2)   (Literal representation) Octets with decimal values of | |
|                     33 through 60 inclusive, and 62 through 126, inclusive, | |
|                     MAY be represented as the US-ASCII characters which | |
|                     correspond to those octets (EXCLAMATION POINT through | |
|                     LESS THAN, and GREATER THAN through TILDE, | |
|                     respectively). | |
|                     */ | |
| 
 | |
|         $encoder = new QpEncoder(); | |
|         foreach (array_merge(range(33, 60), range(62, 126)) as $ordinal) { | |
|             $char = \chr($ordinal); | |
|             $this->assertSame($char, $encoder->encodeString($char)); | |
|         } | |
|     } | |
| 
 | |
|     public function testWhiteSpaceAtLineEndingIsEncoded() | |
|     { | |
|         /* -- RFC 2045, 6.7 -- | |
|         (3)   (White Space) Octets with values of 9 and 32 MAY be | |
|                     represented as US-ASCII TAB (HT) and SPACE characters, | |
|                     respectively, but MUST NOT be so represented at the end | |
|                     of an encoded line.  Any TAB (HT) or SPACE characters | |
|                     on an encoded line MUST thus be followed on that line | |
|                     by a printable character.  In particular, an "=" at the | |
|                     end of an encoded line, indicating a soft line break | |
|                     (see rule #5) may follow one or more TAB (HT) or SPACE | |
|                     characters.  It follows that an octet with decimal | |
|                     value 9 or 32 appearing at the end of an encoded line | |
|                     must be represented according to Rule #1.  This rule is | |
|                     necessary because some MTAs (Message Transport Agents, | |
|                     programs which transport messages from one user to | |
|                     another, or perform a portion of such transfers) are | |
|                     known to pad lines of text with SPACEs, and others are | |
|                     known to remove "white space" characters from the end | |
|                     of a line.  Therefore, when decoding a Quoted-Printable | |
|                     body, any trailing white space on a line must be | |
|                     deleted, as it will necessarily have been added by | |
|                     intermediate transport agents. | |
|                     */ | |
| 
 | |
|         $encoder = new QpEncoder(); | |
| 
 | |
|         $HT = \chr(0x09); // 9 | |
|         $SPACE = \chr(0x20); // 32 | |
|  | |
|         // HT | |
|         $string = 'a'.$HT.$HT."\r\n".'b'; | |
|         $this->assertEquals('a'.$HT.'=09'."\r\n".'b', $encoder->encodeString($string)); | |
| 
 | |
|         // SPACE | |
|         $string = 'a'.$SPACE.$SPACE."\r\n".'b'; | |
|         $this->assertEquals('a'.$SPACE.'=20'."\r\n".'b', $encoder->encodeString($string)); | |
|     } | |
| 
 | |
|     public function testCRLFIsLeftAlone() | |
|     { | |
|         /* | |
|         (4)   (Line Breaks) A line break in a text body, represented | |
|                     as a CRLF sequence in the text canonical form, must be | |
|                     represented by a (RFC 822) line break, which is also a | |
|                     CRLF sequence, in the Quoted-Printable encoding.  Since | |
|                     the canonical representation of media types other than | |
|                     text do not generally include the representation of | |
|                     line breaks as CRLF sequences, no hard line breaks | |
|                     (i.e. line breaks that are intended to be meaningful | |
|                     and to be displayed to the user) can occur in the | |
|                     quoted-printable encoding of such types.  Sequences | |
|                     like "=0D", "=0A", "=0A=0D" and "=0D=0A" will routinely | |
|                     appear in non-text data represented in quoted- | |
|                     printable, of course. | |
|  | |
|                     Note that many implementations may elect to encode the | |
|                     local representation of various content types directly | |
|                     rather than converting to canonical form first, | |
|                     encoding, and then converting back to local | |
|                     representation.  In particular, this may apply to plain | |
|                     text material on systems that use newline conventions | |
|                     other than a CRLF terminator sequence.  Such an | |
|                     implementation optimization is permissible, but only | |
|                     when the combined canonicalization-encoding step is | |
|                     equivalent to performing the three steps separately. | |
|                     */ | |
| 
 | |
|         $encoder = new QpEncoder(); | |
|         $string = 'a'."\r\n".'b'."\r\n".'c'."\r\n"; | |
|         $this->assertEquals($string, $encoder->encodeString($string)); | |
|     } | |
| 
 | |
|     public function testLinesLongerThan76CharactersAreSoftBroken() | |
|     { | |
|         /* | |
|         (5)   (Soft Line Breaks) The Quoted-Printable encoding | |
|                     REQUIRES that encoded lines be no more than 76 | |
|                     characters long.  If longer lines are to be encoded | |
|                     with the Quoted-Printable encoding, "soft" line breaks | |
|                     must be used.  An equal sign as the last character on a | |
|                     encoded line indicates such a non-significant ("soft") | |
|                     line break in the encoded text. | |
|                     */ | |
| 
 | |
|         $encoder = new QpEncoder(); | |
|         $input = str_repeat('a', 140); | |
|         $output = ''; | |
|         for ($i = 0; $i < 140; ++$i) { | |
|             // we read 4 chars at a time (max is 75) | |
|             if (18 * 4 /* 72 */ == $i) { | |
|                 $output .= "=\r\n"; | |
|             } | |
|             $output .= 'a'; | |
|         } | |
|         $this->assertEquals($output, $encoder->encodeString($input)); | |
|     } | |
| 
 | |
|     public function testMaxLineLengthCanBeSpecified() | |
|     { | |
|         $encoder = new QpEncoder(); | |
|         $input = str_repeat('a', 100); | |
|         $output = ''; | |
|         for ($i = 0; $i < 100; ++$i) { | |
|             // we read 4 chars at a time (max is 53) | |
|             if (13 * 4 /* 52 */ == $i) { | |
|                 $output .= "=\r\n"; | |
|             } | |
|             $output .= 'a'; | |
|         } | |
|         $this->assertEquals($output, $encoder->encodeString($input, 'utf-8', 0, 54)); | |
|     } | |
| 
 | |
|     public function testBytesBelowPermittedRangeAreEncoded() | |
|     { | |
|         // According to Rule (1 & 2) | |
|         $encoder = new QpEncoder(); | |
|         foreach (range(0, 32) as $ordinal) { | |
|             $char = \chr($ordinal); | |
|             $this->assertEquals(sprintf('=%02X', $ordinal), $encoder->encodeString($char)); | |
|         } | |
|     } | |
| 
 | |
|     public function testDecimalByte61IsEncoded() | |
|     { | |
|         // According to Rule (1 & 2) | |
|         $encoder = new QpEncoder(); | |
|         $this->assertEquals('=3D', $encoder->encodeString('=')); | |
|     } | |
| 
 | |
|     public function testBytesAbovePermittedRangeAreEncoded() | |
|     { | |
|         // According to Rule (1 & 2) | |
|         $encoder = new QpEncoder(); | |
|         foreach (range(127, 255) as $ordinal) { | |
|             $this->assertSame(sprintf('=%02X', $ordinal), $encoder->encodeString(\chr($ordinal), 'iso-8859-1')); | |
|         } | |
|     } | |
| 
 | |
|     public function testFirstLineLengthCanBeDifferent() | |
|     { | |
|         $encoder = new QpEncoder(); | |
|         $input = str_repeat('a', 140); | |
|         $output = ''; | |
|         for ($i = 0; $i < 140; ++$i) { | |
|             // we read 4 chars at a time (max is 54 for the first line and 75 for the second one) | |
|             if (13 * 4 == $i || 13 * 4 + 18 * 4 == $i) { | |
|                 $output .= "=\r\n"; | |
|             } | |
|             $output .= 'a'; | |
|         } | |
|         $this->assertEquals($output, $encoder->encodeString($input, 'utf-8', 22), 'First line should start at offset 22 so can only have max length 54'); | |
|     } | |
| 
 | |
|     public function testTextIsPreWrapped() | |
|     { | |
|         $encoder = new QpEncoder(); | |
|         $input = str_repeat('a', 70)."\r\n".str_repeat('a', 70)."\r\n".str_repeat('a', 70); | |
|         $this->assertEquals($input, $encoder->encodeString($input)); | |
|     } | |
| }
 | |
| 
 |