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 }
/// <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); } }; }
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)); }
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)); }
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)); }
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); }
/// <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); }; }