From 03ff229b475f33081610ebff7e2256d2cac98a9d Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Wed, 15 Jun 2016 17:08:43 +0100 Subject: [Feature] Further relax parser --- src/ragel/smtp_received.rl | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/ragel/smtp_received.rl b/src/ragel/smtp_received.rl index 67a52e7cf..f4a0ed7ba 100644 --- a/src/ragel/smtp_received.rl +++ b/src/ragel/smtp_received.rl @@ -23,7 +23,8 @@ ( Domain >Real_Domain_Start %Real_Domain_End FWS address_literal >Real_IP_Start %Real_IP_End ); Extended_Domain = Domain >Real_Domain_Start %Real_Domain_End | # Used to be a real domain ( Domain >Reported_Domain_Start %Reported_Domain_End FWS "(" TCP_info ")" ) | # Here domain is something specified by remote side - ( address_literal >Real_Domain_Start %Real_Domain_End FWS "(" TCP_info ")" ); + ( address_literal >Real_Domain_Start %Real_Domain_End FWS "(" TCP_info ")" ) | + address_literal >Real_IP_Start %Real_IP_End; # Not RFC conforming, but many MTA try this ccontent = ctext | FWS | '(' @{ fcall balanced_ccontent; }; balanced_ccontent := ccontent* ')' @{ fret; }; @@ -31,7 +32,7 @@ CFWS = ((FWS? comment)+ FWS?) | FWS; From_domain = "FROM"i FWS Extended_Domain >From_Start %From_End; - By_domain = CFWS "BY"i FWS Extended_Domain >By_Start %By_End; + By_domain = "BY"i FWS Extended_Domain >By_Start %By_End; Via = CFWS "VIA"i FWS Link; With = CFWS "WITH"i FWS Protocol; @@ -45,7 +46,8 @@ For = CFWS "FOR"i FWS ( Path | Mailbox ) %For_End; Additional_Registered_Clauses = CFWS Atom FWS String; Opt_info = Via? With? ID? For? Additional_Registered_Clauses?; - Received = From_domain By_domain Opt_info CFWS? ";" FWS date_time >Date_Start %Date_End CFWS?; + # Here we make From part optional just because many received headers lack it + Received = From_domain? CFWS? By_domain? CFWS? Opt_info CFWS? ";" FWS date_time >Date_Start %Date_End CFWS?; prepush { if (top >= st_storage.size) { -- cgit v1.2.3