From f3bbc14e701b390fbea1bbdffd86fda48965694a Mon Sep 17 00:00:00 2001 From: Natalie Weizenbaum Date: Wed, 15 Feb 2017 15:45:37 -0800 Subject: [PATCH] Stop using dart:mirrors. --- CHANGELOG.md | 4 +++ lib/browser_client.dart | 4 +-- lib/src/client.dart | 6 +--- lib/src/io.dart | 55 ------------------------------------- lib/src/io_client.dart | 24 ++++------------ lib/src/multipart_file.dart | 8 +++--- pubspec.yaml | 4 +-- 7 files changed, 17 insertions(+), 88 deletions(-) delete mode 100644 lib/src/io.dart diff --git a/CHANGELOG.md b/CHANGELOG.md index bb02985362..3e4ebd8ffe 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.11.3+10 + +* Stop using `dart:mirrors`. + ## 0.11.3+9 * Remove an extra newline in multipart chunks. diff --git a/lib/browser_client.dart b/lib/browser_client.dart index 883b2b184a..309b3ac7e1 100644 --- a/lib/browser_client.dart +++ b/lib/browser_client.dart @@ -15,9 +15,7 @@ import 'src/exception.dart'; import 'src/streamed_response.dart'; // TODO(nweiz): Move this under src/, re-export from lib/http.dart, and use this -// automatically from [new Client] once we can create an HttpRequest using -// mirrors on dart2js (issue 18541) and dart2js doesn't crash on pkg/collection -// (issue 18535). +// automatically from [new Client] once sdk#24581 is fixed. /// A `dart:html`-based HTTP client that runs in the browser and is backed by /// XMLHttpRequests. diff --git a/lib/src/client.dart b/lib/src/client.dart index 70d317e34d..cf1ff784a0 100644 --- a/lib/src/client.dart +++ b/lib/src/client.dart @@ -8,7 +8,6 @@ import 'dart:typed_data'; import 'base_client.dart'; import 'base_request.dart'; -import 'io.dart' as io; import 'io_client.dart'; import 'response.dart'; import 'streamed_response.dart'; @@ -28,10 +27,7 @@ abstract class Client { /// Currently this will create an [IOClient] if `dart:io` is available and /// throw an [UnsupportedError] otherwise. In the future, it will create a /// [BrowserClient] if `dart:html` is available. - factory Client() { - io.assertSupported("IOClient"); - return new IOClient(); - } + factory Client() => new IOClient(); /// Sends an HTTP HEAD request with the given headers to the given URL, which /// can be a [Uri] or a [String]. diff --git a/lib/src/io.dart b/lib/src/io.dart deleted file mode 100644 index 7c41f99290..0000000000 --- a/lib/src/io.dart +++ /dev/null @@ -1,55 +0,0 @@ -// Copyright (c) 2014, 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. - -@MirrorsUsed(targets: const ['dart.io.HttpClient', 'dart.io.HttpException', - 'dart.io.File']) -import 'dart:mirrors'; - -/// Whether `dart:io` is supported on this platform. -bool get supported => _library != null; - -/// The `dart:io` library mirror, or `null` if it couldn't be loaded. -final _library = _getLibrary(); - -/// The `dart:io` HttpClient class mirror. -final ClassMirror _httpClient = - _library.declarations[const Symbol('HttpClient')]; - -/// The `dart:io` HttpException class mirror. -final ClassMirror _httpException = - _library.declarations[const Symbol('HttpException')]; - -/// The `dart:io` File class mirror. -final ClassMirror _file = _library.declarations[const Symbol('File')]; - -/// Asserts that the [name]d `dart:io` feature is supported on this platform. -/// -/// If `dart:io` doesn't work on this platform, this throws an -/// [UnsupportedError]. -void assertSupported(String name) { - if (supported) return; - throw new UnsupportedError("$name isn't supported on this platform."); -} - -/// Creates a new `dart:io` HttpClient instance. -newHttpClient() => _httpClient.newInstance(const Symbol(''), []).reflectee; - -/// Creates a new `dart:io` File instance with the given [path]. -newFile(String path) => _file.newInstance(const Symbol(''), [path]).reflectee; - -/// Returns whether [error] is a `dart:io` HttpException. -bool isHttpException(error) => reflect(error).type.isSubtypeOf(_httpException); - -/// Returns whether [client] is a `dart:io` HttpClient. -bool isHttpClient(client) => reflect(client).type.isSubtypeOf(_httpClient); - -/// Tries to load `dart:io` and returns `null` if it fails. -LibraryMirror _getLibrary() { - try { - return currentMirrorSystem().findLibrary(const Symbol('dart.io')); - } catch (_) { - // TODO(nweiz): narrow the catch clause when issue 18532 is fixed. - return null; - } -} diff --git a/lib/src/io_client.dart b/lib/src/io_client.dart index 7387a30edb..03950ad6fa 100644 --- a/lib/src/io_client.dart +++ b/lib/src/io_client.dart @@ -3,13 +3,13 @@ // BSD-style license that can be found in the LICENSE file. import 'dart:async'; +import 'dart:io'; import 'package:async/async.dart'; import 'base_client.dart'; import 'base_request.dart'; import 'exception.dart'; -import 'io.dart' as io; import 'streamed_response.dart'; /// A `dart:io`-based HTTP client. @@ -17,23 +17,10 @@ import 'streamed_response.dart'; /// This is the default client when running on the command line. class IOClient extends BaseClient { /// The underlying `dart:io` HTTP client. - var _inner; + HttpClient _inner; /// Creates a new HTTP client. - /// - /// [innerClient] must be a `dart:io` HTTP client. If it's not passed, a - /// default one will be instantiated. - IOClient([innerClient]) { - io.assertSupported("IOClient"); - if (innerClient != null) { - // TODO(nweiz): remove this assert when we can type [innerClient] - // properly. - assert(io.isHttpClient(innerClient)); - _inner = innerClient; - } else { - _inner = io.newHttpClient(); - } - } + IOClient([HttpClient inner]) : _inner = inner ?? new HttpClient(); /// Sends an HTTP request and asynchronously returns the response. Future send(BaseRequest request) async { @@ -63,7 +50,7 @@ class IOClient extends BaseClient { return new StreamedResponse( DelegatingStream.typed/*>*/(response).handleError((error) => throw new ClientException(error.message, error.uri), - test: (error) => io.isHttpException(error)), + test: (error) => error is HttpException), response.statusCode, contentLength: response.contentLength == -1 ? null @@ -73,8 +60,7 @@ class IOClient extends BaseClient { isRedirect: response.isRedirect, persistentConnection: response.persistentConnection, reasonPhrase: response.reasonPhrase); - } catch (error) { - if (!io.isHttpException(error)) rethrow; + } on HttpException catch (error) { throw new ClientException(error.message, error.uri); } } diff --git a/lib/src/multipart_file.dart b/lib/src/multipart_file.dart index 3597c6ef59..da4bface78 100644 --- a/lib/src/multipart_file.dart +++ b/lib/src/multipart_file.dart @@ -4,13 +4,13 @@ import 'dart:async'; import 'dart:convert'; +import 'dart:io'; import 'package:async/async.dart'; import 'package:http_parser/http_parser.dart'; import 'package:path/path.dart' as path; import 'byte_stream.dart'; -import 'io.dart' as io; import 'utils.dart'; /// A file to be uploaded as part of a [MultipartRequest]. This doesn't need to @@ -85,12 +85,12 @@ class MultipartFile { /// defaults to `application/octet-stream`, but in the future may be inferred /// from [filename]. /// - /// This can only be used in an environment that supports "dart:io". + /// Throws an [UnsupportedError] if `dart:io` isn't supported in this + /// environment. static Future fromPath(String field, String filePath, {String filename, MediaType contentType}) async { - io.assertSupported("MultipartFile.fromPath"); if (filename == null) filename = path.basename(filePath); - var file = io.newFile(filePath); + var file = new File(filePath); var length = await file.length(); var stream = new ByteStream(DelegatingStream.typed(file.openRead())); return new MultipartFile(field, stream, length, diff --git a/pubspec.yaml b/pubspec.yaml index 4aa69c1b06..4ae55d8068 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: http -version: 0.11.3+9 +version: 0.11.3+10 author: "Dart Team " homepage: https://github.com/dart-lang/http description: A composable, Future-based API for making HTTP requests. @@ -12,4 +12,4 @@ dependencies: dev_dependencies: unittest: ">=0.9.0 <0.12.0" environment: - sdk: ">=1.9.0 <2.0.0" + sdk: ">=1.22.0 <2.0.0"