| Index: generated/googleapis_beta/lib/src/common_internal.dart
|
| diff --git a/generated/googleapis_beta/lib/src/common_internal.dart b/generated/googleapis_beta/lib/src/common_internal.dart
|
| index 0939147e32a75cf91947c11812578019a55a00b7..a489b3a32f2f35c622ac9043192bb551aff7bbf7 100644
|
| --- a/generated/googleapis_beta/lib/src/common_internal.dart
|
| +++ b/generated/googleapis_beta/lib/src/common_internal.dart
|
| @@ -9,7 +9,7 @@ import "../common/common.dart" as common_external;
|
| import "package:http/http.dart" as http;
|
|
|
| const String USER_AGENT_STRING =
|
| - 'google-api-dart-client googleapis_beta/0.1.1';
|
| + 'google-api-dart-client googleapis_beta/0.2.0';
|
|
|
| const CONTENT_TYPE_JSON_UTF8 = 'application/json; charset=utf-8';
|
|
|
| @@ -152,7 +152,7 @@ class ApiRequester {
|
| if (requestUrl.startsWith('/')) {
|
| path ="$_rootUrl${requestUrl.substring(1)}";
|
| } else {
|
| - path ="$_rootUrl${_basePath.substring(1)}$requestUrl";
|
| + path ="$_rootUrl${_basePath}$requestUrl";
|
| }
|
|
|
| bool containsQueryParameter = path.contains('?');
|
| @@ -430,12 +430,19 @@ class ResumableMediaUploader {
|
|
|
| // Upload all but the last chunk.
|
| // The final send will be done in the [onDone] handler.
|
| - if (chunkStack.length > 1) {
|
| + bool hasPartialChunk = chunkStack.hasPartialChunk;
|
| + if (chunkStack.length > 1 ||
|
| + (chunkStack.length == 1 && hasPartialChunk)) {
|
| // Pause the input stream.
|
| subscription.pause();
|
|
|
| // Upload all chunks except the last one.
|
| - var fullChunks = chunkStack.removeSublist(0, chunkStack.length - 1);
|
| + var fullChunks;
|
| + if (hasPartialChunk) {
|
| + fullChunks = chunkStack.removeSublist(0, chunkStack.length);
|
| + } else {
|
| + fullChunks = chunkStack.removeSublist(0, chunkStack.length - 1);
|
| + }
|
| Future.forEach(fullChunks,
|
| (c) => _uploadChunkDrained(uploadUri, c)).then((_) {
|
| // All chunks uploaded, we can continue consuming data.
|
| @@ -457,11 +464,13 @@ class ResumableMediaUploader {
|
| chunkStack.finalize();
|
|
|
| var lastChunk;
|
| - if (chunkStack.totalByteLength > 0) {
|
| - assert(chunkStack.length == 1);
|
| + if (chunkStack.length == 1) {
|
| lastChunk = chunkStack.removeSublist(0, chunkStack.length).first;
|
| } else {
|
| - lastChunk = new ResumableChunk([], 0, 0);
|
| + completer.completeError(new StateError(
|
| + 'Resumable uploads need to result in at least one non-empty '
|
| + 'chunk at the end.'));
|
| + return;
|
| }
|
| var end = lastChunk.endOfChunk;
|
|
|
| @@ -654,16 +663,34 @@ class ChunkStack {
|
| // Currently accumulated data.
|
| List<List<int>> _byteArrays = [];
|
| int _length = 0;
|
| - int _totalLength = 0;
|
| int _offset = 0;
|
|
|
| bool _finalized = false;
|
|
|
| ChunkStack(this._chunkSize);
|
|
|
| + /**
|
| + * Whether data for a not-yet-finished [ResumableChunk] is present. A call to
|
| + * `finalize` will create a [ResumableChunk] of this data.
|
| + */
|
| + bool get hasPartialChunk => _length > 0;
|
| +
|
| + /**
|
| + * The number of chunks in this [ChunkStack].
|
| + */
|
| int get length => _chunkStack.length;
|
|
|
| - int get totalByteLength => _offset;
|
| + /**
|
| + * The total number of bytes which have been converted to [ResumableChunk]s.
|
| + * Can only be called once this [ChunkStack] has been finalized.
|
| + */
|
| + int get totalByteLength {
|
| + if (!_finalized) {
|
| + throw new StateError('ChunkStack has not been finalized yet.');
|
| + }
|
| +
|
| + return _offset;
|
| + }
|
|
|
| /**
|
| * Returns the chunks [from] ... [to] and deletes it from the stack.
|
|
|