public async Task <MetaData> FilesAsync(string path, Stream targetStream, string rev = null, string asTeamMember = null, CancellationToken cancellationToken = default(CancellationToken)) { MetaData fileMetadata = null; string etag = ""; long? length; using (var restResponse = await _requestExecuter.Execute(() => _requestGenerator.Files(_options.Root, path, rev, asTeamMember), cancellationToken: cancellationToken).ConfigureAwait(false)) { await _requestExecuter.CheckForError(restResponse, false, cancellationToken).ConfigureAwait(false); length = restResponse.Content.Headers.ContentLength; if (length == null) { IEnumerable <string> metadatas; if (restResponse.Headers.TryGetValues("x-dropbox-metadata", out metadatas)) { string metadata = metadatas.FirstOrDefault(); if (metadata != null) { fileMetadata = JsonConvert.DeserializeObject <MetaData>(metadata); length = fileMetadata.bytes; } } } IEnumerable <string> etags; if (restResponse.Headers.TryGetValues("etag", out etags)) { etag = etags.FirstOrDefault(); } } long read = 0; bool hasMore = true; do { long from = read; long to = read + _options.ChunkSize; using (var restResponse2 = await _requestExecuter.Execute(() => _requestGenerator.FilesRange(_options.Root, path, from, to - 1, etag, rev, asTeamMember), cancellationToken: cancellationToken).ConfigureAwait(false)) { try { using (cancellationToken.Register(restResponse2.Dispose)) await restResponse2.Content.CopyToAsync(targetStream).ConfigureAwait(false); } catch (HttpRequestException ex) { if (ex.InnerException != null && ex.InnerException is ObjectDisposedException) { cancellationToken.ThrowIfCancellationRequested(); } throw; } catch (ObjectDisposedException) { cancellationToken.ThrowIfCancellationRequested(); } read += (restResponse2.Content.Headers.ContentLength ?? 0); if (length.HasValue && read >= length.GetValueOrDefault()) { hasMore = false; } else if (restResponse2.StatusCode == HttpStatusCode.OK) { hasMore = false; } } } while (hasMore); return(fileMetadata); }