Skip to content
This repository has been archived by the owner on Apr 6, 2021. It is now read-only.

http_body_impl.dart class HttpBodyHandlerImpl method process - asFormData() can't handle forms that contain multiple copies of the same key #35

Open
rwrozelle opened this issue Dec 14, 2016 · 1 comment

Comments

@rwrozelle
Copy link

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 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);
          });
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Development

No branches or pull requests

2 participants