예제 #1
0
        public async Task <HttpResponseMessage> Put(string name, bool preserveTimestamps = false)
        {
            var metadata = GetFilteredMetadataFromHeaders(ReadInnerHeaders);
            var etag     = GetEtag();

            var options = new FileActions.PutOperationOptions();

            long contentSize;

            if (long.TryParse(GetHeader(Constants.FileSystem.RavenFsSize), out contentSize))
            {
                options.ContentSize = contentSize;
            }

            DateTimeOffset lastModified;

            if (DateTimeOffset.TryParse(GetHeader(Constants.RavenLastModified), out lastModified))
            {
                options.LastModified = lastModified;
            }

            options.PreserveTimestamps      = preserveTimestamps;
            options.ContentLength           = Request.Content.Headers.ContentLength;
            options.TransferEncodingChunked = Request.Headers.TransferEncodingChunked ?? false;

            await FileSystem.Files.PutAsync(name, etag, metadata, () => Request.Content.ReadAsStreamAsync(), options);

            Synchronizations.StartSynchronizeDestinationsInBackground();

            return(GetEmptyMessage(HttpStatusCode.Created));
        }
예제 #2
0
        public async Task <HttpResponseMessage> Put(string name, bool preserveTimestamps = false)
        {
            var metadata = GetFilteredMetadataFromHeaders(ReadInnerHeaders);
            var etag     = GetEtag();

            if (name.Length > AbstractPager.GetMaxKeySize())
            {
                if (Log.IsDebugEnabled)
                {
                    Log.Debug("File '{0}' was not created due to illegal name length", name);
                }

                return(GetMessageWithString(string.Format("File '{0}' was not created due to illegal name length", name), HttpStatusCode.BadRequest));
            }

            var options = new FileActions.PutOperationOptions();

            long contentSize;

            if (long.TryParse(GetHeader(Constants.FileSystem.RavenFsSize), out contentSize))
            {
                options.ContentSize = contentSize;
            }

            DateTimeOffset lastModified;

            if (DateTimeOffset.TryParse(GetHeader(Constants.RavenLastModified), out lastModified))
            {
                options.LastModified = lastModified;
            }

            options.PreserveTimestamps      = preserveTimestamps;
            options.ContentLength           = Request.Content.Headers.ContentLength;
            options.TransferEncodingChunked = Request.Headers.TransferEncodingChunked ?? false;

            await FileSystem.Files.PutAsync(name, etag, metadata, () => Request.Content.ReadAsStreamAsync(), options).ConfigureAwait(false);

            SynchronizationTask.Context.NotifyAboutWork();

            return(GetEmptyMessage(HttpStatusCode.Created));
        }
예제 #3
0
        public async Task <HttpResponseMessage> Import()
        {
            using (var stream = await Request.Content.ReadAsStreamAsync().ConfigureAwait(false))
            {
                var  binaryReader = new BinaryReader(stream);
                long count        = 0;
                while (true)
                {
                    string name;
                    try
                    {
                        name = binaryReader.ReadString();
                    }
                    catch (EndOfStreamException)
                    {
                        break; // done
                    }

                    var metadata = RavenJObject.Parse(binaryReader.ReadString());

                    if (name.Length > SystemParameters.KeyMost)
                    {
                        if (Log.IsDebugEnabled)
                        {
                            Log.Debug("File '{0}' was not created due to illegal name length", name);
                        }
                        return(GetMessageWithString(string.Format("File '{0}' was not created due to illegal name length", name), HttpStatusCode.BadRequest));
                    }

                    var contentSize = binaryReader.ReadInt64();
                    var options     = new FileActions.PutOperationOptions
                    {
                        ContentSize = contentSize
                    };

                    RavenJToken lastModifiedJToken;
                    if (metadata.TryGetValue(Constants.RavenLastModified, out lastModifiedJToken))
                    {
                        DateTimeOffset lastModified;
                        if (DateTimeOffset.TryParse(lastModifiedJToken.Value <string>(), out lastModified))
                        {
                            options.LastModified = lastModified;
                        }
                    }

                    options.PreserveTimestamps = true;

                    var fileStream = new PartialStream(stream, contentSize);
                    var tcs        = new TaskCompletionSource <Stream>();
                    tcs.SetResult(fileStream);

                    await FileSystem.Files.PutAsync(name, null, metadata, () => tcs.Task, options).ConfigureAwait(false);

                    if (count % 100 == 0)
                    {
                        SynchronizationTask.Context.NotifyAboutWork();
                    }
                }

                SynchronizationTask.Context.NotifyAboutWork();
            }


            return(new HttpResponseMessage(HttpStatusCode.OK)
            {
            });
        }