package uol.proxy.parser; | |
import java.nio.ByteBuffer; | |
import uol.proxy.smtp.SmtpResponse; | |
/** | |
* Mensagens SMTP tem o seguinte formato: | |
* <pre> | |
* resposta de uma linha só: | |
* nnn [SP] lalalal [CR] [LF] | |
* resposta de várias linhas: | |
* nnn [-] lalalalal [CR] [LF] | |
* nnn [-] lalalalal [CR] [LF] | |
* ... | |
* nnn [SP] lalalalal [CR] [LF] | |
* | |
* | |
* | |
* */ | |
public class SmtpServerParser { | |
private static final int DIGITS = 0; | |
private static final int LINE_MODE_CHAR = 1; | |
private static final int SKIP_TO_EOL_AND_FINISH = 2; | |
private static final int SKIP_TO_EOL = 3; | |
int state = DIGITS; | |
int code; | |
int pos; | |
boolean wellFormed = true; | |
public SmtpServerParser() { | |
} | |
//formato: xxx lalal | |
public SmtpResponse parse(ByteBuffer buffer) { | |
outer: while (buffer.remaining() > 0) { | |
char c = (char) buffer.get(); | |
++pos; | |
switch (state) { | |
case DIGITS: //get number | |
if(Character.isDigit(c)) { | |
code = code * 10 + (c - '0'); | |
} else { | |
wellFormed = false; | |
state = SKIP_TO_EOL_AND_FINISH; | |
} | |
if(pos == 3) | |
state = LINE_MODE_CHAR; | |
break; | |
case LINE_MODE_CHAR: | |
if(c == ' ') | |
state = SKIP_TO_EOL_AND_FINISH; | |
else if(c == ' ') | |
state = SKIP_TO_EOL; | |
else { | |
wellFormed = false; | |
state = SKIP_TO_EOL_AND_FINISH; | |
} | |
break; | |
case SKIP_TO_EOL_AND_FINISH: | |
break; | |
} | |
} | |
return null; | |
} | |
} |