Пример #1
0
 void InvokeAndDispose(RequestContextCore phpctx, Context.ScriptInfo script)
 {
     try
     {
         OnContextCreated(phpctx);
         phpctx.ProcessScript(script);
     }
     finally
     {
         phpctx.Dispose();
         phpctx.RequestCompletionSource.TrySetResult(RequestCompletionReason.Finished);
     }
 }
Пример #2
0
        Task InvokeAndDispose(RequestContextCore phpctx, Context.ScriptInfo script)
        {
            try
            {
                OnContextCreated(phpctx);
                phpctx.ProcessScript(script);
            }
            finally
            {
                phpctx.Dispose();
                phpctx.RequestEndEvent?.Set();
            }

            //
            return(Task.CompletedTask);
        }
        public Task Invoke(HttpContext context)
        {
            var script = RequestContextCore.ResolveScript(context.Request);

            if (script.IsValid)
            {
                return(Task.Run(() =>
                {
                    using (var phpctx = new RequestContextCore(context, _rootPath, _options.StringEncoding))
                    {
                        OnContextCreated(phpctx);
                        phpctx.ProcessScript(script);
                    }
                }));
            }

            return(_next(context));
        }
Пример #4
0
        async Task InvokeScriptAsync(HttpContext context, Context.ScriptInfo script, string path_info)
        {
            Debug.Assert(script.IsValid);

            using var phpctx = new RequestContextCore(context, _rootPath, _options.StringEncoding);

            OnContextCreated(phpctx);

            // run the script, dispose phpctx when finished
            // using threadpool since we have to be able to end the request and keep script running
            var task = Task.Run(() =>
            {
                try
                {
                    phpctx.ProcessScript(script, path_info);
                }
                finally
                {
                    phpctx.RequestCompletionSource.TrySetResult(RequestCompletionReason.Finished);
                }
            });

            // wait for the request to finish,
            // do not block current thread
            var reason = await phpctx.RequestCompletionSource.Task;

            if (task.Exception != null)
            {
                // rethrow script exception
                throw task.Exception;
            }
            else if (reason == RequestCompletionReason.Timeout)
            {
                throw RequestTimeoutException();
            }
        }