Lenient content type parameter parser

pull/213/head
M66B 1 year ago
parent 9314a65fc5
commit ab6db5248a

@ -255,6 +255,10 @@ public class HeaderTokenizer {
return string.substring(nextPos); return string.substring(nextPos);
} }
public int getNextPos() {
return nextPos;
}
/* /*
* Return the next token starting from 'currentPos'. After the * Return the next token starting from 'currentPos'. After the
* parse, 'currentPos' is updated to point to the start of the * parse, 'currentPos' is updated to point to the start of the

@ -216,12 +216,19 @@ public class ParameterList {
public ParameterList(String s) throws ParseException { public ParameterList(String s) throws ParseException {
this(); this();
boolean recover = false;
HeaderTokenizer h = new HeaderTokenizer(s, HeaderTokenizer.MIME); HeaderTokenizer h = new HeaderTokenizer(s, HeaderTokenizer.MIME);
for (;;) { for (;;) {
HeaderTokenizer.Token tk = h.next(); HeaderTokenizer.Token tk = h.next();
int type = tk.getType(); int type = tk.getType();
String name, value; String name, value;
if (recover) {
recover = false;
while (tk.getType() != HeaderTokenizer.Token.EOF && (char) tk.getType() != ';')
tk = h.next();
}
if (type == HeaderTokenizer.Token.EOF) // done if (type == HeaderTokenizer.Token.EOF) // done
break; break;
@ -232,18 +239,32 @@ public class ParameterList {
if (tk.getType() == HeaderTokenizer.Token.EOF) if (tk.getType() == HeaderTokenizer.Token.EOF)
break; break;
// parameter name must be a MIME Atom // parameter name must be a MIME Atom
if (tk.getType() != HeaderTokenizer.Token.ATOM) if (tk.getType() != HeaderTokenizer.Token.ATOM) {
throw new ParseException("In parameter list <" + s + ">" + StringBuilder sb = new StringBuilder(s);
", expected parameter name, " + int pos = h.getNextPos() - 1;
"got \"" + tk.getValue() + "\""); if (pos < sb.length())
sb.insert(pos, "^^^");
eu.faircode.email.Log.w("In parameter list <" + sb + ">" +
", expected parameter name, " +
"got \"" + tk.getValue() + "\"");
recover = true;
continue;
}
name = tk.getValue().toLowerCase(Locale.ENGLISH); name = tk.getValue().toLowerCase(Locale.ENGLISH);
// expect '=' // expect '='
tk = h.next(); tk = h.next();
if ((char)tk.getType() != '=') if ((char)tk.getType() != '=') {
throw new ParseException("In parameter list <" + s + ">" + StringBuilder sb = new StringBuilder(s);
", expected '=', " + int pos = h.getNextPos() - 1;
"got \"" + tk.getValue() + "\""); if (pos < sb.length())
sb.insert(pos, "^^^");
eu.faircode.email.Log.w("In parameter list <" + sb + ">" +
", expected '=', " +
"got \"" + tk.getValue() + "\"");
recover = true;
continue;
}
// expect parameter value // expect parameter value
if (windowshack && if (windowshack &&
@ -256,10 +277,17 @@ public class ParameterList {
type = tk.getType(); type = tk.getType();
// parameter value must be a MIME Atom or Quoted String // parameter value must be a MIME Atom or Quoted String
if (type != HeaderTokenizer.Token.ATOM && if (type != HeaderTokenizer.Token.ATOM &&
type != HeaderTokenizer.Token.QUOTEDSTRING) type != HeaderTokenizer.Token.QUOTEDSTRING) {
throw new ParseException("In parameter list <" + s + ">" + StringBuilder sb = new StringBuilder(s);
", expected parameter value, " + int pos = h.getNextPos() - 1;
"got \"" + tk.getValue() + "\""); if (pos < sb.length())
sb.insert(pos, "^^^");
eu.faircode.email.Log.w("In parameter list <" + sb + ">" +
", expected parameter value, " +
"got \"" + tk.getValue() + "\"");
recover = true;
continue;
}
value = tk.getValue(); value = tk.getValue();
lastName = name; lastName = name;
@ -285,9 +313,15 @@ public class ParameterList {
value = lastValue + " " + tk.getValue(); value = lastValue + " " + tk.getValue();
list.put(lastName, value); list.put(lastName, value);
} else { } else {
throw new ParseException("In parameter list <" + s + ">" + StringBuilder sb = new StringBuilder(s);
int pos = h.getNextPos() - 1;
if (pos < sb.length())
sb.insert(pos, "^^^");
eu.faircode.email.Log.w("In parameter list <" + sb + ">" +
", expected ';', got \"" + ", expected ';', got \"" +
tk.getValue() + "\""); tk.getValue() + "\"");
recover = true;
continue;
} }
} }
} }

Loading…
Cancel
Save