| Index: sdk/lib/io/http_multipart_form_data_impl.dart
|
| diff --git a/sdk/lib/io/http_multipart_form_data_impl.dart b/sdk/lib/io/http_multipart_form_data_impl.dart
|
| index b2279541cc428a274aae780bac501a5354967c1a..8531a9522d7e4d5c838d2a35517e559303cab148 100644
|
| --- a/sdk/lib/io/http_multipart_form_data_impl.dart
|
| +++ b/sdk/lib/io/http_multipart_form_data_impl.dart
|
| @@ -41,9 +41,9 @@ class _HttpMultipartFormData extends Stream implements HttpMultipartFormData {
|
| .transform(new StringDecoder(encoding))
|
| .expand((data) {
|
| buffer.write(data);
|
| - var out = _HttpUtils.decodeHttpEntityString(buffer.toString());
|
| + var out = _decodeHttpEntityString(buffer.toString());
|
| if (out != null) {
|
| - buffer = new StringBuffer();
|
| + buffer.clear();
|
| return [out];
|
| }
|
| return const [];
|
| @@ -98,5 +98,42 @@ class _HttpMultipartFormData extends Stream implements HttpMultipartFormData {
|
| String value(String name) {
|
| return _mimeMultipart.headers[name];
|
| }
|
| +
|
| + // Decode a string with HTTP entities. Returns null if the string ends in the
|
| + // middle of a http entity.
|
| + static String _decodeHttpEntityString(String input) {
|
| + int amp = input.lastIndexOf('&');
|
| + if (amp < 0) return input;
|
| + int end = input.lastIndexOf(';');
|
| + if (end < amp) return null;
|
| +
|
| + var buffer = new StringBuffer();
|
| + int offset = 0;
|
| +
|
| + parse(amp, end) {
|
| + switch (input[amp + 1]) {
|
| + case '#':
|
| + if (input[amp + 2] == 'x') {
|
| + buffer.writeCharCode(
|
| + int.parse(input.substring(amp + 3, end), radix: 16));
|
| + } else {
|
| + buffer.writeCharCode(int.parse(input.substring(amp + 2, end)));
|
| + }
|
| + break;
|
| +
|
| + default:
|
| + throw new HttpException('Unhandled HTTP entity token');
|
| + }
|
| + }
|
| +
|
| + while ((amp = input.indexOf('&', offset)) >= 0) {
|
| + buffer.write(input.substring(offset, amp));
|
| + int end = input.indexOf(';', amp);
|
| + parse(amp, end);
|
| + offset = end + 1;
|
| + }
|
| + buffer.write(input.substring(offset));
|
| + return buffer.toString();
|
| + }
|
| }
|
|
|
|
|