From 754298bf09d794a29084cba7003c5e59fef04593 Mon Sep 17 00:00:00 2001 From: Don Date: Fri, 23 Jun 2017 16:56:43 -0700 Subject: [PATCH 1/3] Don't quote the multipart boundary header. (#63) This is be more broadly compatible than the quoted version, although the quoted version is what's described by the spec. curl and browsers send unquoted boundaries, so we can safely assume that any server will support them. Closes #61 --- CHANGELOG.md | 10 ++++++++++ lib/src/multipart_request.dart | 21 +++++++++++++-------- 2 files changed, 23 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3e4ebd8ffe..4a5cb769c3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,13 @@ +## 0.11.3+12 + +* Don't quote the boundary header for `MultipartRequest`. This is more + compatible with server quirks. + +## 0.11.3+11 + +* Fix the SDK constraint to only include SDK versions that support importing + `dart:io` everywhere. + ## 0.11.3+10 * Stop using `dart:mirrors`. diff --git a/lib/src/multipart_request.dart b/lib/src/multipart_request.dart index 2d3b318c9d..7250def98f 100644 --- a/lib/src/multipart_request.dart +++ b/lib/src/multipart_request.dart @@ -83,7 +83,7 @@ class MultipartRequest extends BaseRequest { ByteStream finalize() { // TODO(nweiz): freeze fields and files var boundary = _boundaryString(); - headers['content-type'] = 'multipart/form-data; boundary="$boundary"'; + headers['content-type'] = 'multipart/form-data; boundary=$boundary'; super.finalize(); var controller = new StreamController>(sync: true); @@ -117,14 +117,19 @@ class MultipartRequest extends BaseRequest { return new ByteStream(controller.stream); } - /// All character codes that are valid in multipart boundaries. From - /// http://tools.ietf.org/html/rfc2046#section-5.1.1. + /// All character codes that are valid in multipart boundaries. This is the + /// intersection of the characters allowed in the `bcharsnospace` production + /// defined in [RFC 2046][] and those allowed in the `token` production + /// defined in [RFC 1521][]. + /// + /// [RFC 2046]: http://tools.ietf.org/html/rfc2046#section-5.1.1. + /// [RFC 1521]: https://tools.ietf.org/html/rfc1521#section-4 static const List _BOUNDARY_CHARACTERS = const [ - 39, 40, 41, 43, 95, 44, 45, 46, 47, 58, 61, 63, 48, 49, 50, 51, 52, 53, 54, - 55, 56, 57, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, - 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 97, 98, 99, 100, 101, 102, 103, - 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, - 119, 120, 121, 122 + 39, 43, 95, 44, 45, 46, 58, 61, 63, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86, 87, 88, 89, 90, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, + 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, + 122 ]; /// Returns the header string for a field. The return value is guaranteed to From 8e4c1f90b6a11a3847dd6744f6b4a0e5c8c4e4de Mon Sep 17 00:00:00 2001 From: Don Date: Fri, 23 Jun 2017 17:00:05 -0700 Subject: [PATCH 2/3] remove boundary characters that pkg:http_parser cannot parse (#72) --- lib/src/boundary_characters.dart | 18 ++++++++++++++++++ lib/src/multipart_request.dart | 18 ++---------------- 2 files changed, 20 insertions(+), 16 deletions(-) create mode 100644 lib/src/boundary_characters.dart diff --git a/lib/src/boundary_characters.dart b/lib/src/boundary_characters.dart new file mode 100644 index 0000000000..03b7ac2d5e --- /dev/null +++ b/lib/src/boundary_characters.dart @@ -0,0 +1,18 @@ +// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +/// All character codes that are valid in multipart boundaries. This is the +/// intersection of the characters allowed in the `bcharsnospace` production +/// defined in [RFC 2046][] and those allowed in the `token` production +/// defined in [RFC 1521][]. +/// +/// [RFC 2046]: http://tools.ietf.org/html/rfc2046#section-5.1.1. +/// [RFC 1521]: https://tools.ietf.org/html/rfc1521#section-4 +const List BOUNDARY_CHARACTERS = const [ + 39, 43, 95, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86, 87, 88, 89, 90, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, + 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, + 122 +]; diff --git a/lib/src/multipart_request.dart b/lib/src/multipart_request.dart index 7250def98f..8132f80924 100644 --- a/lib/src/multipart_request.dart +++ b/lib/src/multipart_request.dart @@ -7,6 +7,7 @@ import 'dart:convert'; import 'dart:math'; import 'base_request.dart'; +import 'boundary_characters.dart'; import 'byte_stream.dart'; import 'multipart_file.dart'; import 'utils.dart'; @@ -117,21 +118,6 @@ class MultipartRequest extends BaseRequest { return new ByteStream(controller.stream); } - /// All character codes that are valid in multipart boundaries. This is the - /// intersection of the characters allowed in the `bcharsnospace` production - /// defined in [RFC 2046][] and those allowed in the `token` production - /// defined in [RFC 1521][]. - /// - /// [RFC 2046]: http://tools.ietf.org/html/rfc2046#section-5.1.1. - /// [RFC 1521]: https://tools.ietf.org/html/rfc1521#section-4 - static const List _BOUNDARY_CHARACTERS = const [ - 39, 43, 95, 44, 45, 46, 58, 61, 63, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, - 84, 85, 86, 87, 88, 89, 90, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, - 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, - 122 - ]; - /// Returns the header string for a field. The return value is guaranteed to /// contain only ASCII characters. String _headerForField(String name, String value) { @@ -172,7 +158,7 @@ class MultipartRequest extends BaseRequest { var prefix = "dart-http-boundary-"; var list = new List.generate(_BOUNDARY_LENGTH - prefix.length, (index) => - _BOUNDARY_CHARACTERS[_random.nextInt(_BOUNDARY_CHARACTERS.length)], + BOUNDARY_CHARACTERS[_random.nextInt(BOUNDARY_CHARACTERS.length)], growable: false); return "$prefix${new String.fromCharCodes(list)}"; } From 6e72c110998a821b2eef80ddd4a9d5e01a079c07 Mon Sep 17 00:00:00 2001 From: Don Date: Fri, 23 Jun 2017 17:00:45 -0700 Subject: [PATCH 3/3] version bump; changelog about boundary characters (#73) --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4a5cb769c3..8545e484a7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.11.3+13 + +* remove boundary characters that package:http_parser cannot parse. + ## 0.11.3+12 * Don't quote the boundary header for `MultipartRequest`. This is more