From f0c6d863a50b8fda00e68d574ea0cbecc9e26e1d Mon Sep 17 00:00:00 2001 From: Natalie Weizenbaum Date: Mon, 6 Mar 2017 12:46:25 -0800 Subject: [PATCH 1/2] Don't quote the multipart boundary header. 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 | 2 +- pubspec.yaml | 2 +- 3 files changed, 12 insertions(+), 2 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..4dc937cfe1 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); diff --git a/pubspec.yaml b/pubspec.yaml index 8f419adbb6..b922a51742 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: http -version: 0.11.3+11 +version: 0.11.3+12 author: "Dart Team " homepage: https://github.com/dart-lang/http description: A composable, Future-based API for making HTTP requests. From 95fa0145a9105bf0c60e8627ab0a4ad327f2b322 Mon Sep 17 00:00:00 2001 From: Natalie Weizenbaum Date: Mon, 6 Mar 2017 15:31:34 -0800 Subject: [PATCH 2/2] Only use valid token characters in the boundary. --- lib/src/multipart_request.dart | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/lib/src/multipart_request.dart b/lib/src/multipart_request.dart index 4dc937cfe1..7250def98f 100644 --- a/lib/src/multipart_request.dart +++ b/lib/src/multipart_request.dart @@ -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