private static Task WriteResponse(Task task, OwinContext context, IDictionary<string, object> env) { var tcs = new TaskCompletionSource<int>(); var cancellationToken = (CancellationToken)env[OwinKeys.CallCancelled]; if (cancellationToken.IsCancellationRequested) { tcs.SetCanceled(); } else if (task.IsFaulted || task.Exception != null) { context.Response.Status = Status.InternalServerError; context.Response.WriteFunction = ErrorHandler(task.Exception == null ? "An unknown error occured." : task.Exception.ToString()); } else { try { context.Response.EnsureContentTypeCharset(); env.Add(OwinKeys.StatusCode, context.Response.Status.Code); env.Add(OwinKeys.ReasonPhrase, context.Response.Status.Description); if (context.Response.Headers != null) { var responseHeaders = (IDictionary<string, string[]>)env[OwinKeys.ResponseHeaders]; foreach (var header in context.Response.Headers) { if (responseHeaders.ContainsKey(header.Key)) { responseHeaders[header.Key] = header.Value; } else { responseHeaders.Add(header.Key, header.Value); } } } if (context.Response.WriteFunction != null) { return context.Response.WriteFunction((Stream)env[OwinKeys.ResponseBody]); } tcs.SetResult(0); } catch (Exception ex) { tcs.SetException(ex); } } return tcs.Task; }
public static Task Run(IDictionary<string, object> env, Func<Task> next) { var context = new OwinContext(env); var task = Run(context); if (task == null) { return next(); } return task .ContinueWith(t => WriteResponse(t, context, env)).Unwrap(); }
public static Task Run(IDictionary<string, object> env) { var context = new OwinContext(env); var task = Run(context); if (task == null) { env.Add(OwinKeys.StatusCode, Status.NotFound.Code); env.Add(OwinKeys.ReasonPhrase, Status.NotFound.Description); return TaskHelper.Completed(new Result(null, Status.NotFound.Code, null, null)); } return task .ContinueWith(t => WriteResponse(t, context, env)).Unwrap(); }