Пример #1
0
        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);
        }