Пример #1
0
        public static Func <string, long, long?, CancellationToken, Task> Shim(OwinEnv env)
        {
            var stream = env.ResponseBody;

#if (NET40)
            return((path, offset, count, ct) =>
            {
                var tcs = new TaskCompletionSource <int>();
                try
                {
                    using (var source = File.OpenRead(path))
                    {
                        env.ResponseHeaders["Content-Length"] = new[] { source.Length.ToString(CultureInfo.InvariantCulture) };
                        source.CopyTo(stream);
                        tcs.SetResult(0);
                    }
                }
                catch (Exception exception)
                {
                    tcs.SetException(exception);
                }

                return tcs.Task;
            });
#else
            return(async(path, offset, count, ct) =>
            {
                using (var source = File.OpenRead(path))
                {
                    env.ResponseHeaders["Content-Length"] = new[] { source.Length.ToString(CultureInfo.InvariantCulture) };
                    await source.CopyToAsync(stream, 4096, ct);
                }
            });
#endif
        }
Пример #2
0
        /// <summary>
        /// Builds the OWIN AppFunc.
        /// </summary>
        /// <returns>A delegate that can be passed to OWIN.</returns>
        public Func <AppFunc, AppFunc> Build()
        {
            if (_files.Count == 0 && _folders.Count == 0)
            {
                return(next => next);
            }
            if (_files.Count > 0 && _folders.Count == 0)
            {
                return(next => envDict =>
                {
                    var env = new OwinEnv(envDict);
                    var path = env.RequestPath ?? "";
                    return TryFile(path, env) ?? next(envDict);
                });
            }

            _staticFolderMatcher = ChooseStaticFolderMatcher();

            if (_files.Count == 0) // Then folders must have something...
            {
                return(next => envDict =>
                {
                    var env = new OwinEnv(envDict);
                    var path = env.RequestPath ?? "";
                    return TryFolder(path, env) ?? next(envDict);
                });
            }

            return(next => envDict =>
            {
                var env = new OwinEnv(envDict);
                var path = env.RequestPath ?? "";
                return TryFile(path, env) ?? TryFolder(path, env) ?? next(envDict);
            });
        }
        public static Func<string, long, long?, CancellationToken, Task> Shim(OwinEnv env)
        {
            var stream = env.ResponseBody;

            return async (path, offset, count, ct) =>
            {
                using (var source = File.OpenRead(path))
                {
                    env.ResponseHeaders["Content-Length"] = new[] {source.Length.ToString(CultureInfo.InvariantCulture)};
                    await source.CopyToAsync(stream, 4096, ct);
                }
            };
        }
Пример #4
0
        private Task SendFile(OwinEnv env, string path, IEnumerable <Tuple <string, string> > headers)
        {
            var sendFile = env.SendFileAsync ?? SendFileShim.Shim(env);

            env.ResponseStatusCode = 200;
            var contentType = _mimeTypeResolver.ForFile(path);

            env.ResponseHeaders["Content-Type"] = new [] { IsText(contentType) ? contentType + _charset : contentType };

            // NOTE: The order here is important: common headers may be overwritten by item-specific headers
            foreach (var header in _commonHeaders.Concat(headers))
            {
                env.ResponseHeaders[header.Item1] = new[] { header.Item2 };
            }
            return(sendFile(path, 0, null, env.CallCancelled));
        }
Пример #5
0
        private Task TryFile(string path, OwinEnv env)
        {
            StaticFile staticFile;

            if (!_files.TryGetValue(path, out staticFile))
            {
                return(null);
            }
            if (!File.Exists(staticFile.Path))
            {
                env.ResponseStatusCode = 404;
                {
                    return(OwinHelpers.Completed());
                }
            }
            return(SendFile(env, staticFile.Path, staticFile.Headers));
        }
Пример #6
0
        private Task TryFolder(string path, OwinEnv env)
        {
            var staticFolder = _staticFolderMatcher(path);

            if (staticFolder == null)
            {
                return(null);
            }

            path = Path.Combine(staticFolder.Path,
                                path.Substring(staticFolder.Alias.Length).Replace('/', Path.DirectorySeparatorChar));

            if (!File.Exists(path))
            {
                return(null);
            }

            return(SendFile(env, path, staticFolder.Headers));
        }
