Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(335)

Unified Diff: utils/pub/io.dart

Issue 10917053: Show nicer errors on some server failures. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Remove unnecessary check. Created 8 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « utils/pub/hosted_source.dart ('k') | utils/pub/pub.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: utils/pub/io.dart
diff --git a/utils/pub/io.dart b/utils/pub/io.dart
index 0874ba876edffd49c9414d74417bec7b0577450b..f24dfd4e0e2e7a15c5df32b60ff80851ceda5102 100644
--- a/utils/pub/io.dart
+++ b/utils/pub/io.dart
@@ -128,7 +128,7 @@ Future<File> writeTextFile(file, String contents) {
* Asynchronously deletes [file], which can be a [String] or a [File]. Returns a
* [Future] that completes when the deletion is done.
*/
-Future<Directory> deleteFile(file) {
+Future<File> deleteFile(file) {
return new File(_getPath(file)).delete();
}
@@ -310,6 +310,59 @@ InputStream httpGet(uri) {
}
/**
+ * Opens an input stream for a HTTP GET request to [uri], which may be a
+ * [String] or [Uri]. Completes with the result of the request as a String.
+ */
+Future<String> httpGetString(uri) {
+ // TODO(rnystrom): This code is very similar to httpGet() and
+ // consumeInputStream() (but this one propagates errors). Merge them when
+ // #3657 is fixed.
+ uri = _getUri(uri);
+
+ var completer = new Completer<String>();
+ var client = new HttpClient();
+ var connection = client.getUrl(uri);
+
+ connection.onError = (e) {
+ // Show a friendly error if the URL couldn't be resolved.
+ if (e is SocketIOException && e.osError.errorCode == 8) {
+ e = 'Could not resolve URL "${uri.origin}".';
+ }
+
+ client.shutdown();
+ completer.completeException(e);
+ };
+
+ connection.onResponse = (response) {
+ if (response.statusCode >= 400) {
+ client.shutdown();
+ completer.completeException(
+ new HttpException(response.statusCode, response.reasonPhrase));
+ return;
+ }
+
+ var resultStream = new ListInputStream();
+ var buffer = <int>[];
+
+ response.inputStream.onClosed = () {
+ client.shutdown();
+ completer.complete(new String.fromCharCodes(buffer));
+ };
+
+ response.inputStream.onData = () {
+ buffer.addAll(response.inputStream.read());
+ };
+
+ response.inputStream.onError = (e) {
+ client.shutdown();
+ completer.completeException(e);
+ };
+ };
+
+ return completer.future;
+}
+
+/**
* Takes all input from [source] and writes it to [sink].
*
* [onClosed] is called when [source] is closed.
@@ -452,6 +505,16 @@ Future<bool> extractTarGz(InputStream stream, destination) {
}
/**
+ * Exception thrown when an HTTP operation fails.
+ */
+class HttpException implements Exception {
+ final int statusCode;
+ final String reason;
+
+ const HttpException(this.statusCode, this.reason);
+}
+
+/**
* Contains the results of invoking a [Process] and waiting for it to complete.
*/
class PubProcessResult {
« no previous file with comments | « utils/pub/hosted_source.dart ('k') | utils/pub/pub.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698