http_server
http_server copied to clipboard
http_body_impl.dart class HttpBodyHandlerImpl method process - asFormData() can't handle forms that contain multiple copies of the same key
In http_body_impl.dart class HttpBodyHandlerImpl method process, the following code only retrieves the last key value pair:
Future<HttpBody> asFormData() {
return stream
.transform(new MimeMultipartTransformer(
contentType.parameters['boundary']))
.map((part) => HttpMultipartFormData.parse(
part, defaultEncoding: defaultEncoding))
.map((multipart) {
var future;
if (multipart.isText) {
future = multipart
.fold(new StringBuffer(), (b, s) => b..write(s))
.then((b) => b.toString());
} else {
future = multipart
.fold(new BytesBuilder(), (b, d) => b..add(d))
.then((b) => b.takeBytes());
}
return future.then((data) {
var filename =
multipart.contentDisposition.parameters['filename'];
if (filename != null) {
data = new _HttpBodyFileUpload(multipart.contentType,
filename,
data);
}
return [multipart.contentDisposition.parameters['name'], data];
});
})
.fold([], (l, f) => l..add(f))
.then(Future.wait)
.then((parts) {
Map<String, dynamic> map = new Map<String, dynamic>();
for (var part in parts) {
map[part[0]] = part[1]; // Override existing entries.
}
return new _HttpBody('form', map);
});
Would prefer something like this, to return value as a List<String> when key is found multiple times. Understand that this may cause a breaking change depending upon form input.
Future<HttpBody> asFormData() {
return stream
.transform(new MimeMultipartTransformer(
contentType.parameters['boundary']))
.map((part) => HttpMultipartFormData.parse(
part, defaultEncoding: defaultEncoding))
.map((multipart) {
var future;
if (multipart.isText) {
future = multipart
.fold(new StringBuffer(), (b, s) => b..write(s))
.then((b) => b.toString());
} else {
future = multipart
.fold(new BytesBuilder(), (b, d) => b..add(d))
.then((b) => b.takeBytes());
}
return future.then((data) {
var filename =
multipart.contentDisposition.parameters['filename'];
if (filename != null) {
data = new _HttpBodyFileUpload(multipart.contentType,
filename,
data);
}
return [multipart.contentDisposition.parameters['name'], data];
});
})
.fold([], (l, f) => l..add(f))
.then(Future.wait)
.then((parts) {
Map<String, dynamic> map = new Map<String, dynamic>();
for (var part in parts) {
if (map[part[0]] == null) {
map[part[0]] = part[1];
}
else {
var partvalue = map[part[0]];
if (partvalue is String) {
List<String> listvalue = new List<String>();
listvalue.add(map[part[0]]);
listvalue.add(part[1]);
map[part[0]] = listvalue;
}
else {
partvalue.add(part[1]);
map[part[0]] = partvalue;
}
}
}
return new _HttpBody('form', map);
});
See also dart-lang/sdk#28142