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

Unified Diff: utils/pub/command_lish.dart

Issue 11569046: Add a pub command for managing uploaders for packages. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Code review changes Created 8 years 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 | « no previous file | utils/pub/command_uploader.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: utils/pub/command_lish.dart
diff --git a/utils/pub/command_lish.dart b/utils/pub/command_lish.dart
index df0f21d08b418196576f5537d1e664aa536f2541..b0f8733d73fb9b85bec564cbb219116d85b36227 100644
--- a/utils/pub/command_lish.dart
+++ b/utils/pub/command_lish.dart
@@ -12,6 +12,7 @@ import '../../pkg/args/lib/args.dart';
import '../../pkg/http/lib/http.dart' as http;
import 'directory_tree.dart';
import 'git.dart' as git;
+import 'http.dart';
import 'io.dart';
import 'log.dart' as log;
import 'oauth2.dart' as oauth2;
@@ -27,6 +28,8 @@ class LishCommand extends PubCommand {
ArgParser get commandParser {
var parser = new ArgParser();
+ // TODO(nweiz): Use HostedSource.defaultUrl as the default value once we use
+ // dart:io for HTTPS requests.
parser.addOption('server', defaultsTo: 'https://pub.dartlang.org',
help: 'The package server to which to upload this package');
return parser;
@@ -42,17 +45,17 @@ class LishCommand extends PubCommand {
// should report that error and exit.
var newUri = server.resolve("/packages/versions/new.json");
return client.get(newUri).chain((response) {
- var parameters = _parseJson(response);
+ var parameters = parseJsonResponse(response);
var url = _expectField(parameters, 'url', response);
- if (url is! String) _invalidServerResponse(response);
+ if (url is! String) invalidServerResponse(response);
cloudStorageUrl = new Uri.fromString(url);
var request = new http.MultipartRequest('POST', cloudStorageUrl);
var fields = _expectField(parameters, 'fields', response);
- if (fields is! Map) _invalidServerResponse(response);
+ if (fields is! Map) invalidServerResponse(response);
fields.forEach((key, value) {
- if (value is! String) _invalidServerResponse(response);
+ if (value is! String) invalidServerResponse(response);
request.fields[key] = value;
});
@@ -64,44 +67,18 @@ class LishCommand extends PubCommand {
var location = response.headers['location'];
if (location == null) throw new PubHttpException(response);
return location;
- }).chain((location) => client.get(location)).transform((response) {
- var parsed = _parseJson(response);
- if (parsed['success'] is! Map ||
- !parsed['success'].containsKey('message') ||
- parsed['success']['message'] is! String) {
- _invalidServerResponse(response);
- }
- log.message(parsed['success']['message']);
- });
+ }).chain((location) => client.get(location))
+ .transform(handleJsonSuccess);
}).transformException((e) {
- if (e is PubHttpException) {
- var url = e.response.request.url;
- if (url.toString() == cloudStorageUrl.toString()) {
- // TODO(nweiz): the response may have XML-formatted information about
- // the error. Try to parse that out once we have an easily-accessible
- // XML parser.
- throw 'Failed to upload the package.';
- } else if (url.origin == server.origin) {
- var errorMap = _parseJson(e.response);
- if (errorMap['error'] is! Map ||
- !errorMap['error'].containsKey('message') ||
- errorMap['error']['message'] is! String) {
- _invalidServerResponse(e.response);
- }
- throw errorMap['error']['message'];
- }
- } else if (e is oauth2.ExpirationException) {
- log.error("Pub's authorization to upload packages has expired and "
- "can't be automatically refreshed.");
- return _publish(packageBytes);
- } else if (e is oauth2.AuthorizationException) {
- var message = "OAuth2 authorization failed";
- if (e.description != null) message = "$message (${e.description})";
- log.error("$message.");
- return oauth2.clearCredentials(cache).chain((_) =>
- _publish(packageBytes));
- } else {
- throw e;
+ if (e is! PubHttpException) throw e;
+ var url = e.response.request.url;
+ if (url.toString() == cloudStorageUrl.toString()) {
+ // TODO(nweiz): the response may have XML-formatted information about
+ // the error. Try to parse that out once we have an easily-accessible
+ // XML parser.
+ throw 'Failed to upload the package.';
+ } else if (url.origin == server.origin) {
+ handleJsonError(e.response);
}
});
}
@@ -192,31 +169,11 @@ class LishCommand extends PubCommand {
}));
}
- /// Parses a response body, assuming it's JSON-formatted. Throws a
- /// user-friendly error if the response body is invalid JSON, or if it's not a
- /// map.
- Map _parseJson(http.Response response) {
- var value;
- try {
- value = JSON.parse(response.body);
- } catch (e) {
- // TODO(nweiz): narrow this catch clause once issue 6775 is fixed.
- _invalidServerResponse(response);
- }
- if (value is! Map) _invalidServerResponse(response);
- return value;
- }
-
/// Returns the value associated with [key] in [map]. Throws a user-friendly
/// error if [map] doens't contain [key].
_expectField(Map map, String key, http.Response response) {
if (map.containsKey(key)) return map[key];
- _invalidServerResponse(response);
- }
-
- /// Throws an error describing an invalid response from the server.
- void _invalidServerResponse(http.Response response) {
- throw 'Invalid server response:\n${response.body}';
+ invalidServerResponse(response);
}
/// Validates the package. Throws an exception if it's invalid.
« no previous file with comments | « no previous file | utils/pub/command_uploader.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698