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); } }
//--- 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) { }