예제 #1
0
        /// <summary>
        /// Called when a process requests authorization for the marked callback action.
        /// </summary>
        /// <param name="filterContext">The filter context, which encapsulates information for using <see cref="T:Revalee.Client.Mvc.CallbackActionAttribute" />.</param>
        /// <exception cref="T:System.ArgumentNullException">The <paramref name="filterContext" /> parameter is null.</exception>
        public void OnAuthorization(AuthorizationFilterContext filterContext)
        {
            if (filterContext == null)
            {
                Debug.Fail("Revalee Error", $"Revalee::{nameof(AuthorizationFilterContext)} parameter of {nameof(OnAuthorization)} method of {nameof(CallbackActionAttribute)} is null");

                throw new ArgumentNullException(nameof(filterContext));
            }

            _revalee       = (IRevaleeRegistrar)filterContext.HttpContext.RequestServices.GetService(typeof(IRevaleeRegistrar));
            _callBackState = (ICallbackStateCache)filterContext.HttpContext.RequestServices.GetService(typeof(ICallbackStateCache));

            if (filterContext.HttpContext == null ||
                filterContext.HttpContext.Request == null ||
                !_revalee.ValidateCallback(filterContext.HttpContext))   // (filterContext.HttpContext.Request))
            {
                filterContext.Result = new UnauthorizedResult();
            }
        }
        public Task Invoke(HttpContext context)
        {
            try
            {
                TaskManifest _manifest = LoadedManifest(context).Result;

                if (context?.Request != null && _manifest != null)
                {
                    var             request  = context.Request;
                    RequestAnalysis analysis = _manifest.AnalyzeRequest(context.Request).Result;

                    if (analysis.IsRecurringTask)
                    {
                        ConfiguredTask taskConfig;
                        HttpStatusCode statusCode;

                        if (_manifest.TryGetTask(analysis.TaskIdentifier, out taskConfig))
                        {
                            if (request.Method == "POST")
                            {
                                if (_revalee.ValidateCallback(context))
                                {
                                    if (taskConfig.SetLastOccurrence(analysis.Occurrence))
                                    {
                                        _manifest.Reschedule(taskConfig).Wait();
                                        context.Items.Add(RouteKeys.IN_PROCESS_CONTEXT_KEY, BuildCallbackDetails(request, taskConfig.Identifier));
                                        context.Request.Path = new PathString(taskConfig.Url.AbsolutePath);

                                        goto Continue;
                                    }
                                    else
                                    {
                                        statusCode = HttpStatusCode.Accepted;
                                    }
                                }
                                else
                                {
                                    statusCode = HttpStatusCode.Unauthorized;
                                }
                            }
                            else
                            {
                                if (request.Method == "GET" || request.Method == "HEAD")
                                {
                                    if (request.Headers["Expect"] == "100-continue")
                                    {
                                        context.Response.StatusCode = (int)HttpStatusCode.Continue;
                                        goto Continue;
                                    }
                                    else
                                    {
                                        statusCode = HttpStatusCode.MethodNotAllowed;
                                    }
                                }
                                else
                                {
                                    statusCode = HttpStatusCode.NotImplemented;
                                }
                            }
                        }
                        else
                        {
                            statusCode = HttpStatusCode.NoContent;
                        }

                        context.Response.StatusCode = (int)statusCode;
                        return(context.Response.WriteAsync(""));
                    }
                }
            }
            catch (Exception ex)
            {
            }

Continue:
            return(_next(context));
        }