| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 |
- <?php
- namespace Egulias\EmailValidator\Parser;
- use Egulias\EmailValidator\EmailLexer;
- use Egulias\EmailValidator\Warning\CFWSNearAt;
- use Egulias\EmailValidator\Result\InvalidEmail;
- use Egulias\EmailValidator\Warning\CFWSWithFWS;
- use Egulias\EmailValidator\Result\Reason\CRNoLF;
- use Egulias\EmailValidator\Result\Reason\AtextAfterCFWS;
- use Egulias\EmailValidator\Result\Reason\CRLFAtTheEnd;
- use Egulias\EmailValidator\Result\Reason\CRLFX2;
- use Egulias\EmailValidator\Result\Reason\ExpectingCTEXT;
- use Egulias\EmailValidator\Result\Result;
- use Egulias\EmailValidator\Result\ValidEmail;
- class FoldingWhiteSpace extends PartParser
- {
- public const FWS_TYPES = [
- EmailLexer::S_SP,
- EmailLexer::S_HTAB,
- EmailLexer::S_CR,
- EmailLexer::S_LF,
- EmailLexer::CRLF
- ];
- public function parse(): Result
- {
- if (!$this->isFWS()) {
- return new ValidEmail();
- }
- $previous = $this->lexer->getPrevious();
- $resultCRLF = $this->checkCRLFInFWS();
- if ($resultCRLF->isInvalid()) {
- return $resultCRLF;
- }
- if ($this->lexer->current->isA(EmailLexer::S_CR)) {
- return new InvalidEmail(new CRNoLF(), $this->lexer->current->value);
- }
- if ($this->lexer->isNextToken(EmailLexer::GENERIC) && !$previous->isA(EmailLexer::S_AT)) {
- return new InvalidEmail(new AtextAfterCFWS(), $this->lexer->current->value);
- }
- if ($this->lexer->current->isA(EmailLexer::S_LF) || $this->lexer->current->isA(EmailLexer::C_NUL)) {
- return new InvalidEmail(new ExpectingCTEXT(), $this->lexer->current->value);
- }
- if ($this->lexer->isNextToken(EmailLexer::S_AT) || $previous->isA(EmailLexer::S_AT)) {
- $this->warnings[CFWSNearAt::CODE] = new CFWSNearAt();
- } else {
- $this->warnings[CFWSWithFWS::CODE] = new CFWSWithFWS();
- }
- return new ValidEmail();
- }
- protected function checkCRLFInFWS(): Result
- {
- if (!$this->lexer->current->isA(EmailLexer::CRLF)) {
- return new ValidEmail();
- }
- if (!$this->lexer->isNextTokenAny(array(EmailLexer::S_SP, EmailLexer::S_HTAB))) {
- return new InvalidEmail(new CRLFX2(), $this->lexer->current->value);
- }
- //this has no coverage. Condition is repeated from above one
- if (!$this->lexer->isNextTokenAny(array(EmailLexer::S_SP, EmailLexer::S_HTAB))) {
- return new InvalidEmail(new CRLFAtTheEnd(), $this->lexer->current->value);
- }
- return new ValidEmail();
- }
- protected function isFWS(): bool
- {
- if ($this->escaped()) {
- return false;
- }
- return in_array($this->lexer->current->type, self::FWS_TYPES);
- }
- }
|