コード例 #1
0
ファイル: Application.cs プロジェクト: hoetz/Simple.Web
        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;
        }
コード例 #2
0
ファイル: Application.cs プロジェクト: hoetz/Simple.Web
        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();
        }
コード例 #3
0
ファイル: Application.cs プロジェクト: hoetz/Simple.Web
        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();
        }