void InvokeAndDispose(RequestContextCore phpctx, Context.ScriptInfo script) { try { OnContextCreated(phpctx); phpctx.ProcessScript(script); } finally { phpctx.Dispose(); phpctx.RequestCompletionSource.TrySetResult(RequestCompletionReason.Finished); } }
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)); }
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(); } }