Ejemplo n.º 1
0
        /// <inheritdoc />
        public override async Task ExecuteResultAsync(IWebDavResponse response, CancellationToken ct)
        {
            var formatter = response.Dispatcher.Formatter;

            response.ContentType = formatter.ContentType;
            await base.ExecuteResultAsync(response, ct);

            formatter.Serialize(response.Body, Data);
        }
Ejemplo n.º 2
0
        public override async Task ExecuteResultAsync(IWebDavResponse response, CancellationToken ct)
        {
            await base.ExecuteResultAsync(response, ct).ConfigureAwait(false);

            if (_document.FileSystem.SupportsRangedRead)
            {
                response.Headers["Accept-Ranges"] = new[] { "bytes" }
            }
            ;

            var properties = await _document.GetProperties(response.Dispatcher).ToList(ct).ConfigureAwait(false);

            var etagProperty = properties.OfType <GetETagProperty>().FirstOrDefault();

            if (etagProperty != null)
            {
                var propValue = await etagProperty.GetValueAsync(ct).ConfigureAwait(false);

                response.Headers["ETag"] = new[] { propValue.ToString() };
            }

            if (!_returnFile)
            {
                var lastModifiedProp = properties.OfType <LastModifiedProperty>().FirstOrDefault();
                if (lastModifiedProp != null)
                {
                    var propValue = await lastModifiedProp.GetValueAsync(ct).ConfigureAwait(false);

                    response.Headers["Last-Modified"] = new[] { propValue.ToString("R") };
                }

                return;
            }

            using (var stream = await _document.OpenReadAsync(ct).ConfigureAwait(false))
            {
                using (var content = new StreamContent(stream))
                {
                    // I'm storing the headers in the content, because I'm too lazy to
                    // look up the header names and the formatting of its values.
                    await SetPropertiesToContentHeaderAsync(content, properties, ct).ConfigureAwait(false);

                    foreach (var header in content.Headers)
                    {
                        response.Headers.Add(header.Key, header.Value.ToArray());
                    }

                    // Use the CopyToAsync function of the stream itself, because
                    // we're able to pass the cancellation token. This is a workaround
                    // for issue dotnet/corefx#9071 and fixes FubarDevelopment/WebDavServer#47.
                    await stream.CopyToAsync(response.Body, 81920, ct)
                    .ConfigureAwait(false);
                }
            }
        }
        public override async Task ExecuteResultAsync(IWebDavResponse response, CancellationToken ct)
        {
            await base.ExecuteResultAsync(response, ct).ConfigureAwait(false);

            if (_document.FileSystem.SupportsRangedRead)
            {
                response.Headers["Accept-Ranges"] = new[] { "bytes" }
            }
            ;

            var properties = await _document.GetProperties(response.Dispatcher).ToList(ct).ConfigureAwait(false);

            var etagProperty = properties.OfType <GetETagProperty>().FirstOrDefault();

            if (etagProperty != null)
            {
                var propValue = await etagProperty.GetValueAsync(ct).ConfigureAwait(false);

                response.Headers["ETag"] = new[] { propValue.ToString() };
            }

            if (!_returnFile)
            {
                var lastModifiedProp = properties.OfType <LastModifiedProperty>().FirstOrDefault();
                if (lastModifiedProp != null)
                {
                    var propValue = await lastModifiedProp.GetValueAsync(ct).ConfigureAwait(false);

                    response.Headers["Last-Modified"] = new[] { propValue.ToString("R") };
                }

                return;
            }

            using (var stream = await _document.OpenReadAsync(ct).ConfigureAwait(false))
            {
                var content = new StreamContent(stream);
                await SetPropertiesToContentHeaderAsync(content, properties, ct).ConfigureAwait(false);

                foreach (var header in content.Headers)
                {
                    response.Headers.Add(header.Key, header.Value.ToArray());
                }

                await content.CopyToAsync(response.Body).ConfigureAwait(false);
            }
        }
Ejemplo n.º 4
0
        /// <inheritdoc />
        public virtual Task ExecuteResultAsync(IWebDavResponse response, CancellationToken ct)
        {
            IImmutableDictionary <string, IEnumerable <string> > headers = ImmutableDictionary <string, IEnumerable <string> > .Empty;

            foreach (var webDavClass in response.Dispatcher.SupportedClasses)
            {
                headers = AddHeaderValues(headers, webDavClass.DefaultResponseHeaders);
            }

            headers = AddHeaderValues(headers, Headers);

            foreach (var header in headers)
            {
                response.Headers[header.Key] = header.Value.ToArray();
            }

            return(Task.FromResult(0));
        }
