in lib/src/http_headers_impl.dart [672:789]
void _parse(String s, String parameterSeparator, String valueSeparator,
bool preserveBackslash) {
int index = 0;
bool done() => index == s.length;
void skipWS() {
while (!done()) {
if (s[index] != " " && s[index] != "\t") return;
index++;
}
}
String parseValue() {
int start = index;
while (!done()) {
if (s[index] == " " ||
s[index] == "\t" ||
s[index] == valueSeparator ||
s[index] == parameterSeparator) break;
index++;
}
return s.substring(start, index);
}
void expect(String expected) {
if (done() || s[index] != expected) {
throw HttpException("Failed to parse header value");
}
index++;
}
void maybeExpect(String expected) {
if (s[index] == expected) index++;
}
void parseParameters() {
var parameters = HashMap<String, String>();
_parameters = UnmodifiableMapView(parameters);
String parseParameterName() {
int start = index;
while (!done()) {
if (s[index] == " " ||
s[index] == "\t" ||
s[index] == "=" ||
s[index] == parameterSeparator ||
s[index] == valueSeparator) break;
index++;
}
return s.substring(start, index).toLowerCase();
}
String parseParameterValue() {
if (!done() && s[index] == "\"") {
// Parse quoted value.
StringBuffer sb = StringBuffer();
index++;
while (!done()) {
if (s[index] == "\\") {
if (index + 1 == s.length) {
throw HttpException("Failed to parse header value");
}
if (preserveBackslash && s[index + 1] != "\"") {
sb.write(s[index]);
}
index++;
} else if (s[index] == "\"") {
index++;
break;
}
sb.write(s[index]);
index++;
}
return sb.toString();
} else {
// Parse non-quoted value.
var val = parseValue();
return val == "" ? null : val;
}
}
while (!done()) {
skipWS();
if (done()) return;
String name = parseParameterName();
skipWS();
if (done()) {
parameters[name] = null;
return;
}
maybeExpect("=");
skipWS();
if (done()) {
parameters[name] = null;
return;
}
String value = parseParameterValue();
if (name == 'charset' && this is ContentTypeImpl && value != null) {
// Charset parameter of ContentTypes are always lower-case.
value = value.toLowerCase();
}
parameters[name] = value;
skipWS();
if (done()) return;
// TODO: Implement support for multi-valued parameters.
if (s[index] == valueSeparator) return;
expect(parameterSeparator);
}
}
skipWS();
_value = parseValue();
skipWS();
if (done()) return;
maybeExpect(parameterSeparator);
parseParameters();
}