Open Monograph Press  3.3.0
ParameterizedHeader.php
1 <?php
2 
3 /*
4  * This file is part of the Symfony package.
5  *
6  * (c) Fabien Potencier <fabien@symfony.com>
7  *
8  * For the full copyright and license information, please view the LICENSE
9  * file that was distributed with this source code.
10  */
11 
13 
15 
20 {
26  const TOKEN_REGEX = '(?:[\x21\x23-\x27\x2A\x2B\x2D\x2E\x30-\x39\x41-\x5A\x5E-\x7E]+)';
27 
28  private $encoder;
29  private $parameters = [];
30 
31  public function __construct(string $name, string $value, array $parameters = [])
32  {
33  parent::__construct($name, $value);
34 
35  foreach ($parameters as $k => $v) {
36  $this->setParameter($k, $v);
37  }
38 
39  if ('content-type' !== strtolower($name)) {
40  $this->encoder = new Rfc2231Encoder();
41  }
42  }
43 
44  public function setParameter(string $parameter, ?string $value)
45  {
46  $this->setParameters(array_merge($this->getParameters(), [$parameter => $value]));
47  }
48 
49  public function getParameter(string $parameter): string
50  {
51  return $this->getParameters()[$parameter] ?? '';
52  }
53 
57  public function setParameters(array $parameters)
58  {
59  $this->parameters = $parameters;
60  }
61 
65  public function getParameters(): array
66  {
67  return $this->parameters;
68  }
69 
70  public function getBodyAsString(): string
71  {
72  $body = parent::getBodyAsString();
73  foreach ($this->parameters as $name => $value) {
74  if (null !== $value) {
75  $body .= '; '.$this->createParameter($name, $value);
76  }
77  }
78 
79  return $body;
80  }
81 
88  protected function toTokens(string $string = null): array
89  {
90  $tokens = parent::toTokens(parent::getBodyAsString());
91 
92  // Try creating any parameters
93  foreach ($this->parameters as $name => $value) {
94  if (null !== $value) {
95  // Add the semi-colon separator
96  $tokens[\count($tokens) - 1] .= ';';
97  $tokens = array_merge($tokens, $this->generateTokenLines(' '.$this->createParameter($name, $value)));
98  }
99  }
100 
101  return $tokens;
102  }
103 
107  private function createParameter(string $name, string $value): string
108  {
109  $origValue = $value;
110 
111  $encoded = false;
112  // Allow room for parameter name, indices, "=" and DQUOTEs
113  $maxValueLength = $this->getMaxLineLength() - \strlen($name.'=*N"";') - 1;
114  $firstLineOffset = 0;
115 
116  // If it's not already a valid parameter value...
117  if (!preg_match('/^'.self::TOKEN_REGEX.'$/D', $value)) {
118  // TODO: text, or something else??
119  // ... and it's not ascii
120  if (!preg_match('/^[\x00-\x08\x0B\x0C\x0E-\x7F]*$/D', $value)) {
121  $encoded = true;
122  // Allow space for the indices, charset and language
123  $maxValueLength = $this->getMaxLineLength() - \strlen($name.'*N*="";') - 1;
124  $firstLineOffset = \strlen($this->getCharset()."'".$this->getLanguage()."'");
125  }
126  }
127 
128  // Encode if we need to
129  if ($encoded || \strlen($value) > $maxValueLength) {
130  if (null !== $this->encoder) {
131  $value = $this->encoder->encodeString($origValue, $this->getCharset(), $firstLineOffset, $maxValueLength);
132  } else {
133  // We have to go against RFC 2183/2231 in some areas for interoperability
134  $value = $this->getTokenAsEncodedWord($origValue);
135  $encoded = false;
136  }
137  }
138 
139  $valueLines = $this->encoder ? explode("\r\n", $value) : [$value];
140 
141  // Need to add indices
142  if (\count($valueLines) > 1) {
143  $paramLines = [];
144  foreach ($valueLines as $i => $line) {
145  $paramLines[] = $name.'*'.$i.$this->getEndOfParameterValue($line, true, 0 === $i);
146  }
147 
148  return implode(";\r\n ", $paramLines);
149  } else {
150  return $name.$this->getEndOfParameterValue($valueLines[0], $encoded, true);
151  }
152  }
153 
159  private function getEndOfParameterValue(string $value, bool $encoded = false, bool $firstLine = false): string
160  {
161  if (!preg_match('/^'.self::TOKEN_REGEX.'$/D', $value)) {
162  $value = '"'.$value.'"';
163  }
164  $prepend = '=';
165  if ($encoded) {
166  $prepend = '*=';
167  if ($firstLine) {
168  $prepend = '*='.$this->getCharset()."'".$this->getLanguage()."'";
169  }
170  }
171 
172  return $prepend.$value;
173  }
174 }
Symfony\Component\Mime\Header\ParameterizedHeader\TOKEN_REGEX
const TOKEN_REGEX
Definition: ParameterizedHeader.php:26
Symfony\Component\Mime\Header\ParameterizedHeader\setParameters
setParameters(array $parameters)
Definition: ParameterizedHeader.php:57
Symfony\Component\Mime\Header\ParameterizedHeader\getParameters
getParameters()
Definition: ParameterizedHeader.php:65
Symfony\Component\Mime\Header\ParameterizedHeader\getParameter
getParameter(string $parameter)
Definition: ParameterizedHeader.php:49
Symfony\Component\Mime\Header\AbstractHeader\generateTokenLines
generateTokenLines(string $token)
Definition: AbstractHeader.php:221
Symfony\Component\Mime\Header\UnstructuredHeader
Definition: UnstructuredHeader.php:19
Symfony\Component\Mime\Header\AbstractHeader\getLanguage
getLanguage()
Definition: AbstractHeader.php:57
Symfony\Component\Mime\Header\ParameterizedHeader
Definition: ParameterizedHeader.php:19
Symfony\Component\Mime\Header
Definition: AbstractHeader.php:12
Symfony\Component\Mime\Header\ParameterizedHeader\getBodyAsString
getBodyAsString()
Definition: ParameterizedHeader.php:70
Symfony\Component\Mime\Header\AbstractHeader\getMaxLineLength
getMaxLineLength()
Definition: AbstractHeader.php:72
Symfony\Component\Mime\Header\ParameterizedHeader\__construct
__construct(string $name, string $value, array $parameters=[])
Definition: ParameterizedHeader.php:31
Symfony\Component\Mime\Header\AbstractHeader\getCharset
getCharset()
Definition: AbstractHeader.php:42
Symfony\Component\Mime\Encoder\Rfc2231Encoder
Definition: Rfc2231Encoder.php:19
Symfony\Component\Mime\Header\ParameterizedHeader\toTokens
toTokens(string $string=null)
Definition: ParameterizedHeader.php:88
Symfony\Component\Mime\Header\ParameterizedHeader\setParameter
setParameter(string $parameter, ?string $value)
Definition: ParameterizedHeader.php:44
Symfony\Component\Mime\Header\AbstractHeader\getTokenAsEncodedWord
getTokenAsEncodedWord(string $token, int $firstLineOffset=0)
Definition: AbstractHeader.php:184