Ejemplo n.º 5
0
            public override Task ExecuteResultAsync(IWebDavResponse response, CancellationToken ct)
            {
                IImmutableDictionary <string, IEnumerable <string> > headers = ImmutableDictionary <string, IEnumerable <string> > .Empty;

                foreach (var webDavClass in response.Dispatcher.SupportedClasses)
                {
                    headers = AddHeaderValues(headers, webDavClass.OptionsResponseHeaders);
                }

                if (_targetFileSystem.SupportsRangedRead)
                {
                    Headers["Accept-Ranges"] = new[] { "bytes" }
                }
                ;

                foreach (var header in headers)
                {
                    Headers[header.Key] = header.Value;
                }

                return(base.ExecuteResultAsync(response, ct));
            }
        }
Ejemplo n.º 6
0
        public override async Task ExecuteResultAsync(IWebDavResponse response, CancellationToken ct)
        {
            await base.ExecuteResultAsync(response, ct).ConfigureAwait(false);

            response.Headers["Accept-Ranges"] = new[] { "bytes" };

            var properties = await _document.GetProperties(response.Dispatcher).ToList(ct).ConfigureAwait(false);

            var etagProperty = properties.OfType <GetETagProperty>().FirstOrDefault();

            if (etagProperty != null)
            {
                var propValue = await etagProperty.GetValueAsync(ct).ConfigureAwait(false);

                response.Headers["ETag"] = new[] { propValue.ToString() };
            }

            if (!_returnFile)
            {
                var lastModifiedProp = properties.OfType <LastModifiedProperty>().FirstOrDefault();
                if (lastModifiedProp != null)
                {
                    var propValue = await lastModifiedProp.GetValueAsync(ct).ConfigureAwait(false);

                    response.Headers["Last-Modified"] = new[] { propValue.ToString("R") };
                }

                return;
            }

            var views = new List <StreamView>();

            try
            {
                foreach (var rangeItem in _rangeItems)
                {
                    var baseStream = await _document.OpenReadAsync(ct).ConfigureAwait(false);

                    var streamView = await StreamView
                                     .CreateAsync(baseStream, rangeItem.From, rangeItem.Length, ct)
                                     .ConfigureAwait(false);

                    views.Add(streamView);
                }

                string contentType;
                var    contentTypeProp = properties.OfType <GetContentTypeProperty>().FirstOrDefault();
                if (contentTypeProp != null)
                {
                    contentType = await contentTypeProp.GetValueAsync(ct).ConfigureAwait(false);
                }
                else
                {
                    contentType = MimeTypesMap.DefaultMimeType;
                }

                HttpContent content;
                if (_rangeItems.Count == 1)
                {
                    // No multipart content
                    var rangeItem  = _rangeItems.Single();
                    var streamView = views.Single();
                    content = new StreamContent(streamView);
                    try
                    {
                        content.Headers.ContentRange  = new ContentRangeHeaderValue(rangeItem.From, rangeItem.To, _document.Length);
                        content.Headers.ContentLength = rangeItem.Length;
                    }
                    catch
                    {
                        content.Dispose();
                        throw;
                    }

                    content.Headers.ContentType = MediaTypeHeaderValue.Parse(contentType);
                }
                else
                {
                    // Multipart content
                    var multipart = new MultipartContent("byteranges");
                    try
                    {
                        var index = 0;
                        foreach (var rangeItem in _rangeItems)
                        {
                            var streamView  = views[index++];
                            var partContent = new StreamContent(streamView);
                            partContent.Headers.ContentRange  = new ContentRangeHeaderValue(rangeItem.From, rangeItem.To, _document.Length);
                            partContent.Headers.ContentType   = MediaTypeHeaderValue.Parse(contentType);
                            partContent.Headers.ContentLength = rangeItem.Length;
                            multipart.Add(partContent);
                        }
                    }
                    catch
                    {
                        multipart.Dispose();
                        throw;
                    }

                    content = multipart;
                }

                using (content)
                {
                    await SetPropertiesToContentHeaderAsync(content, properties, ct)
                    .ConfigureAwait(false);

                    foreach (var header in content.Headers)
                    {
                        response.Headers.Add(header.Key, header.Value.ToArray());
                    }

                    await content.CopyToAsync(response.Body).ConfigureAwait(false);
                }
            }
            finally
            {
                foreach (var streamView in views)
                {
                    streamView.Dispose();
                }
            }
        }
