private async Task <IActionResult> GetResultAsync(HttpContext context, IFunctionExecutionFeature functionExecution) { if (functionExecution.Descriptor == null) { return(new NotFoundResult()); } if (context.Request.IsColdStart() && !context.Items.ContainsKey(ScriptConstants.AzureFunctionsColdStartKey)) { // for cold start requests we want to measure the request // pipeline dispatch time // important that this stopwatch is started as early as possible // in the pipeline (in this case, in our first middleware) var sw = new Stopwatch(); sw.Start(); context.Items[ScriptConstants.AzureFunctionsColdStartKey] = sw; } PopulateRouteData(context); bool authorized = await AuthenticateAndAuthorizeAsync(context, functionExecution.Descriptor); if (!authorized) { return(new UnauthorizedResult()); } // If the function is disabled, return 'NotFound', unless the request is being made with Admin credentials if (functionExecution.Descriptor.Metadata.IsDisabled() && !AuthUtility.PrincipalHasAuthLevelClaim(context.User, AuthorizationLevel.Admin)) { return(new NotFoundResult()); } if (functionExecution.CanExecute) { // Add the request to the logging scope. This allows the App Insights logger to // record details about the request. ILoggerFactory loggerFactory = context.RequestServices.GetService <ILoggerFactory>(); ILogger logger = loggerFactory.CreateLogger(LogCategories.CreateFunctionCategory(functionExecution.Descriptor.Name)); var scopeState = new Dictionary <string, object>() { [ScriptConstants.LoggerHttpRequest] = context.Request, }; using (logger.BeginScope(scopeState)) { var applicationLifetime = context.RequestServices.GetService <IApplicationLifetime>(); CancellationToken cancellationToken = applicationLifetime != null ? applicationLifetime.ApplicationStopping : CancellationToken.None; await functionExecution.ExecuteAsync(context.Request, cancellationToken); } } if (context.Items.TryGetValue(ScriptConstants.AzureFunctionsHttpResponseKey, out object result) && result is IActionResult actionResult) { return(actionResult); } return(new OkResult()); }
private async Task <IActionResult> GetResultAsync(HttpContext context, IFunctionExecutionFeature functionExecution) { if (functionExecution.Descriptor == null) { return(new NotFoundResult()); } // Add route data to request info // TODO: Keeping this here for now as other code depend on this property, but this can be done in the HTTP binding. var routingFeature = context.Features.Get <IRoutingFeature>(); context.Items.Add(HttpExtensionConstants.AzureWebJobsHttpRouteDataKey, new Dictionary <string, object>(routingFeature.RouteData.Values)); bool authorized = await AuthenticateAndAuthorizeAsync(context, functionExecution.Descriptor); if (!authorized) { return(new UnauthorizedResult()); } // If the function is disabled, return 'NotFound', unless the request is being made with Admin credentials if (functionExecution.Descriptor.Metadata.IsDisabled && !AuthUtility.PrincipalHasAuthLevelClaim(context.User, AuthorizationLevel.Admin)) { return(new NotFoundResult()); } if (functionExecution.CanExecute) { // Add the request to the logging scope. This allows the App Insights logger to // record details about the request. ILogger logger = _loggerFactory.CreateLogger(LogCategories.Function); var scopeState = new Dictionary <string, object>() { [ScriptConstants.LoggerHttpRequest] = context.Request }; using (logger.BeginScope(scopeState)) { // TODO: Flow cancellation token from caller await functionExecution.ExecuteAsync(context.Request, CancellationToken.None); } } if (context.Items.TryGetValue(ScriptConstants.AzureFunctionsHttpResponseKey, out object result) && result is IActionResult actionResult) { return(actionResult); } return(new OkResult()); }