Example #1
0
        private void Handler_DreamMessage(DreamMessage request)
        {
            try {
                // grabbing context from FeatureChain (must remove it again from env before env completes, so that it doesn't get disposed)
                if (_context.IsTaskEnvDisposed)
                {
                    throw new InvalidOperationException("cannot go to next feature state with disposed context");
                }
                _context.AttachToCurrentTaskEnv();

                // check if request is authorized for service
                if ((_stage.Access != DreamAccess.Public) && (_context.Feature.Service.Self != null) && (_stage.Access > _context.Feature.Service.DetermineAccess(_context, request)))
                {
                    request.Close();
                    _log.WarnFormat("access '{0}' to feature '{1}' denied for '{2}'",
                                    _stage.Access,
                                    _context.Uri.AsPublicUri(),
                                    request.Headers.DreamService
                                    );
                    if (_log.IsDebugEnabled)
                    {
                        _log.DebugFormat("with service keys:");
                        foreach (DreamCookie c in request.Cookies)
                        {
                            if (c.Name != "service-key")
                            {
                                continue;
                            }
                            _log.DebugFormat("  path: {0}, key: {1}", c.Path, c.Value);
                        }
                    }

                    // removing context from env so that shared context is not disposed
                    _context.DetachFromTaskEnv();
                    _response.Return(DreamMessage.Forbidden("insufficient access privileges"));
                }
                else
                {
                    // invoke handler
                    Result <DreamMessage> inner = new Result <DreamMessage>(_response.Timeout, TaskEnv.Current).WhenDone(delegate(DreamMessage value) {
                        // removing context from env so that shared context is not disposed
                        _context.DetachFromTaskEnv();

                        // forward result to recipient
                        _response.Return(value);
                    }, delegate(Exception exception) {
                        // removing context from env so that shared context is not disposed
                        _context.DetachFromTaskEnv();

                        // forward exception to recipient
                        _response.Throw(exception);
                    });
                    _stage.Invoke(_context, request, inner);
                }
            } catch (Exception ex) {
                _response.Throw(ex);
            }
        }
Example #2
0
        //--- Constructors ---

        /// <summary>
        /// Create a new instance for a <see cref="DreamStatus.Forbidden"/> condition.
        /// </summary>
        /// <param name="message">Text message to use for <see cref="Exception.Message"/> and the internal <see cref="DreamMessage"/>.</param>
        public DreamForbiddenException(string message) : base(DreamMessage.Forbidden(message), message)
        {
        }