| 
<?phpdeclare(strict_types=1);
 namespace ParagonIE\Paseto\Parsing;
 
 use ParagonIE\Paseto\{
 Exception\InvalidPurposeException,
 Exception\InvalidVersionException,
 Exception\SecurityException,
 ProtocolInterface,
 ProtocolCollection,
 Purpose
 };
 
 /**
 * Class Header
 * @package ParagonIE\Paseto\Parsing
 */
 final class Header
 {
 /**
 * @var ProtocolInterface
 */
 private $protocol;
 
 /**
 * @var Purpose
 */
 private $purpose;
 
 /**
 * Validate message header strings
 *
 * @param string $protocol      Tainted user-provided string.
 * @param string $purpose      Tainted user-provided string.
 *
 * @throws InvalidVersionException
 * @throws InvalidPurposeException
 */
 public function __construct(string $protocol, string $purpose)
 {
 $this->protocol = ProtocolCollection::protocolFromHeaderPart($protocol);
 $this->purpose  = new Purpose($purpose);
 }
 
 /**
 * Parse a string into a deconstructed Header object.
 *
 * @param string $tainted      Tainted user-provided string.
 * @return self
 * @throws SecurityException
 */
 public static function fromString(string $tainted): self
 {
 /** @var array<int, string> $pieces */
 $pieces = \explode('.', $tainted);
 $count = \count($pieces);
 if ($count !== 3 or $pieces[2] !== '') {
 // we expect "version.purpose." format
 throw new SecurityException('Truncated or invalid header');
 }
 
 return new Header($pieces[0], $pieces[1]);
 }
 
 public function protocol(): ProtocolInterface
 {
 return $this->protocol;
 }
 
 public function purpose(): Purpose
 {
 return $this->purpose;
 }
 
 public function toString(): string
 {
 return $this->protocol->header() . "."
 . $this->purpose->rawString() . "."
 ;
 }
 }
 
 |