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)}"; } diff --git a/test/io/utils.dart b/test/io/utils.dart index 4594b6e5a8..24276faff8 100644 --- a/test/io/utils.dart +++ b/test/io/utils.dart @@ -85,7 +85,7 @@ Future startServer() { requestBody = requestBodyBytes; } - var content = { + var content = { 'method': request.method, 'path': request.uri.path, 'headers': {} diff --git a/test/multipart_test.dart b/test/multipart_test.dart index 8f908f938b..ae3c4b320f 100644 --- a/test/multipart_test.dart +++ b/test/multipart_test.dart @@ -5,6 +5,7 @@ import 'dart:async'; import 'package:http/http.dart' as http; +import 'package:http/src/boundary_characters.dart'; import 'package:http_parser/http_parser.dart'; import 'package:unittest/unittest.dart'; @@ -18,6 +19,13 @@ void main() { ''')); }); + test('boundary characters', () { + var testBoundary = new String.fromCharCodes(BOUNDARY_CHARACTERS); + var contentType = new MediaType.parse('text/plain; boundary=${testBoundary}'); + var boundary = contentType.parameters['boundary']; + expect(boundary, testBoundary); + }); + test('with fields and files', () { var request = new http.MultipartRequest('POST', dummyUrl); request.fields['field1'] = 'value1';