Ejemplo n.º 7
0
        /// <inheritdoc />
        public override async Task ExecuteResultAsync(IWebDavResponse response, CancellationToken ct)
        {
            await base.ExecuteResultAsync(response, ct);

            response.Dispatcher.Formatter.Serialize(response.Body, _element);
        }
Ejemplo n.º 8
0
        public override async Task ExecuteResultAsync(IWebDavResponse response, CancellationToken ct)
        {
            await base.ExecuteResultAsync(response, ct);

            response.Headers["Accept-Ranges"] = new[] { "bytes" };

            var properties = await _document.GetProperties(response.Dispatcher).ToList(ct);

            var etagProperty = properties.OfType <GetETagProperty>().FirstOrDefault();

            if (etagProperty != null)
            {
                var propValue = await etagProperty.GetValueAsync(ct);

                response.Headers["ETag"] = new[] { propValue.ToString() };
            }

            if (!_returnFile)
            {
                var lastModifiedProp = properties.OfType <LastModifiedProperty>().FirstOrDefault();
                if (lastModifiedProp != null)
                {
                    var propValue = await lastModifiedProp.GetValueAsync(ct);

                    response.Headers["Last-Modified"] = new[] { propValue.ToString("R") };
                }

                return;
            }

            var views = new List <StreamView>();

            try
            {
                foreach (var rangeItem in _rangeItems)
                {
                    var baseStream = await _document.OpenReadAsync(ct);

                    var streamView = await StreamView
                                     .CreateAsync(baseStream, rangeItem.From, rangeItem.Length, ct)
                    ;

                    views.Add(streamView);
                }

                string contentType;
                var    contentTypeProp = properties.OfType <GetContentTypeProperty>().FirstOrDefault();
                if (contentTypeProp != null)
                {
                    contentType = await contentTypeProp.GetValueAsync(ct);
                }
                else
                {
                    contentType = MimeTypesMap.DefaultMimeType;
                }

                if (_rangeItems.Count == 1)
                {
                    // No multipart content
                    var rangeItem  = _rangeItems.Single();
                    var streamView = views.Single();
                    using (var streamContent = new StreamContent(streamView))
                    {
                        streamContent.Headers.ContentRange = new ContentRangeHeaderValue(
                            rangeItem.From,
                            rangeItem.To,
                            _document.Length);
                        streamContent.Headers.ContentLength = rangeItem.Length;

                        streamContent.Headers.ContentType = MediaTypeHeaderValue.Parse(contentType);

                        await SetPropertiesToContentHeaderAsync(streamContent, properties, ct)
                        ;

                        foreach (var header in streamContent.Headers)
                        {
                            response.Headers.Add(header.Key, header.Value.ToArray());
                        }

                        // Use the CopyToAsync function of the stream itself, because
                        // we're able to pass the cancellation token. This is a workaround
                        // for issue dotnet/corefx#9071 and fixes FubarDevelopment/WebDavServer#47.
                        await streamView.CopyToAsync(response.Body, 81920, ct)
                        ;
                    }
                }
                else
                {
                    // Multipart content
                    using (var multipart = new MultipartContent("byteranges"))
                    {
                        var index = 0;
                        foreach (var rangeItem in _rangeItems)
                        {
                            var streamView  = views[index++];
                            var partContent = new StreamContent(streamView);
                            partContent.Headers.ContentRange = new ContentRangeHeaderValue(
                                rangeItem.From,
                                rangeItem.To,
                                _document.Length);
                            partContent.Headers.ContentType   = MediaTypeHeaderValue.Parse(contentType);
                            partContent.Headers.ContentLength = rangeItem.Length;
                            multipart.Add(partContent);
                        }

                        await SetPropertiesToContentHeaderAsync(multipart, properties, ct)
                        ;

                        foreach (var header in multipart.Headers)
                        {
                            response.Headers.Add(header.Key, header.Value.ToArray());
                        }

                        // TODO: Workaround for issue dotnet/corefx#9071
                        await multipart.CopyToAsync(response.Body);
                    }
                }
            }
            finally
            {
                foreach (var streamView in views)
                {
                    streamView.Dispose();
                }
            }
        }
Ejemplo n.º 9
0
        public override async Task ExecuteResultAsync(IWebDavResponse response, CancellationToken ct)
        {
            await base.ExecuteResultAsync(response, ct);

            response.Headers["Last-Modified"] = new[] { _collection.LastWriteTimeUtc.ToString("R") };
        }