Пример #7
0
        public static Func<string, long, long?, CancellationToken, Task> Shim(OwinEnv env)
        {
            var stream = env.ResponseBody;

#if(NET40)
            return (path, offset, count, ct) =>
            {
                var tcs = new TaskCompletionSource<int>();
                try
                {
                    using (var source = File.OpenRead(path))
                    {
                        env.ResponseHeaders["Content-Length"] = new[] { source.Length.ToString(CultureInfo.InvariantCulture) };
                        source.CopyTo(stream);
                        tcs.SetResult(0);
                    }

                }
                catch (Exception exception)
                {
                    tcs.SetException(exception);
                }

                return tcs.Task;
            };
#else
            return async (path, offset, count, ct) =>
            {
                using (var source = File.OpenRead(path))
                {
                    env.ResponseHeaders["Content-Length"] = new[] {source.Length.ToString(CultureInfo.InvariantCulture)};
                    await source.CopyToAsync(stream, 4096, ct);
                }
            };
#endif
        }
        public Func<IDictionary<string, object>, Func<IDictionary<string, object>, Task>, Task> Build()
        {
            if (_files.Count == 0 && _folders.Count == 0)
            {
                return (env, next) => next(env);
            }
            if (_files.Count > 0 && _folders.Count == 0)
            {
                return (envDict, next) =>
                {
                    var env = new OwinEnv(envDict);
                    var path = env.RequestPath ?? "";
                    return TryFile(path, env) ?? next(envDict);
                };
            }

            _staticFolderMatcher = ChooseStaticFolderMatcher();

            if (_files.Count == 0) // Then folders must have something...
            {
                return (envDict, next) =>
                {
                    var env = new OwinEnv(envDict);
                    var path = env.RequestPath ?? "";
                    return TryFolder(path, env) ?? next(envDict);
                };
            }

            return (envDict, next) =>
            {
                var env = new OwinEnv(envDict);
                var path = env.RequestPath ?? "";
                return TryFile(path, env) ?? TryFolder(path, env) ?? next(envDict);
            };
        }
        private Task SendFile(OwinEnv env, string path, IEnumerable<Tuple<string,string>> headers)
        {
            var sendFile = env.SendFileAsync ?? SendFileShim.Shim(env);
            env.ResponseStatusCode = 200;
            env.ResponseHeaders["Content-Type"] = new [] {_mimeTypeResolver.ForFile(path)};

            // NOTE: The order here is important: common headers may be overwritten by item-specific headers
            foreach (var header in _commonHeaders.Concat(headers))
            {
                env.ResponseHeaders[header.Item1] = new[] {header.Item2};
            }
            return sendFile(path, 0, null, env.CallCancelled);
        }
        private Task TryFolder(string path, OwinEnv env)
        {
            var staticFolder = _staticFolderMatcher(path);

            if (staticFolder == null) return null;

            path = Path.Combine(staticFolder.Path,
                path.Substring(staticFolder.Alias.Length).Replace('/', Path.DirectorySeparatorChar));

            if (!File.Exists(path)) return null;

            return SendFile(env, path, staticFolder.Headers);
        }
 private Task TryFile(string path, OwinEnv env)
 {
     StaticFile staticFile;
     if (!_files.TryGetValue(path, out staticFile)) return null;
     if (!File.Exists(staticFile.Path))
     {
         env.ResponseStatusCode = 404;
         {
             return OwinHelpers.Completed();
         }
     }
     return SendFile(env, staticFile.Path, staticFile.Headers);
 }
Пример #12
0
        /// <summary>
        /// Builds the OWIN AppFunc.
        /// </summary>
        /// <returns>A delegate that can be passed to OWIN.</returns>
        public Func<AppFunc, AppFunc> Build()
        {
            if (_files.Count == 0 && _folders.Count == 0)
            {
                return next => next;
            }
            if (_files.Count > 0 && _folders.Count == 0)
            {
                return next => envDict =>
                {
                    var env = new OwinEnv(envDict);
                    var path = env.RequestPath ?? "";
                    return TryFile(path, env) ?? next(envDict);
                };
            }

            _staticFolderMatcher = ChooseStaticFolderMatcher();

            if (_files.Count == 0) // Then folders must have something...
            {
                return next => envDict =>
                {
                    var env = new OwinEnv(envDict);
                    var path = env.RequestPath ?? "";
                    return TryFolder(path, env) ?? next(envDict);
                };
            }

            return next => envDict =>
            {
                var env = new OwinEnv(envDict);
                var path = env.RequestPath ?? "";
                return TryFile(path, env) ?? TryFolder(path, env) ?? next(envDict);
            };
        }