sonarrradarrplexorganizrnginxdashboardmuximuxlandingpagestartpagelandinghtpcserverhomepagesabnzbdheimdallembycouchpotatonzbgetbookmarkapplication-dashboard
		
		
		
		
			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')); | |
|     } | |
| }
 | |
| 
 |